请教KE06的IIC页写24c16之间的延时问题

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

请教KE06的IIC页写24c16之间的延时问题

1,080 Views
旭余朱
Contributor III

24C16的datasheet中说明单字节写数据之间或页写之间需要最大为5ms的延时时间。

QQ浏览器截图20181016150833.png

于是我在页写完成后固定延时了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;
}

Tags (2)
0 Kudos
Reply
1 Reply

882 Views
kerryzhou
NXP TechSupport
NXP TechSupport

楼主你好!

    你这么操作是一直都卡在:

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!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos
Reply