• 易迪拓培训,专注于微波、射频、天线设计工程师的培养
首页 > CST > CST使用问答 > CC2541的IIC通讯,主机发送模式,I2CSTAT的一点疑问,麻烦大家帮忙看看,

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

录入:edatop.com     点击:

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

申明网友回复良莠不齐,仅供参考。如需专业解答,请学习易迪拓培训专家讲授的CST视频培训教程

上一篇:postprocessing the maxwell stress tensor in CST
下一篇:CST-MWS Separating shapes after adding them and saving

CST培训课程推荐详情>>

  网站地图