大家早上好。
我暂停了数据表分析、只是为了发现另一个错误、这次是在 MSP430 DRIVERLIB 中。
错误描述:
USCI_B_I2C_masterReceiveMultiByteFinish ()和 USCI_B_I2C_masterReceiveMultiByteFinishWithTimeout ()函数在 UCRIFG 标志置为有效前从 OFS_UCBxRXBUF 寄存器执行读取操作。 结果是、使用这两个函数的所有读取操作都将产生纯垃圾。
第一个函数的建议错误修复(补丁):
-- driverlib/MSP430F5xx_6xx/USCI_B_i2c.c 2020-02-27 20:48:53.000000000 +0200
++ atlas430/driverlib/MSP430F5xx_6xx/USCI_B_i2c.c 2021-1205 17:33:18.264094116 +0200
@@-446、16 +446、16 @@ uint8_t USCI_B_I2C_ReceivmasterMultiByt
//发送停止条件。
HWREG8 (baseAddress + OFS_UCBxCTL1)|= UCTXSTP;
-//在将停止位设置为到期后从接收缓冲区捕获数据
-//MSP430 I2C 关键时序。
- receiveData = HWREG8 (baseAddress + OFS_UCBxRXBUF);
-
//等待停止完成
while (HWREG8 (baseAddress + OFS_UCBxCTL1)& UCTXSTP);
//等待 RX 缓冲器
while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCRXIFG));
+//将由于而产生的停止位置1后从接收缓冲区捕获数据
+/MSP430 I2C 关键时序。
+ receiveData = HWREG8 (baseAddress + OFS_UCBxRXBUF);
+
返回 receiveData;
}
需要注意的是、此函数在不同系列和 eusci/USCI 类型的 driverlib 存档中再次出现4次、并且在所有其他地方、读取操作在 IFG 被检查后发生。
在 msp430f5529/cc430f5137和 Cypress FM24V10外部 i2c fram 芯片之间执行单元测试:
8字节写入、8字节读取、重复一次。
图例:
"I2C 写入"只是简单地写入一个包含"0xa1、0xa2、0xa3、0xa4、0xA5、 0xa6、0xa7、0xa8"添加到外部 fram 芯片
"I2C 读取"只会尝试从外部 fram 芯片的同一地址读取8个字节,并且在读取最后一个字节时使用未修补的 USCI_B_I2C_ReceiveMultiByteFinish()。
"(prog)"固件内部缓冲器包含的内容
"(有线)"在线上使用逻辑分析仪可以看到的内容
"[foo]"解释
在理想情况下、'i2c read'必须提供与'i2c write'写入的缓冲器完全相同的缓冲器、因为两个函数的起始地址相同。
I2C 写入(prog):0xa1 0xa2 0xa3 0xa4 0xA5 0xa6 0xa7 0xa8 [确定]
I2C 写入(线):0xa1 0xa2 0xa3 0xa4 0xA5 0xa6 0xa7 0xa8 ACK [确定]
I2C 读取(线):0xa1 0xa2 0xa3 0xa4 0xA5 0xa6 0xa7 0xa8 nack [确定]
I2C 读取(prog):0xa1 0xa2 0xa3 0xa4 0xA5 0xa6 0xa7 0xa7 [读取最后一个字节错误]
I2C 写入(prog):0xa1 0xa2 0xa3 0xa4 0xA5 0xa6 0xa7 0xa8 [确定]
I2C 写入(线):0xa1 0xa2 0xa3 0xa4 0xA5 0xa6 0xa7 0xa8 ACK [确定]
I2C 读取(线):0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 NACK [失败、在第7个字节而不是第8个字节后发出 NAK ]
I2C 读取(prog):0xa8 0xa1 0xa2 0xa3 0xa4 0xA5 0xa6 0xa6 [0xa8是上一次读取操作的垃圾、剩余的字节被移位]
TLDR:因此、如果没有补丁、两个函数就会产生垃圾、而在 CC430F5137和 MSP430F5529上测试的补丁则一切都很棒。 请修复。