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.

[参考译文] CCS/TM4C1294NCPDT:I2C 从机中断示例仅适用于 CCS 调试

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/584401/ccs-tm4c1294ncpdt-i2c-slave-interrupt-example-works-only-with-ccs-debugging

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

工具/软件:Code Composer Studio

你好!

我已经购买了带 TM4C1294NCPDT 芯片的 EK-TM4C1294XL Launchpad。 我想设置不同器件之间的 I2C 通信。  从 TivaWare_C_Series-2.1.4.178示例中、我使用了 I2C_receive_int.c"文件、并在"startup_css.c"中断矢量表中为 I2C0中断设置"I2C0SlaveIntHandler"。 在 Code Composer Studio 7中、我单击"Debug"按钮以检查此代码的功能、这是正常的。 步进模式以及具有和不具有断点的正常模式。 如果调试模式停止且 Launchpad 通过板载复位按钮重置、则 I2C 示例会在 UART 打印"发送"后挂起、这可能是等待发生从器件中断并设置标志的 while 循环。 我关闭了编译器优化器。

我不明白调试模式和正常模式在这种设置下有何区别。 我在这里缺少什么?

此致

e2e.ti.com/.../startup_5F00_css.c

e2e.ti.com/.../slave_5F00_receive_5F00_int.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仔细检查堆栈值和复位矢量是否在位置0x0000和0x0004进行编程。 (请记住地址0x0004处的复位矢量应该是奇数、它比第一条指令的地址多一个。)
    如果可以、请尝试以下操作:
    1.在器件已编程的情况下、连接 CCS7而不"加载"代码。
    2.通过执行 Run -> Load -> Load Symbols 来加载符号
    3.使用 Run -> Reset -> System Reset 重置设备
    4.运行设备(运行->恢复)
    如果器件无法正确执行、您可以通过重复上述过程来对其进行调试、但在运行代码之前要添加断点。

    需要注意的一点是代码段或初始化数据段链接到 RAM 而不是闪存中、尤其是在必须对链接器命令文件进行任何修改的情况下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是和 Charles 交谈的、他能够再现问题。 您第一次运行代码时似乎无法正常工作、但如果您不重置外设、则第二次无法正常工作。 "重新启动"在不复位外设的情况下重新运行程序。 我认为一些初始化是不按顺序的。 我们仍在进行这方面的工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴看到、"专业人士交流"-一个人不太可能"了解一切"。
    我的组经常发现这样的问题:"仅在调试器连接时运行"问题是由错误、名称错误或缺失导致的-"启动文件"...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,炸肉排

    您能否在 I2CSlaveIntEnableEx()之前尝试调用 I2CSlaveEnable()? 我发现、使用这个序列、它将在您在 CCS 内进行系统复位后起作用。 该程序不接受 I2C 从设备中断的原因是从设备中断屏蔽没有设置为启用中断。 出于某种原因、如果 I2CSlaveIntEnableEx 在 I2CSlaveEnable 之前被调用、那么中断屏蔽就不会被置位。 我仍在进行一些调试、因为我仍然不明白为什么它在您下载代码后会起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    非常感谢 Charls 和 Crosby 先生的快速回复和专业帮助。 实际上,在 I2CSlaveIntEnableEx()之前调用 I2CSlaveEnable()函数解决了这个问题。 现在工作正常! 您的解决方案描述也很有意义。

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

    我只是想提供一些更新。 在您下载代码后、它第一次运行的原因是 ROM 引导加载程序已启用 I2C 主从器件、作为通过 UART、I2C、SSI 等进行串行引导加载支持的一部分 在调用 I2CSlaveIntEnableEx()之前,可以检查 I2CMCR 以及主设备和从设备是否均已启用。 当您复位器件时、从器件首先被禁用。 如果您现在在 I2CSlaveEnable()之前调用 I2CSlaveIntEnableEx(),则写入将无法完成。 数据表中也没有详细说明写入 I2CSIMR 和从机使能位之间的关系。