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.

[参考译文] MSP432P401R:I2C 停止

Guru**** 2525040 points
Other Parts Discussed in Thread: BQ24735, BQ4050

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/972558/msp432p401r-i2c-stalling

器件型号:MSP432P401R
主题中讨论的其他器件:BQ24735BQ4050

我有一个 MSP-EXP432P401R 通过 eUSCI0_B 连接到 BQ24735和 BQ4050的 SMBus。 通过扩展 I2C 驱动程序库示例、我能够让微控制器与两个器件进行通信。 但是、我偶尔会遇到 I2C_masterSendSingleByte 卡在无限 while 循环中的问题[同时(!(EUSCI_B_CMSIS (moduleInstance)->rIFG.r & UCTXIFG)) ]导致微控制器停止。

具体而言、我尝试读取 BQ4050电池状态、然后读取 BQ4050相对充电状态(尽管我尝试以相同的结果反转呼叫)。 在第二次读取时、从器件地址被写入(已确认)、然后出现停止条件、而不是写入请求的寄存器地址。

以下是读取函数:

uint8_t ReadU1 (uint8_t 地址)
{
uint8_t 值= 0;

MAP_I2C_setSlaveAddress (EUSCI_B0_BASE、0x0B);

//设置要读取的地址
MAP_I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
MAP_I2C_masterSendSingleByte (EUSCI_B0_BASE、地址);

//验证前一条消息的完成情况
while (MAP_I2C_masterIsStopSent (EUSCI_B0_BASE));

值= MAP_I2C_masterReceiveSingleByte (EUSCI_B0_BASE);

返回值;
} 

您看到的示波器

您希望看到的位置

什么可能导致停止条件早于预期发生?

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

    Aaron、您好!

    根据 《MSP432P401R 驱动程序库用户指南》、您应该初始化主控方、设置从器件地址、设置模式、然后启用模块。   

    我想知道在调用 setSlave 和 setMode API 之前是否应该禁用该模块、然后重新启用。  可以试试吗?  

    谢谢、

    JD  

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

    尝试禁用/启用从器件地址周围的模块并设置模式会导致每次都出现该问题、而不是偶尔出现。 查看驱动程序库源代码、模式由发送/接收函数设置、因此我删除了该调用。 在进行测试时、我没有看到通信出现任何停顿。 我仍然觉得可能有问题、但代码正常工作。

    uint8_t ReadU1 (uint8_t 地址)
    {
    uint8_t 值= 0;
    
    MAP_I2C_setSlaveAddress (EUSCI_B0_BASE、0x0B);
    
    //设置要读取的地址
    MAP_I2C_masterSendSingleByte (EUSCI_B0_BASE、地址);
    
    //验证前一条消息的完成情况
    while (MAP_I2C_masterIsStopSent (EUSCI_B0_BASE));
    
    值= MAP_I2C_masterReceiveSingleByte (EUSCI_B0_BASE);
    
    返回值;
    } 

    根据技术手册(26.4.14)、I2C 模块无需复位即可设置从器件地址、因此在启用后设置从器件地址应该是可以的。

    另一个引起我注意的问题是、在接收第一个字节时、时钟被拉伸、根据我的理解、这不应该发生。 在从器件确认地址后、应立即为第一个字节计时。

    感觉所有这些都应该在硬件中处理、并且在两次读取上的持续时间与我在示波器上监控的时间大致相同。

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

    我建议您 在调用 MAP_I2C_masterReceiveSingleByte 后再次调用 MAP_I2C_masterIsStopSent。 ReceiveSingleByte 不会等待停止完成。