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.

[参考译文] MSPM0G1507:I2C 控制器运行期间的不明数据发送

Guru**** 2693225 points

Other Parts Discussed in Thread: MSPM0G1507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1595064/mspm0g1507-unexplained-data-transmit-during-i2c-controller-operation

部件号: MSPM0G1507

尊敬的专家:

我的客户已经使用 MSPM0G1507 创建了原型板、但他们观察到 I2C 控制器中存在未解释的行为。
这种现象是、一旦通信失败、后续尝试就会失败、或者传输的值与预期值不同。

问题 1: 在 I2C 控制器模式下、您能否解释该过程未完成(移位寄存器中仍有数据)且状态转换为空闲的情况?
如果已知案例相似、请分享这些案例。
如下所示:(+) MSPM0G3507:I2C 控制器模式处理 NACK — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛 

问题 2: 此外、当 Q1 中所述的状态发生时、建议的恢复过程是什么?
目前、在进入 I2CController_ Read/Write() 后、他们添加了以下复位过程。

DL_I2C_reset(I2C1_INST);
DL_I2C_enablePower(I2C1_INST);
SYSCFG_DL_I2C1_init(); 

根本原因仍在调查中、但我们怀疑电源存在问题。
我们假设通信期间发生了一些错误、将数据留在移位寄存器中、并且该过程提前退出。
代码结构会监测 I2C 控制器状态、并等待状态变为空闲状态、然后再结束过程。
他们还添加了对 TxDONE 等标志的检查、但这种现象并没有改变。

如果需要任何其他信息、请告知我们。

此致、
正常

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

    嗨、O.H.

    您能否进一步描述 I2C 通信的实现方式? 或者、如果可能、您能发送您的应用代码、让我们尝试重新创建您观察到的问题吗?

    此致、
    Brian

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

    Hi Brain、

    共享程序仅限于以下范围。 (检查波形后,我们认为原因是在功率斜升期间发生了 I²C 通信。)
    此时、他们要确认的是以下对策是否合适、或者是否有更好的方法。
    很抱歉、信息有限、但您能分享自己的想法吗?
    bool ***_I2CController_Write(uint8_t target_addr, uint8_t mem_addr, uint8_t* buffer, uint8_t length){
        // ...
        
        // I2C reset (added as a workaround for the issue)
        DL_I2C_reset(I2C1_INST);
        DL_I2C_enablePower(I2C1_INST);
        SYSCFG_DL_I2C1_init();
    
        // ... (setting mem_addr and write data into s_tx_packet)
    
        s_tx_count = DL_I2C_fillControllerTXFIFO(I2C1_INST, &s_tx_packet[0], s_tx_len); 
        // Note: s_tx_packet already contains mem_addr and write data
    
        // ... (includes status register checks)
    
        DL_I2C_startControllerTransfer(I2C1_INST, target_addr, DL_I2C_CONTROLLER_DIRECTION_TX, s_tx_len);
    
        // ... (includes status register checks)
    }
    
    bool ***_I2CController_Read(uint8_t target_addr, uint8_t mem_addr, uint8_t* buffer, uint8_t length){
        // ...
        
        // I2C reset (added as a workaround for the issue)
        DL_I2C_reset(I2C1_INST);
        DL_I2C_enablePower(I2C1_INST);
        SYSCFG_DL_I2C1_init();
    
        // ... (setting mem_addr into s_tx_packet)
    
        s_tx_count = DL_I2C_fillControllerTXFIFO(I2C1_INST, &s_tx_packet[0], s_tx_len); 
        // Note: s_tx_packet already contains mem_addr
    
        // ... (includes status register checks)
    
        DL_I2C_startControllerTransfer(I2C1_INST, target_addr, DL_I2C_CONTROLLER_DIRECTION_TX, s_tx_len); 
        // Note: transmit mem_addr
    
        // ... (includes status register checks)
    
        DL_I2C_startControllerTransfer(I2C1_INST, target_addr, DL_I2C_CONTROLLER_DIRECTION_RX, s_rx_len); 
        // Note: receive
    
        // Harvest read data
        while (s_rx_count < s_rx_len) {
            if (!DL_I2C_isControllerRXFIFOEmpty(I2C1_INST)) {
                s_rx_packet[s_rx_count] = DL_I2C_receiveControllerData(I2C1_INST); 
                // Note: collect the received data
                s_rx_count++;
            }
        }
    
        // ... (includes status register checks)
    }
    
    此致、
    正常
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 O.H:

    这是有效的权变措施、但我建议在功率斜升后等待初始化 I2C 模块。 首次初始化外设时可以添加延迟、或者可以使用 ADC 来监控电源、一旦满足阈值、就会初始化 I2C。

    此致、
    Brian