在战舰开发板上已写好硬件I2C,用24C02测试没问题。但是用逻辑分析仪看协议发现,读一个字节这个函数要连续读取3个字节数据才返回第一个字节数据,已经改了好几次但依旧没有发现问题。请指导下,谢谢
读一个字节代码如下:(由于仓促,没有在程序中加入过时间返回处理)
[mw_shl_code=c,true]//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 date=0;
IIC_Start(); [/mw_shl_code]
[mw_shl_code=c,true] while((I2C_ReadRegister(I2C2,I2C_Register_SR1)&(1<<0))==0); //等待起始信号发送完成
IIC_Send_Byte(0XA0); //发送器件地址0XA0,写数据
while((I2C_ReadRegister(I2C2,I2C_Register_SR1)&(1<<1))==0); //等待地址发送完成
I2C2->SR2; //这里必须要读一次 SR2才能清除地址发送标记
IIC_Send_Byte(ReadAddr%256); //发送低地址
while((I2C_ReadRegister(I2C2,I2C_Register_SR1)&(1<<2))==0); //字节发送结束 起始信号硬件清除标记
IIC_Start();
while((I2C_ReadRegister(I2C2,I2C_Register_SR1)&(1<<0))==0); //等待起始信号发送完成 写入数据硬件清除标记
IIC_Send_Byte(0XA1); //进入接收模式
while((I2C_ReadRegister(I2C2,I2C_Register_SR1)&(1<<1))==0); //等待地址发送完成
I2C2->SR2; //这里必须要读一次 SR2才能清除地址发送标记
while((I2C_ReadRegister(I2C2,I2C_Register_SR1)&(1<<2))==0); //等待字节发送结束 起始信号硬件清除标记 停止信号硬件清除
I2C_AcknowledgeConfig(I2C2,DISABLE) ; //关闭应答
date=IIC_Read_Byte(); //读取缓存数据
IIC_Stop();//产生一个停止条件
return date;
}[/mw_shl_code]
逻辑分析仪波形图:
从波形看出要连续读取3个字节,程序测得数据读取才正确。可以修改程序让其在波形上只读取一个字节但是程序读取的数据不对。
战舰开发板硬件I2C读写24C02工程:
|