This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28388D:I2C 多字节读取问题(在调试中工作,在正常运行中失败)

Guru**** 2873750 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1627536/tms320f28388d-i2c-multi-byte-read-issue-works-in-debug-fails-in-normal-run

器件型号: TMS320F28388D

大家好:

我正在不使用 FIFO 的情况下实现多字节 I2C 寄存器读取。 我编写了以下函数来从从器件读取多个字节:

#define CMI2C_DELAY_IN_US = 50;

//
// cmi2c 单个寄存器读取
//
uint8_t cmi2c_ReadReg (uint8_t slave、uint8_t reg、uint8_t data[]、uint8_t len)

  uint8_t d = 1、err;

  //等待总线空闲
  Err = cmi2c_isMasterBusy ();
  if (I2C_OK!= err)
  {
    返回错误;
  }

  //发送从设备地址
  I2C_setSlaveAddress (I2C0_BASE、SLAVE、I2C_MASTER_WRITE);

  I2C_putMasterData (I2C0_BASE、reg);
  I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);

  //等待总线空闲
  Err = cmi2c_isMasterBusy ();
  if (I2C_OK!= err)
  {
    返回错误;
  }
  DEVICE_DELAY_US (CMI2C_DELAY_IN_US);
  //读取第一个字节
  I2C_setSlaveAddress (I2C0_BASE、SLAVE、I2C_MASTER_READ);
  I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_RECEIVE_START);

  //等待总线空闲
  Err = cmi2c_isMasterBusy ();
  if (I2C_OK!= err)
  {
    返回错误;
  }

  DATA[0]= I2C_getMasterData (I2C0_BASE);
  DEVICE_DELAY_US (CMI2C_DELAY_IN_US);

  对于(;d < len - 1;d++)
  {
    I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_RECEIVE_CONT);

    //等待总线空闲
    Err = cmi2c_isMasterBusy ();
    if (I2C_OK!= err)
    {
      返回错误;
    }

    DATA[d]= I2C_getMasterData (I2C0_BASE);
    DEVICE_DELAY_US (CMI2C_DELAY_IN_US);
  }
  DEVICE_DELAY_US (CMI2C_DELAY_IN_US);
  //读取最后一个字节
  I2C_setMasterConfig (I2C0_BASE、I2C_MASTER_CMD_BURST_RECEIVE_FINISH);

  //等待总线空闲
  Err = cmi2c_isMasterBusy ();
  if (I2C_OK!= err)
  {
    返回错误;
  }

  DATA[len - 1]= I2C_getMasterData (I2C0_BASE);
  返回 I2C_OK;
}

问题:

  • 在逻辑分析仪上、I2C 事务看起来正确(起始,地址,重复启动和数据字节均正常)。

  • 但是、存储在缓冲区data[] () 中的数据组织不正确、有时甚至不正确。

  • 有趣的是、代码完美地运行 调试模式 、但在中失败或给出不一致的结果 正常运行模式

 

这个代码中的问题是什么。

 

 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Savan:

    让我看看这件事,明天就回到你这里。

    此致、

    Aishwarya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Savan、

    尤其是在执行突发读取操作时、务必先等待数据准备就绪、然后再读取数据。 在调试模式下、您会引入自然延迟、使 I2C 模块可以完成接收操作、但可能是 过时的数据。 明白了这一点、您是否 也能在读取数据之前添加 DEVICE_DELAY_US。 您可以使用数据表/示波器快照作为开始延迟量的参考点。  

    BTW “CMI2C_DELAY_IN_US"宏“宏不应包含等号。  

    此致、

    Aishwarya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我 通过阅读文档解决了这个问题、有一个 注意事项。  

                                              注释

    当读取 I2CMCS 寄存器来检查 BUSY 位时、还会读取 ADRACK 和 DATACK 位、因为这些位在寄存器读取时被清除、如果不在每次读取寄存器时检查这些位、则状态可能会丢失。

    因此、我意外地清除了所有 I2CMCS 位 并提供了不匹配的数据。 所以、我更改了代码、结果成功了。