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.

[参考译文] F280039C 和 INA237 之间的 I2C 通信问题

Guru**** 2609955 points
Other Parts Discussed in Thread: SYSCONFIG, INA237, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1576525/i2c-communication-issue-between-f280039c-and-ina237

器件型号:LAUNCHXL-F280039C
主题中讨论的其他器件:INA237、SysConfig、 C2000WARE

工具/软件:

TI 团队大家好、

我目前正在使用设计 I2C 通信设置 F280039C 微控制器 (C2000 系列)和 INA237 电流/电压监测器

我尝试使用 I2C 外设将 F280039C 与 INA237 连接、但我没有收到任何通信(没有 ACK 响应或有效数据)。
为了进行确认、我还尝试了两者之间的 I2C 通信 F280039C dsPIC33EP128GP504 作为测试,但这也不起作用 — 因此我相信我在 F280039C 侧的 I2C 配置可能存在问题。

请分享一个 I2C 主设备示例代码 中的示例 F280039C。  

另外、请说明是否有任何具体内容 时钟配置或 GPIO 引脚多路复用设置 I2C 在该器件上正常运行所必需。

我的设置:

  • MCU:F280039C LaunchPad

  • 传感器:INA237(I2C 接口)

  • I2C 速度:标准模式 (100kHz)

  • 工具链:Code Composer Studio

感谢您的帮助和指导!

此致、
安东尼·何塞

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

    您好、Antony、

    是否在为该工程使用 SysConfig 进行 I2C 配置? 我们在 C2000WARE SDK 中有一些示例软件(也可在此处找到:dev.ti.com/.../node  

    此外、您用于 I2C 的 GPIO 是什么? F280039C LaunchPad 上有一些默认断开的 GPIO、因此请确保进行必要的开关/电路板改动以利用这些信号。 请具体参阅用户指南


    此致、

    彼得

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

    您好、Peter:

    感谢您的答复。

    是的、我正在使用 其中概述了 SysConfig I2C 配置的一些初始条件。 我参考了中的示例 C2000Ware (i2c_ex1_loopback) 与建议的一样。 选择此示例是因为这是我首先要测试的与 I2C 相关的内容。

    我通过两种方式测试代码:

    FIFO +中断方法:
    此设置有效 — 我可以在环回模式下正确观察预期的发送和接收数据。

    2.轮询方法(无 FIFO 和中断):
    SysConfig 中不直接提供此案例、因此我修改了 FIFO 中断示例。 我的意见是 工作时使用 TX 相位 ,但 RX 阶段未完成 。 它卡在这条线上:

      while(!(I2C_getStatus (myI2C0_BASE)& I2C_STS_RX_FULL)))。  

    如果我跳过此检查、代码会在下一行触发断言错误。

    我正在尝试使用 轮询模式 与 INA237 IC 通信、因此我首先在轮询模式下测试环回。

    while (1)
      {
        对于 (I = 0;I < 8;I++)
        {
          //等待 TX 就绪
          while(!I2C_getStatus (myI2C0_BASE)& I2C_STS_TX_EMPTY){}

          I2C_putData (myI2C0_BASE、sData[i]);
        }

        //生成停止条件
        I2C_sendStopCondition (myI2C0_BASE);

        对于 (I = 0;I < 8;I++)
        {
          //等待 RX 就绪
          while(!(I2C_getStatus (myI2C0_BASE)& I2C_STS_RX_FULL)){}

          RDATA[i]= I2C_getData (myI2C0_BASE);
        }

        I2C_sendStopCondition (myI2C0_BASE);

        //
        //比较
        //
        对于 (I = 0;I < 8;I++)
        {
          if (RDATA[i]!= sData[i])
          {
            //GPIO_togglePin (DEVICE_GPIO_PIN_LED1);
          }
        }

        //递增数据
        对于 (I = 0;I < 8;I++)
        {
          sData[i]+;
        }

        DEVICE_DELAY_US (500000);
      }
    }
    init 函数的示例  
    void I2C1_init (){
      I2C_disableModule (I2C1_BASE);
      I2C_initController (I2C1_BASE、DEVICE_SYSCLK_FREQ、I2C1_bitrate、I2C_DUTYCYCLE_50);
      I2C_setConfig (I2C1_BASE、I2C_CONTROLLER_SEND_MODE);
      I2C_disableLoopback (I2C1_base);
      I2C_setOwnAddress (I2C1_BASE、I2C1_OWN_ADDRESS);
      I2C_setTargetAddress (I2C1_BASE、I2C1_TARGET_ADDRESS);
      I2C_setBitCount (I2C1_BASE、I2C_BITCOUNT_8);
      I2C_setDataCount (I2C1_BASE、1);
      I2C_setAddressMode (I2C1_BASE、I2C_ADDR_MODE_7BITS);
      I2C_disableFIFO (I2C1_BASE);
      I2C_clearInterruptStatus (I2C1_BASE、I2C_INT_REG_ACCESS_RDY | I2C_INT_STOP_Condition);
      I2C_enableInterrupt (I2C1_BASE、I2C_INT_REG_ACCESS_RDY | I2C_INT_STOP_Condition);
      I2C_setEmulationMode (I2C1_BASE、I2C_EMULATION_STOP_SCL_LOW);
      I2C_enableModule (I2C1_BASE);
    }

    对于 GPIO 配置 — 我使用通过分配的引脚 其中概述了 SysConfig 、I2CB: — GPIO34 作为 I2CB_SDA。  GPIO51 作为 I2CB_SCL。  

    我想我需要 首先解决该轮询 RX 问题 我们先来谈谈 INA237。  您能建议在 F280039C 上运行基于轮询的环回的正确程序吗?此外、对于与 INA237 传感器实现基于轮询或基于中断的 I2C 通信、我将感谢您提供任何指导。  

    此致、
    安东尼·何塞

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

    您好、Antony、

    您是否可以参考 SDK 中的 i2c_ex4_eeprom_Polling 示例? 其中显示了使用基于轮询的 I2C 通信的首选实现方案

    此致、

    彼得

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

    您好、Peter:  

    我进行了检查、然后它最终进入 FAIL 函数。  

    void 失败 (void)
      asm(“ ESTOP0“)
      for(;;);
    }
    此致、
    安东尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter:  

    只需跟进我之前关于该 问题的消息(4 天前发送)。
    我检查了您建议的代码、但它仍然会进入fail()函数:

    void fail(void) { asm(" ESTOP0"); for(;;); }
    I also checked the SCL and SDA lines on the oscilloscope, but no signal activity was observed.

    请您就下一步或要做的其他详细信息提供建议吗?
    安东尼

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

    您好、Antony、

    你可以按照调用栈来查看它抛出 fail() 函数的位置吗? 确保您配置的是正确的目标地址

    此致、

    彼得