初学i2c接口,编写个程序i2c读器件ACK 如:"ack=i2c_SendData(0x46);“反复尝试了3个I2C器件,始终只有MPU6050(Addr:0xD0)返回ACK为低电平。 反复尝试N次后使本人失去了学习的勇气,太诡异了。请各位大神指教问题所在。谢谢! 三个器件为 MPU6050(Addr:0xD0) ,BH1750(Addr:0x46) ,24c02(Addr:0xA0) 其中 24c02(Addr:0xA0) 与 MPU6050(Addr:0xD0)器件确定是好的,使用STM32标准库编程,器件可以正常使用。 代码如下 : void I2C_Test(void) { u8 ack=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(); } /*** 以下是模拟i2c程序 ***/ 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); } 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) { unsignedcharack=0x44,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 readdata. Delay_us(3); i2c1_SCL_Out_Low;//start the next bit data totransmit. } 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; }
|