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.

[参考译文] TM4C1294NCPDT:TM4C1294XL I2C 仅在从器件地址、寄存器地址和数据之间存在延迟时工作

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1639278/tm4c1294ncpdt-tm4c1294xl-i2c-works-only-with-delay-between-slave-address-register-address-and-data

器件型号: TM4C1294NCPDT

我正在使用通过 I2C 与 MMC5983MA 传感器连接的 TM4C1294XL 微控制器。

我发现了一个问题、即仅当我在以下步骤之间引入手动延迟时、I2C 通信才起作用:
-从地址 (SA) 传输
-寄存器地址 (RA) 写入
-数据读/写操作

如果没有这些延迟、通信就会失败、我也无法从传感器接收到有效数据。 但是、当使用 SysCtlDelay () 插入延迟时、通信工作可靠。

我知道,理想情况下,正确使用 I2CMasterBusy () 和状态检查应消除手动延迟的需要。

我想了解:
1.为什么在这种情况下需要手动延迟?
2.我的 I2C 事务序列是否有问题?
3、什么是正确的推荐方法来处理这个没有延迟?

下面是供参考的代码片段。

电线数量
 I2CMasterSlaveAddrSet (I2C0_BASE、MMC5983_ADDR、FALSE);


  I2CMasterDataPut (I2C0_BASE、0x09);
  I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);


  while (I2CMasterBusy (I2C0_BASE)));


IF (I2CMasterErr (I2C0_BASE)!= I2C_MASTER_ERR_NONE)

  while (1);
}
  I2CMasterDataPut (I2C0_BASE、0x01);//开始测量
  I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);


  while (I2CMasterBusy (I2C0_BASE)));


   //可选:检查错误
  IF (I2CMasterErr (I2C0_BASE)!= I2C_MASTER_ERR_NONE)
  {
    while (1);//如果出错、请保持在这里
  }
}
https://drive.google.com/file/d/1SFb-i1wKHQM6kTE2YP5nL9e-F5KKqrNK/view?usp=sharing
 
上述逻辑分析仪捕获结果显示了 无延迟的 I2C 通信
 
2.有延迟
 
 I2CMasterSlaveAddrSet (I2C0_BASE、MMC5983_ADDR、FALSE);


  SysCtlDelay (g_ui32SysClock / 30000);


  I2CMasterDataPut (I2C0_BASE、0x09);
  I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);


  while (I2CMasterBusy (I2C0_BASE)));


 SysCtlDelay (g_ui32SysClock / 300000);


IF (I2CMasterErr (I2C0_BASE)!= I2C_MASTER_ERR_NONE)

  while (1);
}
  I2CMasterDataPut (I2C0_BASE、0x01);//开始测量
  I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);


  while (I2CMasterBusy (I2C0_BASE)));


   //可选:检查错误
  IF (I2CMasterErr (I2C0_BASE)!= I2C_MASTER_ERR_NONE)
  {
    while (1);//如果出错、请保持在这里
  }


 SysCtlDelay (g_ui32SysClock / 300000);
}

https://drive.google.com/file/d/1BxJGV5-OqalQTkzH1dwDCp8XjNQ1OMed/view?usp=sharing

上述逻辑分析仪捕获结果显示了 带延迟的 I2C 通信

观察结果:
-带延迟→正确的 I2C 事务(SA, RA,数据可见)
-无延迟→事务失败或不完整(SA 后跟无 RA 的数据)

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

    根据勘误表 I2C#08 [ref 勘误表 (SPMZ850G) 第 44 页]描述了设置命令和设置繁忙状态后大约 1 个 I2C 时钟的延迟。 由于 CPU 比 I2C 快得多、因此代码会看到瞬时完成情况。

    勘误表介绍了处理此问题的几种方法、其中一种是延迟、尤其是第 2 个和第 3 个。 延迟应该至少是 I2C 时钟周期的 0.6 倍、但我可能会估计更高、因为您的事务至少需要 18 倍。

    【编辑:已完成过早发布】

    [编辑:固定的文档编号]