STM32F030 AT24C02通信问题
硬件和软件都试过了,串口出来的数据都是一样,有问题.用的代码都是网上的// 连续写N个字节
bool I2C2_Write_NByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t* buf, uint16_t len)
{
uint16_t i;
if(!I2C2_Start())return false;
I2C2_Send_Byte(SlaveAddress);//发送设备地址+写信号
if(!I2C2_Wait_Ack()){I2C2_Stop(); return false;}
I2C2_Send_Byte(REG_Address);
if(!I2C2_Wait_Ack()){I2C2_Stop(); return false;}
for(i=0; i<len; i++)
{
I2C2_Send_Byte(buf);
if(i<len-1)
{
if(!I2C2_Wait_Ack()){I2C2_Stop(); return false;}
}
}
I2C2_Stop();
return true;
}
// 连续读N个字节
bool I2C2_Read_NByte(uint8_t SlaveAddress, uint8_t REG_Address, uint8_t* buf, uint16_t len)
{
uint16_t i;
if(!I2C2_Start())return false;
I2C2_Send_Byte(SlaveAddress);//发送设备地址+写信号
if(!I2C2_Wait_Ack()){I2C2_Stop(); return false;}
I2C2_Send_Byte(REG_Address);
if(!I2C2_Wait_Ack()){I2C2_Stop(); return false;}
if(!I2C2_Start())return false;
I2C2_Send_Byte(SlaveAddress | 1); // 读操作
if(!I2C2_Wait_Ack()){I2C2_Stop(); return false;}
for(i=0; i<len; i++)
{
buf = I2C2_Read_Byte();
if(i<len-1)
{
I2C2_Ack();
}
}
I2C2_NAck();
I2C2_Stop();
return true;
}
示波器看一下波形吧,应该是你软件模拟I2C的问题。 建议用逻辑分析仪抓取SDA和SCL的时序,看看是否符合I2C协议的要求。 看一下 SCL和SDA的波形 你写是用page write的吧
你先了解一下page size
然后写完一个page要等10ms, 才能再写 我有一个AT24C64的 你要吗? 24C02的速度比较慢,时序上要比较大的延时时间。 最直接的方法是用示波器或逻辑分析仪看看波形,这样能确定是不是真正写进去了还是串口读出的数据是否是正常的。
页:
[1]