普誠創智(成都)科技有限公司-论坛

标题: PT32C302中怎么使用I2C连续读取数据? [打印本页]

作者: Youke_Yang    时间: 2017-9-22 09:36
标题: PT32C302中怎么使用I2C连续读取数据?
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的数据连续读取。







作者: James_Jiang    时间: 2017-9-22 17:06
GOOD




欢迎光临 普誠創智(成都)科技有限公司-论坛 (https://princeton.com.cn/) Powered by Discuz! X3.2