24C16的datasheet中说明单字节写数据之间或页写之间需要最大为5ms的延时时间。
于是我在页写完成后固定延时了5ms。5ms为EEPROM的最大写周期时间,实际上不一定需要5ms,因为我程序的原因,有五次页写操作必须要在20ms内完成,如果都延时5ms加上其他程序整个时间就会超过20ms,造成程序错乱,因此我想采用页写完成后不断给EEPROM发送它的设备地址,看是否得到EEPROM的应答的方式来确定EEPROM是否准备好下次页写。但是我通过读I2CX_S里的RXAK,结果程序死在循环中给从机发送设备地址函数中的
while (((I2C_GetStatus(pI2Cx)&I2C_S_IICIF_MASK) != I2C_S_IICIF_MASK)
&& (u32Timeout<I2C_WAIT_STATUS_TIMEOUT))
{
u32Timeout ++;
}
里。
具体相关程序如下,请问有什么问题,或者有什么更好检测EEPROM是否可以进行下次写操作的方法,烦请告知,不胜感激。
/* 延时等待程序,程序死在了第二次do while循环中,具体位置在上面的代码中 */
void EE_Wait(void)
{
do{
I2C_Start(I2C0); //起始信号
I2C_WriteOneByte(I2C0, 0xA0); //发送设备地址等待应答
}while((I2C0->S && 0x01)) //读取RXAK,EEPROM应答时为0,,退出循环,表示可以下次写操作
I2C_Stop(I2C2); //停止信号
}
uint8_t I2C_WriteOneByte(I2C_Type *pI2Cx, uint8_t u8WrBuff)
{
uint32_t u32Timeout;
uint8_t u8ErrorStatus;
u32Timeout = 0;
u8ErrorStatus = 0x00;
while (((I2C_GetStatus(pI2Cx)&I2C_S_TCF_MASK) != I2C_S_TCF_MASK)
&& (u32Timeout<I2C_WAIT_STATUS_TIMEOUT))
{
u32Timeout ++;
}
if (u32Timeout >= I2C_WAIT_STATUS_TIMEOUT)
{
u8ErrorStatus |= I2C_ERROR_NO_WAIT_TCF_FLAG;
return u8ErrorStatus;
}
I2C_TxEnable(pI2Cx);
I2C_WriteDataReg(pI2Cx,u8WrBuff);
u32Timeout = 0;
while (((I2C_GetStatus(pI2Cx)&I2C_S_IICIF_MASK) != I2C_S_IICIF_MASK)
&& (u32Timeout<I2C_WAIT_STATUS_TIMEOUT))
{
u32Timeout ++;
}
if (u32Timeout >= I2C_WAIT_STATUS_TIMEOUT)
{
u8ErrorStatus |= I2C_ERROR_NO_WAIT_IICIF_FLAG;
return u8ErrorStatus;
}
/* clear IICIF flag */
I2C_ClearStatus(pI2Cx,I2C_S_IICIF_MASK);
if (I2C_GetStatus(pI2Cx) & I2C_S_RXAK_MASK)
{
u8ErrorStatus |= I2C_ERROR_NO_GET_ACK;
}
return u8ErrorStatus;
}
楼主你好!
你这么操作是一直都卡在:
while (((I2C_GetStatus(pI2Cx)&I2C_S_IICIF_MASK) != I2C_S_IICIF_MASK)
&& (u32Timeout<I2C_WAIT_STATUS_TIMEOUT))
并且不往下运行了是吗?
你有没有顺便测试下I2C bus总线,看看卡死的时候,总线上的波形是什么样的呢?
另外,debug查询下,看看I2C寄存器,状态上面其他位的情况,你可以把总线波形和寄存器结果都贴出来看看。
关于外部EEPROM是否完成了写,就要读出来看看结果是否正确。
我认为,你也可以不加延时,直接在20ms内写完你要写的数据,然后读出来看看,数据是否正确。
如果多块芯片,数据都能在不加延时的情况正确,说明也是可以的。手册上面定义的是5ms,实际上肯定是用不了那么多时间的。
Have a great day,
Kerry
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------