標題: STM32 模擬I2C學習問題,發送3個器件地址,只一個回應 [打印本頁]
作者: ≯叁界∝爵ャ 時間: 2020-2-10 00:04
標題: STM32 模擬I2C學習問題,發送3個器件地址,只一個回應
初學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;
}
-
搜狗截圖20年02月09日2330_1.jpg
(83.73 KB, 下載次數: 76)
下載附件
2020-2-10 00:04 上傳
-
-
Test.7z
2020-2-10 01:44 上傳
點擊文件名下載附件
175.54 KB, 下載次數: 3
作者: qsssuv 時間: 2020-2-10 14:57
1.線接對了沒有;2.速率是否符合要求;3.給你發一下我的這個發送函數你對照著看看吧
bit I2C_Write(unsigned char dat)
{
bit ack;
unsigned char pos;
for (pos=0x80; pos; pos>>=1)
{
if (dat & pos)
I2C_SDA = 1;
else
I2C_SDA = 0;
I2C_Delay(0);
I2C_SCL = 1;
I2C_Delay(1);
I2C_SCL = 0;
I2C_Delay(0);
}
I2C_SDA = 1; //釋放SDA
I2C_Delay(0);
I2C_SCL = 1;
I2C_Delay(0);
ack = I2C_SDA; //
I2C_Delay(0);
I2C_SCL = 0;
I2C_Delay(1);
return !ack;
}
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |