我相信我在 DRIVERLIB 版本2.91.13.01中发现了一个错误。 在文件 USCI_B_i2c.c 中,函数 EUSCI_B_I2C_masterReceiveMultiByteFinish()中的 代码如下:
uint8_t EUSCI_B_I2C_masterReceiveMultiByteFinish (uint16_t baseAddress)
{
//发送停止条件。
HWREG16 (baseAddress + OFS_UCBxCTLW0)|= UCTXSTP;
//等待 Stop 完成
while (HWREG16 (baseAddress + OFS_UCBxCTLW0)& UCTXSTP) <--注:不分号
//等待 RX 缓冲区
while (!(HWREG16 (baseAddress + OFS_UCBxIFG)& UCRXIFG));
//在由于以下原因而设置停止位之后从接收缓冲区中捕获数据
//MSP430 I2C 关键时序。
返回(HWREG16 (baseAddress + OFS_UCBxRXBUF));
}
我认为在 "等待 Stop to finishe"注释之后紧接着的"while (HWREG16 (baseAddress + OFS_UCBxCTLW0)& UCTXSTP)"的末尾应该有一个分号(;)。 缺少的分号使 Wait-for-stop while 语句也执行 wait-for-RX-buffer while 语句、这可能会触发 SLAZ382AH 中记录的总线停顿勘误 USCI37。 值得注意的是,EUSCI_B_I2C_masterReceiveMultiByteFinishWithTimeout() 函数在相应代码行的末尾确实有一个分号。
这似乎 会影响所有的 DRIVERLIB 版本、但 MSP430F5xx_6xx 版本除外、其中存在分号。
TI 员工能否确认?
-布赖恩