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.
工具与软件:
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、因此我最终得到:
#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
如何在 Driverlib 中纠正(兼容)这种问题并不明显。 有人可能会争辩说,由于在事务运行时更改 RD_ON_TXEMPTY 是不合适的,因此使用上述的 MCTR 写入(=)而不是 RMW (|=或&=)来实现 enableControllerReadOnTXEmpty ()是可以接受的,因为任何副作用都是良性的。
[编辑:还为"禁用"添加了内容。]
我发布这主要是为了警告其他人。 我有一个权变措施、因此我没问题。