微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2541的IIC通讯,主机发送模式,I2CSTAT的一点疑问,麻烦大家帮忙看看,谢谢!

CC2541的IIC通讯,主机发送模式,I2CSTAT的一点疑问,麻烦大家帮忙看看,谢谢!

时间:10-02 整理:3721RD 点击:

大家好!最近使用到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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top