初學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; }
|