初学i2c接口,编写个程序i2c读器件ACK 如:"ack=i2c_SendData(0x46);“反复尝试了3个I2C器件,始终只有一个返回ACK为低电平。 反复尝试后使本人失去了学习的勇气,太诡异了。请各位大神指教问题所在。谢谢! 三个器件为 MPU6050(Addr:0xD0) ,BH1750(Addr:0x46) ,24c02(Addr:0xA0)
其中 24c02(Addr:0xA0) 与 MPU6050(Addr:0xD0)器件确定是好的,使用STM32标准库编程,器件可以正常使用。
代码如下 : void I2C_Test(void) { u8ack=0x55; i2c_Start();
// ack=i2c_SendData(0xA0); // printf("\n24c020(0xA0) Ack :0x%02x\n",ack);
// ack=i2c_SendData(0xD0); // printf("\nMPU6050(0xD0) Ack :0x%02x\n",ack);
ack=i2c_SendData(0x46); printf("\nBH1750(0x46) Ack :0x%02x\n",ack); i2c_Stop(); } void i2c_Start(void) { i2c1_SDA_Out_High; i2c1_SCL_Out_High; Delay_us(3); i2c1_SDA_Out_Low; Delay_us(3); i2c1_SCL_Out_Low; Delay_us(3); } /*** 以下是模拟i2c程序 ***/ void i2c_Stop() { i2c1_SDA_Out_Low; i2c1_SCL_Out_Low; Delay_us(3); i2c1_SCL_Out_High; Delay_us(3); i2c1_SDA_Out_High; Delay_us(3); } u8 i2c_SendData(u8 Dat) { unsignedchar ack,mask; i2c1_SCL_Out_Low; for(mask=0x80;mask!=0;mask>>=1) { if(0==(mask&Dat)) i2c1_SDA_Out_Low; else i2c1_SDA_Out_High; Delay_us(3); i2c1_SCL_Out_High;//waiting for the Slave read data. Delay_us(3); i2c1_SCL_Out_Low;//start the next bit data to transmit. } i2c1_SDA_Out_High; Delay_us(3); i2c1_SCL_Out_High; i2c1_SDA_InMode; Delay_us(3); ack=(GPIOB->IDR & GPIO_Pin_7); i2c1_SCL_Out_Low; i2c1_SDA_OutMode; returnack; } |