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/TMS570LS3137:有关 SCI 接收中断、CAN 传输中断、GIO 中断的三个问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/605907/ccs-tms570ls3137-three-questions-about-sci-receive-interrupt-can-transmission-interrupt-gio-interrupt

器件型号:TMS570LS3137
主题中讨论的其他器件: HALCOGEN

工具/软件:Code Composer Studio

有关 TMS570LS3137的三个问题:

1、SCI 接收中断有时不及时。
在使用接收中断时、有时会产生溢出错误中断。
正如技术参考手册所述、SCI 模块没有 FIFO 功能。
那么,如何避免溢出错误?

2 μ s CAN、传输中断有时不连续。
我使用的 CAN 传输如下所示:
当缓冲区中的数据包准备就绪时、我向 CAN 报文对象发送一条帧报文。
成功发送报文后、就会产生 TxOK 中断。我在中断函数中再次发送报文。
在数据缓冲区为空之前、封装数据将持续传输。

但是、传输链有时会中断、因为不会生成 TxOK 中断。
自动重传和自动总线开启均已启用。
那么、如何确保数据可以在中断模式下持续及时地传输。

3、GIO 中断
GIO 引脚可在正常运行时配置为边沿中断、在低功耗模式下配置为电平中断。
问题是,GIO 引脚是否可以配置为正常操作中的电平中断?

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

    很抱歉耽误你的回答。 我首先要检查您的应用程序、是您的 ISR 中实际完成的工作量。 即、ISR 中为请求的功能提供服务所花费的时间是多少? 一般来说、ISR 的最佳用法是进入、清除 IF、设置标志或移动一些数据、然后退出。 这些中断中不应存在任何长期自行开发的数据处理。

    您是否有任何类型的中断时序及其消耗的带宽配置文件? 您看到的问题表示在为另一个中断提供服务时会触发中断、因此应进行检查以确保 ISR 在需要时可用。

    对于 GIO 中断、您可以选择上升沿、下降沿或双边沿上的中断。 对于使用提供的边沿触发模式无法实现的电平触发模式、您希望获得哪些功能?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Chuck Davenport:

    感谢您的回答。

    1、SCI
    我发现一些较高优先级的中断可能会延迟 SCI 中断。 因此、我只需通过 HALCoGen 配置即可将 SCI 中断的优先级升级到 FIQ。 溢出错误中断不会在很长一段时间内生成。
    但是、变速器问题仍然存在。
    事实上、我已经纠正了一个错误:
    在主进程中将一个字节移动到 SCITD 寄存器之前、为了开始新的封装数据传输、我必须检查 TX 空位、而不是检查 TXRDY 位。 当 TX 空位为1时、发送器缓冲器和移位寄存器都为空。 这意味着 SCI 可自由用于新的封装传输。 当 TXRDY 位为1时、SCITD 准备好接收下一个字符。 这并不意味着最后一次封装传输的结束。
    此外、所有封装数据都保存在环形缓冲器中以进行传输。 在主进程中将一个字节移动到 SCITD 寄存器之前、我禁用传输中断、以避免竞争访问数据缓冲区。
    修改后、传输错误已减少、但有时仍会丢失数据。 例如、一个封装数据存储一个字节。
    操作 SCI 时是否需要注意其它事项?

    2、DCAN
    我使用的 DCAN 传输过程与 SCI 类似。
    恐怕在主进程中开始新的包数据传输之前、使用传输请求 X 寄存器检查 Tx 消息挂起是不够的。 这并不意味着 DCAN 可自由用于新的封装传输。
    我很困惑如何获得最后一个封装传输的结束状态、例如检查 SCI 中的 TX 空位。

    3、GIO
    GIO 中断引脚的电平由一个外部芯片控制。 只有在外部芯片上没有中断源时、引脚才会变为高电平。 TMS570通过 SPI 通信清除 ISR 中的外部芯片中断状态。 如果 ISR 结束、并且在引脚变为高电平之前在外部芯片上生成新的中断源、中断引脚可能会保持低电平。 此电源下降沿中断将永远不会生成。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Maxr:

    [引用 user="maxr]1、SCI
    我发现一些较高优先级的中断可能会延迟 SCI 中断。 因此、我只需通过 HALCoGen 配置即可将 SCI 中断的优先级升级到 FIQ。 溢出错误中断不会在很长一段时间内生成。
    但是、变速器问题仍然存在。
    事实上、我已经纠正了一个错误:
    在主进程中将一个字节移动到 SCITD 寄存器之前、为了开始新的封装数据传输、我必须检查 TX 空位、而不是检查 TXRDY 位。 当 TX 空位为1时、发送器缓冲器和移位寄存器都为空。 这意味着 SCI 可自由用于新的封装传输。 当 TXRDY 位为1时、SCITD 准备好接收下一个字符。 这并不意味着最后一次封装传输的结束。
    此外、所有封装数据都保存在环形缓冲器中以进行传输。 在主进程中将一个字节移动到 SCITD 寄存器之前、我禁用传输中断、以避免竞争访问数据缓冲区。
    修改后、传输错误已减少、但有时仍会丢失数据。 例如、一个封装数据存储一个字节。
    操作 SCI 时是否需要注意其他事项?[/QUERT]

    要了解正在发生的情况、您需要了解导致数据丢失的情况。 即、它是一个中断优先级问题还是一个处理接收到的数据的延迟问题。 如前所述、您通常需要在中断中花费尽可能少的时间。 即、将数据移动到缓冲区、然后重新启用中断并退出。 为了适应这种方法、您的环形缓冲器需要足够大、以便跟上数据流。 通常、测试这种情况的一种好方法是设置一个简单的 PC 应用程序、以重复向 MCU 发送数据。 数据流应该是一个简单的计数或一些其他模式、以便查看字节并检测丢弃的数据。 即0-9、9-0重复模式。 请注意、当 CAN 等其他中断和数据流也在运行时、这会更加复杂、因此您的应用中需要考虑到这一点。

    [引用 user="maxr]2、DCAN
    我使用的 DCAN 传输过程与 SCI 类似。
    恐怕在主进程中开始新的包数据传输之前、使用传输请求 X 寄存器检查 Tx 消息挂起是不够的。 这并不意味着 DCAN 可自由用于新的封装传输。
    我很困惑如何获取最后一个封装传输的结束状态、例如检查 SCI 中的 TX 空位。[/QUERP]

    是的、由于仲裁和多节点总线、CAN 是一种不同的动物。 DCAN 必须确保在传输前可以清楚地发送。 DCAN ES 寄存器中的 TxOK 位。 它也可以使用 SIE (状态更改中断使能)连接到中断。 DCAN CTL 寄存器中的位。

    [引用 user="maxr]3、GIO
    GIO 中断引脚的电平由一个外部芯片控制。 只有在外部芯片上没有中断源时、引脚才会变为高电平。 TMS570通过 SPI 通信清除 ISR 中的外部芯片中断状态。 如果 ISR 结束、并且在引脚变为高电平之前在外部芯片上生成新的中断源、中断引脚可能会保持低电平。 此电源下降沿中断将永远不会生成。[/报价]

    Hercules 器件上不支持电平触发中断。 当通过 SPI 命令清除中断时、您可以使用边沿触发中断和 RTI 计数器的某种组合来查找下降边沿。 即、发出 SPI 命令后、会有指定的时间将发送到 GPIO 的信号发出。 如果在指定的时间之后、它没有、您可以假设已经发出第二个中断信号并跳转到您的处理程序。 这一切取决于您的延迟要求以及您需要多快的服务速度。