标题: 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)
-
-
Test.7z
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.51hei.com/bbs/) |
Powered by Discuz! X3.1 |