|
I2C连续读取在库中函数为://--------------------------------------------------------------------
void I2CMBulkRd(uCHAR i2cx,uSHORT cnt, uCHAR *rbuf)
{
while (cnt--)
{
pI2CxCtrl[i2cx]->I2C_DATA_CMD=I2CRD;
while (!(pI2CxCtrl[i2cx]->I2C_STATUS&I2CSTS_RFNE)); //rx fifo empty
*rbuf++=pI2CxCtrl[i2cx]->I2C_DATA_CMD;
}
}
//--------------------------------------------------------------------
但调用此程序连续读取从机数据时,每次读数据都会在产生一个Read,时序如下:
红字为从机产生,假设读取4数据。
Write | Reg_add+ACK | Read | Data+NAK | Read | Data+NAK |Read | Data+NAK |Read | Data+NAK
此读取数据在用于连续读取时,可能会产生数据错误。
将I2CMBulkRd()函数中内容修改为下:
//--------------------------------------------------------------------
void I2CMBulkRd(uCHAR i2cx,uSHORT cnt, uCHAR *rbuf)
{
pI2CxCtrl[i2cx]->I2C_DATA_CMD=I2CRD;
while (cnt--)
{
if(0 == cnt)
{
while (!(pI2CxCtrl[i2cx]->I2C_STATUS&I2CSTS_RFNE)); //rx fifo empty
*rbuf++=pI2CxCtrl[i2cx]->I2C_DATA_CMD;
}
else
{
pI2CxCtrl[i2cx]->I2C_DATA_CMD=I2CRD;
while (!(pI2CxCtrl[i2cx]->I2C_STATUS&I2CSTS_RFNE)); //rx fifo empty
*rbuf++=pI2CxCtrl[i2cx]->I2C_DATA_CMD;
}
}
}
//--------------------------------------------------------------------
用此修改函数进行连续读取时,时序如下:
红字为从机产生,假设读取4数据。
Write | Reg_add+ACK | Read | Data+ACK | Data+ACK | Data+ACK | Data+NAK
可实现I2C的数据连续读取。
|
|