CC2541的IIC通讯,主机发送模式,I2CSTAT的一点疑问,麻烦大家帮忙看看,谢谢!
大家好!最近使用到IIC通讯,看了底层IIC的API,hal_i2c.c,存在一点疑问,麻烦大家帮看看。谢谢!
(1)使用的主发送模式,疑问是在那么在I2C_WRITE(*pBuf++)写操作后,寄存器I2CSTAT的状态值是0x28,还是0x30?
0x28是数据已经发送给从机,从机并应答;0x30是数据已经从I2CDATA中发送给从机。
而API驱动:hal_i2c.c的uint8 HalI2CWrite(uint8 len, uint8 *pBuf)函数,红色标记部分,它在写I2C_WRITE(*pBuf++);完成后,判断是否写进去是I2CSTAT 是先和mstDataAckW(0x28)比较,若不等,再和mstDataNackW(0x30)比较,若相等,则判断成功写入一个数据,len+1,。
疑问是:我们判断标准不应该是I2CSTAT的状态为0x28才能真正确定将数据写入从机吗?若按例层中,先为0x30,那什么时候为0x28呢?因为len+1操作后马上就写下一个数据了。所以我觉得代码这样先判断和0x30是否相等,若不等,再判断是否和0x28相等,若相等,则len+1。麻烦大家解答!谢谢!
uint8 HalI2CWrite(uint8 len, uint8 *pBuf)
{
if (i2cMstStrt(0) != mstAddrAckW)
{
len = 0;
}
for (uint8 cnt = 0; cnt < len; cnt++)
{
I2C_WRITE(*pBuf++);
if (I2CSTAT != mstDataAckW)
{
if (I2CSTAT == mstDataNackW)
{
len = cnt + 1;
}
else
{
len = cnt;
}
break;
}
}
I2C_STOP();
return len;
}
好久没看IIC协议了,给你个链接参考下
http://www.zlgmcu.com/philips/iic/xuanxing/I2Cgiufan.pdf