ads1115 IIC接口 stm32 解决
生活随笔
收集整理的這篇文章主要介紹了
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 0xf0void ADS1115Config_A(uint8_t LCMD,uint8_t HCMD);//?a??ê?íùads1115à?D′??á?μ? void ADS_1115PointRegister_A(void);//?aê????ò90 00 ??′??÷μ? void SetThresHold_A(uint16_t L_TH,uint16_t H_TH);// uint16_t ReadAD_A(int x);//?aê??áè??3ò??·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 /* D′????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 解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Istio架构详解
- 下一篇: 怎么把苹果手机通讯录导入华为手机_如何将