TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] MSPM0G3105:MSPM0 SDK I2C 库问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1286911/mspm0g3105-mspm0-sdk-i2c-lib-issue

器件型号:MSPM0G3105
主题中讨论的其他器件:TCA9539

我们的一个客户使用 MSPM0 通过 I2C 与 IO 扩展器 TCA9539通信。

一个操作是重复启动的写入数据读取数据操作。  下面是代码:

通用位8 I2C_CfgReadTransfer (Uint32* Register、Uint32 slave_address、uint8 RegisterAddress、uint8 *I2C_in_buffer、uint8 i2c_buffer_length )

{

   T_I2C_MASTER_TRANSMIT_STATUS RETURE_VALUE = I2C_MASTER_ERR_BUFFER_OVERIFLOW

   UINT8接收计数器;

   DL_I2C_enableController ReadOnTXEmpty ((I2C_Regs*)寄存器);

 

   /*使用 Tx 数据填充 FIFO。 完整传输为8个字节、只有4个字节

    * GPIO 端口扩展器需要*/

   DL_I2C_fillControllerTXFIFO (((I2C_Regs*)寄存器)、&RegisterAddress、(uint16) C_I2C_REG_ADD_SIZE);

 

   如果 ((C_I2C_RX_MAX_packet_size > i2c_buff_length)和(0u!= i2c_buff_length))

   {

      如果 ( C_I2C_MAX_7_BIT_ADD >= SLAVE_ADDRESS )

      {

          /*等待 I2C 进入空闲状态*/

          同时 (!(DL_I2C_getControllerStatus ((I2C_Regs*))和 C_I2C_CONTROLLER_IN_IDLE_MASK));

 

          /*此函数自动发送"开始+停止"*/

          DL_I2C_startControllerTransfer (((I2C_Regs*) Register)、slave_address、DL_I2C_controller_direction_rx、(i2c_buff_length);

              /*从目标接收所有字节*/

  附录四

 

. } 突出显示的 API 调用是正确的、能够启动所需的操作。 但是、它不起作用、因为最后一个 API DL_I2C_startControllerTransfer ()清除(覆盖)先前的 DL_I2C_enableControllerReadOnTXEmpty ()调用设置的 RD_ON_TXEMPTY 位。 这是 DL_I2C_startControllerTransfer API 上的一个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Ansong、您好!

    我只是在我的终端测试了它、它看起来像预期的那样工作。

      调用 DL_I2C_startControllerTransfer 时、您使用哪个版本的 SDK 以及在总线上生成什么流量?  

    DL_I2C_startControllerTransfer  会屏蔽要写入的位、 因此不应覆盖  RD_ON_TXEMPTY

    此致、
    布兰登·费舍尔

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

    我们的 SDK 版本 mspm0_SDK_1_00_00_04

    以下是我们的源代码:

    __static_inline void DL_I2C_startControllerTransfer (I2C_Regs * i2c、
    uint32_t targetAddr、DL_I2C_CONTROLLER_DIRECTION 方向、
    uint16_t 长度)
    {
    //指定目标地址和读取/写入模式
    DL_Common_updateReg (&i2c->master.msa、
    ((targetAddr << I2C_MSA_SADDR_OFS)|(uint32_t)方向)、
    (I2C_MSA_SADDR_MASK | I2C_MSA_DIR_MASK);

    //停止位在传输突发长度字节数后生成
    DL_Common_updateReg (&i2c->MASTER.MCTR、
    (((uint32_t)长度<< I2C_MCTR_MBLEN_OFS)| I2C_MCTR_BURSTRUN_ENABLE |
    I2C_MCTR_START_ENABLE | I2C_MCTR_STOP_ENABLE)、
    (I2C_MCTR_MBLEN_MASK | I2C_MCTR_BURSTRUN_MASK | I2C_MCTR_START_MASK |
    I2C_MCTR_STOP_MASK))

    从突出显示的掩码值开始、您可以看到它屏蔽了 RD_ON_TXEMPTY 位。

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

    Ansong、您好!

    我建议更新至最新版本(https://www.ti.com/tool/MSPM0-SDK#downloads) 1.20版。 这就是我正在使用的 SDK 版本、它在哪里看起来可以正常工作。  

    DL_Common_updateReg 的工作方式是使用掩码的倒数来保留旧寄存器值、然后将旧寄存器值与新寄存器值一同写入回写、从而避免更改任何内容。 有关该函数的源代码、请参阅下面的。  

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    /**
    * @brief Writes value to specified register - retaining bits unaffected by mask.
    *
    * @param[in] reg Pointer to the register overlay for the peripheral.
    * @param[in] val Value to be written to the register.
    * @param[in] mask Mask defines which bits will be altered.
    */
    __STATIC_INLINE void DL_Common_updateReg(
    volatile uint32_t *reg, uint32_t val, uint32_t mask)
    {
    uint32_t tmp;
    tmp = *reg;
    tmp = tmp & ~mask;
    *reg = tmp | (val & mask);
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    如果该掩码包含  I2C_MCTR_RD_ON_TXEMPTY_MASK、我会预期它会无意中将该值消隐。  

    您是否有逻辑分析仪或可以使用任何其他任何器件来探测 I2C 引脚? 调用  DL_I2C_startControllerTransfer 后、您是否会在 CCS 的寄存器视图中看到 RD_ON_TXEMPTY 位复位

    此致、
    布兰登·费舍尔

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

    您好、Brandon:

      DL_I2C_startControllerTransfer 调用后不会清除 RD_ON_TXEMPTY、这是真的。 事实证明、根本原因是客户在呼叫中使用了错误的地址值。

    问题已解决。 感谢你的帮助。