AnsweredAssumed Answered

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

Question asked by 旭余 朱 on Oct 16, 2018
Latest reply on Oct 17, 2018 by Kerry Zhou

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;
}

Outcomes