ads1115 IIC接口 stm32 解决

 

 

 

 

 
 
 
#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	  0xf0



void 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上设置的频率太高了,只要把延时时间增长,频率一下来,在读取寄存器的时候就不会错了

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值