#include "stm32f0xx.h"
#define  WR_REG 0x90
#define  RE_REG 0x91/***********************************??????**********************************************/
#define  DATA_REG  0x00     //???????
#define  CONF_REG  0x01     //????????
#define  LOTH_REG  0x02     //???????
#define  HITH_REG  0x03     //???????/***********************?????*************************************************************
*|  OS | MUX2 | MUX1 | MUX0 | PGA2 | PGA1 | PGA0 | MODE  |------HCMD
*|  DR2| DR1  | DR0  | COMP_MODE | COMP_POL | COMP_LAT |  COMP_QUE1 | COMP_QUE0 |-----LCMD
***********************************************************************************************/
#define  HCMD1    0x64   // ? +-4.096??  ????  01000100b
#define  LCMD1    0xf0void ADS1115Config_A(uint8_t LCMD,uint8_t HCMD);//Õâ¸öÊÇÍùads1115ÀïдָÁîµÄ
void ADS_1115PointRegister_A(void);//ÕâÊÇÖ¸Ïò90  00  ¼Ä´æÆ÷µÄ
void SetThresHold_A(uint16_t L_TH,uint16_t H_TH);//
uint16_t ReadAD_A(int x);//ÕâÊǶÁȡijһ·adµÄÖµ
#include"ads1115_2.h"
#include"delay.h"
#include"iic.h"
#include "JLX12864.h"
void ADS1115Config_A(uint8_t LCMD,uint8_t HCMD);
// while (1) i2c_CheckDevice(0x48); Initdata[0] = WR_REG; // ??0x90 ??ADR?? ???? Initdata[1] = 0x01;// ??0x01 ???????
Initdata[2] = HCMD; // ??0x64 ??????
Initdata[3] = LCMD; // ??0xf0 ??????I2C_SCL_1();i2c_Start();
for(i=0;i<4;i++)
{do{ i2c_SendByte(Initdata[i]);delay_us(20);} while(i2c_WaitAck());//1
} i2c_Stop();
}
void ADS_1115PointRegister_A(void)
{
uint8_t i=0;
uint8_t InitData[2];InitData[0] = WR_REG; // ??0x90 ????
InitData[1] = DATA_REG;// ??0x00 ???????????
I2C_SCL_1();
i2c_Start();for(i=0;i<2;i++){i2c_SendByte(InitData[i]);delay_us(10);}i2c_Stop();
}
void SetThresHold_A(uint16_t L_TH,uint16_t H_TH){
I2C_SCL_1();
i2c_Start();
i2c_SendByte(WR_REG);
i2c_SendByte(LOTH_REG); //???????
i2c_SendByte((L_TH>>8));
i2c_SendByte(L_TH);
i2c_Stop();
i2c_Start();
i2c_SendByte(WR_REG);
i2c_SendByte(HITH_REG); //???????
i2c_SendByte((H_TH>>8));
i2c_SendByte(H_TH);
i2c_Stop();
}
uint16_t ReadAD_A(int x)
{uint16_t Data[2]={0,0};
if(x==1)ADS1115Config_A(0xf0,0x52);
if(x==2)ADS1115Config_A(0xf0,0x62);
if(x==3)ADS1115Config_A(0xf0,0x72);
if(x==0)ADS1115Config_A(0xf0,0x42);
I2C_SCL_1();
i2c_Start();
i2c_SendByte(WR_REG); //???????i2c_SendByte(DATA_REG);
i2c_Stop();
I2C_SCL_0();
I2C_SCL_1();
i2c_Start();
i2c_SendByte(RE_REG); //?
Data[0] = i2c_ReadByte();
Data[1] = i2c_ReadByte();
i2c_Stop();
Data[0] = Data[0]<<8 | Data[1];return (Data[0]); //&0x7fff
}
#ifndef _BSP_I2C_GPIO_H
#define _BSP_I2C_GPIO_H
#include <inttypes.h>
#include "delay.h"
#define I2C_WR 0 /* д¿ØÖÆbit */
#define I2C_RD 1 /* ¶Á¿ØÖÆbit */
#define GPIO_PORT_I2C GPIOB
#define GPIO_SCL_PORT_I2C GPIOA
#define GPIO_SDA_PORT_I2C GPIOA
#define RCC_SCL_PORT RCC_AHBPeriph_GPIOA
#define RCC_SDA_PORT RCC_AHBPeriph_GPIOA
#define I2C_SCL_PIN GPIO_Pin_5
#define I2C_SDA_PIN GPIO_Pin_6
#if 1
#define I2C_SCL_1()
GPIO_SetBits(GPIO_SCL_PORT_I2C, I2C_SCL_PIN) /* SCL = 1 */#define I2C_SCL_0() GPIO_ResetBits(GPIO_SCL_PORT_I2C, I2C_SCL_PIN) /* SCL = 0 */#define I2C_SDA_1() GPIO_SetBits(GPIO_SDA_PORT_I2C, I2C_SDA_PIN) /* SDA = 1 */#define I2C_SDA_0() GPIO_ResetBits(GPIO_SDA_PORT_I2C, I2C_SDA_PIN) /* SDA = 0 */#define I2C_SDA_READ() GPIO_ReadInputDataBit(GPIO_SDA_PORT_I2C, I2C_SDA_PIN) /* ¶ÁSDA¿ÚÏß״̬ */
#else
#define I2C_SCL_1() GPIO_PORT_I2C->BSRR = I2C_SCL_PIN /* SCL = 1 */
#define I2C_SCL_0() GPIO_PORT_I2C->BRR = I2C_SCL_PIN /* SCL = 0 */
#define I2C_SDA_1() GPIO_PORT_I2C->BSRR = I2C_SDA_PIN /* SDA = 1 */
#define I2C_SDA_0() GPIO_PORT_I2C->BRR = I2C_SDA_PIN /* SDA = 0 */
#define I2C_SDA_READ() ((GPIO_PORT_I2C->IDR & I2C_SDA_PIN) != 0)
#endif
void i2c_CfgGpio(void);
void i2c_Start(void);
void i2c_Stop(void);
void i2c_SendByte(uint8_t _ucByte);
uint8_t i2c_ReadByte(void);
uint8_t i2c_WaitAck(void);
void i2c_Ack(void);
void i2c_NAck(void);
uint8_t i2c_CheckDevice(uint8_t _Address);
void i2c_CfgGpio(void);
void iictest(void);
#endif
static void i2c_Delay(void)
{
uint8_t i;
for (i = 0; i < 10; i++);
}
void i2c_Start(void){
I2C_SDA_1();
I2C_SCL_1();
i2c_Delay();
I2C_SDA_0();
i2c_Delay();
I2C_SCL_0();
i2c_Delay();
}
void i2c_Stop(void){
I2C_SDA_0();
I2C_SCL_1();
i2c_Delay();
I2C_SDA_1();
}
void i2c_SendByte(uint8_t _ucByte)
{
uint8_t i;
for (i = 0; i < 8; i++)
{
if (_ucByte & 0x80){I2C_SDA_1();}
else{I2C_SDA_0();
}
i2c_Delay();
I2C_SCL_1();
i2c_Delay();
i2c_Delay();
I2C_SCL_0();
}

在用stm32f030进行程序开发的过程中,我们遇到了ads1115测量电流电压的需要,遇到了3个问题,现与诸君分享

首先:ads1115联系不上,返回值为65535,这是因为iic没连上,写也没写进去,读的是两个上拉的高电平,所以是65536

解决方案:接上逻辑分析仪,看看有没有数据的发射和接受,注意,为了让分析仪认识你发送的数据,每一个发射之后要加一个ACK,这个是1115返回给你的,所以一定不要太较真,给空脚发送90  01  64  80,然后一读取,嗯,不是四个数据,这还是因为没接1115,所以这一步只要接到数据,就算有了

然后:虽然有了数据,但是1115接受的时候不对,直接把我们的时序打乱了

这是因为1115发送的ack和我们的时序混在一起了,这时候我们只需要在发送之后加一个while(wait_ack());之后就好了,因为这样就能让1115来的ack被我们接受,一面检测了ack,一面避免了干扰

第三:接受的数据总是在跳,很多时候不是0就是最大

这是因为我们在scl上设置的频率太高了,只要把延时时间增长,频率一下来,在读取寄存器的时候就不会错了

ads1115 IIC接口 stm32 解决相关推荐

  1. stm32 iic接口 进入busy_STM32通过IIC接口读取JY61模块MPU6050陀螺仪芯片数据核心程序...

    1 简述 最近,想学角度融合算法在网上买一个JY61的模块.他们家的模块用起来还不错.模块分为串口通讯和IIC通讯的.串口读取数据他们家有例程,我就不说了.想分享给大家这个模块的IIC是怎么去读取MP ...

  2. stm32如何读取并口_STM32 的并口总线的所有接口类型解决方法

    STM32 的并口总线的所有接口类型解决方法 STM32的并口总线支持NOR, SRAM, PSRAM,NAND接口,本文以PSRAM为例实现并口的同步非复用, 异步复用和异步非复用操作!以STM32 ...

  3. STM32F407单片机移植MS5611气压计(基于IIC)---同时解决温度低于20度时计算得到的大气压错误的问题

    最近一个工程项目需要使用MS5611气压计,就花时间研究了一下,发现网上很多都是基于STM32F103单片机的MS5611气压计源程序,当移植到STM32F407时发现采集的大气压力和温度值不对,同时 ...

  4. D3--FPGA IIC接口通信2022-12-05

    1.IIC简介 1.1 IIC概述 IIC即 Inter-Integrated Circuit(集成电路总线),是由 Philips 半导体公司在八十年代初设计出来的一种简单.双向.二线制总线标准.多 ...

  5. lkt芯片接口调试建议-iic接口

    本文主要介绍使用STM32芯片 IO模拟方式调试IIC接口LKT加密芯片时需要注意的问题点.可能有人会说我之前操作过XXXX IIC接口的芯片,IIC接口没什么好介绍的.其实不然如果IO模拟的IIC程 ...

  6. win7计算机不支持此接口,win7系统IIS服务器启动失败显示不支持此接口的解决方法...

    很多小伙伴都遇到过 出错表现为以下几点: 1.World Wide Web Publishing 服务在请求配置数据库更改通知时遇到问题.数据域包含错误号. 2.初始化 World Wide Web ...

  7. 基于FPGA实现IIC接口(EEPROM)

    1 IIC应用领域 在嵌入式系统开发过程中,IIC占据非常重要的地位.IIC通讯接口能到搭载较多的从设备,从而实现与多个从设备进行通讯,在板级通讯中是一种比较常用的通讯接口.笔者通过IIC接口实现FP ...

  8. python arduino i2c1602_Arduino 将1602液晶显示屏改造为IIC接口

    原来的1602是这样的: image.png 连接到Arduino上需要接好多线,于是买了块IIC的板子改成IIC接口,就是这货: 由于Arduino的I/O口数量有限,如果直接用Arduino的I/ ...

  9. 利用51单片机+0.96寸iic接口oled显示图片或动图

    利用51单片机+0.96寸iic接口oled显示图片或动图 前言:之前讲过如何使用oled显示数字以及字符,但并未讲述如何显示BMP格式的图片, 这篇将在之前的基础上加以封装一些函数用来显示图片 硬件 ...

最新文章

  1. Android之Xposed框架完全使用指南
  2. Python基础 列表的详解(纯干货)
  3. .NET Core中文分词组件jieba.NET Core
  4. 男科医生到底有多不正经… | 今日最佳
  5. node.js 实现扫码二维码登录
  6. C++ 运算符重载规则
  7. 日语学习-多邻国-人
  8. openstarck安装指南(图文详解,超小白版本)
  9. 穿越计算机的迷雾--读书笔记五
  10. 穿越时空—智慧城市大数据可视化分析决策系统
  11. mysql sql多个like性能_一个sql很多个not like的简化语句
  12. 因特尔显卡自定义分辨率_事实:在新版本的“英特尔高清图形控制面板”中设置自定义方法...
  13. 如何将mac中文输入法(搜狗等)设置成默认输入法
  14. 80后小学计算机课上的游戏,80后最值得回味的15个经典课间游戏(组图)
  15. 最新架构amd服务器cpu,2015年或新变化?AMD将专注高性能架构
  16. WPF桌面应用实例(二):写一个扫雷游戏
  17. CTF中常见编码总结
  18. 开学了,献给就读IT相关专业的本科新生们
  19. 【云原生之Docker实战】使用Docker部署MrDoc个人在线文档系统
  20. A. 【UNR #2】积劳成疾

热门文章

  1. 小程序 VS 公众号、APP的区别在哪?
  2. 基于python将txt文件数据导出至excel中
  3. 杰里之开 开 K 歌宝或混响模式,检测 MIC 能量小时,关 MIC处理方法【篇】
  4. Postman接口测试基础和实战(1)
  5. OPENGL笔记(3)——shader
  6. 自然语言处理——word2vec项目实战—— Word2VEec理论基础
  7. 垃圾收集器与Java编程(转载)
  8. css背景图片(第五次课)
  9. JDBC连接之Oraclel数据库
  10. C#自动生成 中文随机名字