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.

[参考译文] TM4C1294NCPDT:I2C 启动事件检测

Guru**** 2479895 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/698793/tm4c1294ncpdt-i2c-start-event-detection

器件型号:TM4C1294NCPDT

您好!

我尝试使用下降沿触发中断和名为"system_SCL"的位段时钟引脚来检测 TM4C1294板上的 i2c 启动事件。

ISR 看起来是这样的、

空 StartEventISR()

  if (system_SCL)   

  {

    // DisableInterrupts();     //禁用所有中断以对 GPIO 进行采样以实现最大精度

    DEBUG_PIN = 1;

    isStart = true;             //表示传输开始

    LED1 ^= 1;

    GPIO_PORTC_AHB_IM_R |= 0x10;  //启用 SCL 线路上的上升沿中断以进行数据采样

  }

  DEBUG_PIN = 0;

  GPIO_PORta_AHB_ICR_R |= 0x20;        //处理 ISR 后清除中断

虽然成功检测到启动事件、但有时会有错误的中断触发器、请查看所附图片。

请提供任何帮助。

谢谢、

Nihit

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

    我们不支持使用 DRM 的应用、而不是 TM4C E2E 论坛上的 TivaWare。

    我们的论坛指南第4点明确说明了这一点: e2e.ti.com/.../695568

    如果您更新代码以包含 TivaWare、我们可以在该点进行查看、但我们需要的不仅仅是 ISR、还要对可能影响错误触发器的内容进行评论。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好了、

    空 StartEventISR()

    if (system_SCL)//检查 SCL 是否为高电平(时钟拉伸时很重要)


    DEBUG_PIN = 1;
    isStart = true; //表示传输开始
    LED1 ^= 1;

    GPIOPinTypeGPIOInput (PORTC_BASE、GPIO_PIN_4);
    GPIOIntTypeSet (PORTC_BASE、GPIO_PIN_4、GPIO_RISE_EDGE);
    GPIOIntEnable (PORTC_BASE、GPIO_PIN_4);
    IntEnable (INT_GPIOC_TM4C129);



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "TI 认为已解决"?? 这显示在我的页面上
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nihit、

    是否在 ISR 内部调用 TIvaWare 代码?

    它看起来是配置代码、因此我对此有点困惑。 我不建议在另一个中断内部启用一个中断、因为您可以打开自己的可能竞争条件和/或堆栈溢出。 我建议使用一个标志来指示主代码以启用中断。

    再进一步看一下您的图片、我将假设蓝色是您尝试堆叠起始条件的用途吗?

    如果是这样、它只会在 SDA 线路上针对从高电平到低电平的每次转换进行切换。 不确定这是在时钟变为高电平且 SDA 为低电平时触发的、还是 SDA 的实际边沿转换。 在任何情况下、您似乎都在捕捉所有转换、而不仅仅是开始条件。 您可能需要尝试的是、在达到启动条件后、防止在将 I2C 数据放在线路上时触发中断。

    但是、要做到这一点、您需要能够区分读取操作与写入操作、并且读取操作将具有两个启动条件。

    除了这种复杂情况外、其余的应该是直接的、因为您知道 I2C 的时钟频率、因此您只需进行监控、直到 SCL 停止切换、然后在该点恢复启动状态监控。

    以上都是、通过捕捉起始条件的发生、还可能有助于理解您寻求获得的好处... 也许可以提供更巧妙的解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ralph、

    非常感谢您的宝贵见解、对不清楚表示歉意。 显然、问题已经解决、问题是由嵌套中断引起的。 但是、我希望得到您对我正在进行的项目的反馈。

    因此、SDA 线所连接的引脚(PB5)配置为下降沿中断、

    GPIOPinTypeGPIOInput (Porta_base、GPIO_PIN_5);
    GPIOIntTypeSet (Porta_base、GPIO_PIN_5、GPIO_FALLING_EDGE);
    GPIOIntEnable (Porta_base、GPIO_PIN_5);
    IntEnable (INT_GPIOA_TM4C129);

    "system_SCL"是 PC4上的位段。

    当在 SDA 线上检测到下降沿时、ISR 会检查 SYS_SCL 值、如果它是"高电平"、则会检测到启动条件。 我已经在示波器上验证了这种设置、它看起来工作正常。

    在检测到起始条件后、我想启用 PC4 (对于 SCL)上的上升沿中断、以便对 SDA 线的数据位进行采样。

    该项目的整个座右铭是"透明"读取 i2c 总线并将数据记录到文本文件中。

    非常感谢你能抽出时间。

    -NB