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.

[参考译文] MSPM0G3507:DL_I2C_enableControllerReadOnTXEmpty ()中的危害

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1468639/mspm0g3507-hazard-in-dl_i2c_enablecontrollerreadontxempty

器件型号:MSPM0G3507

工具与软件:

MSPM0的 I2C RD_ON_TXEMPTY 功能按广播的方式工作、可以非常轻松地实现重复启动。
但是、当使用 Driverlib 时、以下各项之间的交互存在危险:
a) MCTR 事务位——特别是 BURSTRUN——在事务完成后不自动清除[观察到的行为]。
b) Driverlib 函数 DL_I2C_enableControllerReadOnTXEmpty ()使用读取-修改-写入操作设置 RD_ON_TXEMPTY=1。


结果是使用该函数重新写入 BURSTRUN、从而重新启动先前的操作。 [尴尬。]  使用 DL_I2C_disableControllerReadOnTXEmpty ()设置 RD_ON_TXEMPTY=0时会发生同样的情况。

修复方法是:
1)设置 RD_ON_TXEMPTY (=0或=1)作为启动每个新事务的一部分、即在与(新) BURSTRUN 相同的 MCTR 写入中。 这是我的(非 Driverlib)驱动程序的功能、但 DL_I2C_startControllerTransfer 函数都不提供此功能。
2) 2)在调用该函数之前设置 MCTR=0 (即 BURSTRUN=0)。
3)但是、如果你无论如何都在写入 MCTR、你也可以同时设置 RD_ON_TXEMPTY、因此我最终得到:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
#if RS_WA // Hazard workaround
i2c->MASTER.MCTR = I2C_MCTR_RD_ON_TXEMPTY_ENABLE;// Set repeat-start, clear others
#else // RS_WA
DL_I2C_enableControllerReadOnTXEmpty(i2c); // Write then read
#endif // RS_WA
#if RS_WA // Hazard workaround
i2c->MASTER.MCTR = 0*I2C_MCTR_RD_ON_TXEMPTY_ENABLE; // Clear repeat-start, clear others
#else // RS_WA
DL_I2C_disableControllerReadOnTXEmpty(i2c);
#endif // RS_WA
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

如何在 Driverlib 中纠正(兼容)这种问题并不明显。 有人可能会争辩说,由于在事务运行时更改 RD_ON_TXEMPTY 是不合适的,因此使用上述的 MCTR 写入(=)而不是 RMW (|=或&=)来实现 enableControllerReadOnTXEmpty ()是可以接受的,因为任何副作用都是良性的。

[编辑:还为"禁用"添加了内容。]

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

    我发布这主要是为了警告其他人。 我有一个权变措施、因此我没问题。