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.

[参考译文] TMS320F28034:SCI 中断驱动程序

Guru**** 2595770 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/665438/tms320f28034-sci-interrupt-driver

器件型号:TMS320F28034

大家好、

我正在为 Matlab 嵌入式 C2000项目编写一个由中断驱动的 FIFO 环缓冲器馈送 SCI 驱动程序。

Matlab 项目有一个其他外设中断(用于 CAN RX)和几个计时器中断。  

目前、当我为 SCI TX 和 RX (第212行和第232行)启用 PIE 中断时、我似乎使我的应用崩溃、从而阻止其他正常的外部活动、例如 CAN 流量。

我怀疑中断不会清除和阻止。  

鉴于我的中断基于数据表和示例代码、我很难找到导致此问题的不同之处以及如何对其进行调试。  

附件是我的驱动程序的当前版本(请注意、TX 和 RX_INTERRUPT 定义是最肯定启用的)。  

如果有人能推荐一条前进的道路、我将不胜感激、

谢谢你

Neal O'Hara

e2e.ti.com/.../sci_5F00_drv.he2e.ti.com/.../sci_5F00_drv.c

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

    什么会导致您的应用程序崩溃? 这话什么意思?

    请注意、当 RXFIFO 等于或大于 FIFO 中的中断级别时、SCI RX 将中断。 请注意、当 TXFIFO 的中断级别等于或小于 FIFO 中的中断级别时、SCI TX 将中断。 如果 FIFO 深度小于或等于 TXFFIL、这会导致 SCI TX 中断在从 FIFO 传出数据后立即被触发。

    如果您没有正确清除 PIE 组中的中断、则不会触发该 PIE 组中的其他中断。 但您似乎没有在组9中使用其他中断。 因此、这可能不是问题。 eCAN、LIN 和 SCI 位于 PIE 组9中。

    希望这对您有所帮助。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。
    我的 TXFFLL 设置为0、我的 RXFFLL 设置为4 (以便分别在 TX 空或 RX 满时触发)。
    通过应用崩溃、我的意思是、一旦我启用这些中断、正常活动(即可能会发生流量耗尽)就不再发生。
    如前所述、我担心我无法正确清除问题。
    我是否有人可以联系我以获得有关我的代码的第二个意见、验证我是否设置/清除了正确的中断?
    谢谢、
    Neal
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这可能是您的问题...

    如果使用 FIFO、请勿使用 TXRDY 和 RXRDY 位域。 只能使用 FFST 位域来检查这里是否有写入 FIFO 的空间以及是否有数据从 FIFO 中读取。 (参见747行)

    否则、我认为您对中断的处理看起来相当好。

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

    谢谢、

    删除 TXRDY 可能会有所帮助、但似乎并未修复我的所有问题。

    在添加此驱动程序之前、我正在运行此应用程序、现在我在轮询调用周围发生了额外的调试 GPIO 切换、因此在290ms 后、仍然会导致应用程序崩溃(停止某些操作)、具体取决于调试 GPIO 何时停止切换。

    对于 ISR 的操作调试、您还有其他建议吗?  
    如果不能完全正常工作、我会稍微卡在如何确认我的驾驶员的哪些部分可能工作或可能不工作。

    谢谢、

    Neal

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您可以通过 CCS 连接调试器、这将对您大有帮助。

    您可以尝试单独启用 TX 部分和 RX 部分、并查看其中一个是否导致问题。

    如果不了解系统的详细信息并知道系统的哪些部分停止正常工作以及它们的行为、我就无能为力。

    如果您提供了一些类似的详细信息、那么我可能会为您提供一些调试问题的指针。

    希望这对您有所帮助。

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

    感谢您迄今提供的帮助。

    我已经取得了一些进展、例如重新订购一些错误处理、从而不必要地阻止了进一步操作。

    中断期间、我的当前问题必须与 RXFFST 有关。

    在所连接的第862行、在接收 ISR 开始时、我检查 RXFFST == 4是否符合我的预期。

    根据我的错误代码、我经常会在该检查中看到错误。

    如果 RXFFLV = 4、为什么该 ISR 中的 RXFFST 不等于4、或者如何调试?

    其次、我的应用是配对的合作伙伴串行设备、其中两个合作伙伴以与其合作伙伴相同的速率发送/接收数据(在本例中、使用完全相同的串行驱动程序)。

    我已经向 TX 引入了一个具有 FFTXDLY 的4位延迟、但我仍在接收端遇到半常规 RXFFOVF 错误、即使我的 ISR 应该在 FIFO 溢出之前清空 FIFO。  有什么原因或如何对其进行调试的想法?

    感谢您的任何帮助!e2e.ti.com/.../6087.sci_5F00_drv.c

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

    如果您使用的是 FIFO、请勿使用 TXEMPTY (第420行)。

    我能想到的唯一原因是当中断被触发时、其中一个字节已经移入 RXBUF、并且从 FIFO 中退出、并且准备从接收缓冲区中读取。 这可能是您每次都不会看到这种情况的原因、但有时会看到这种情况。 它与接收数据的速度有关。

    听起来您的 FIFO 在接收端过流。 您是否丢失了数据? 根据您的系统、您的 ISR 可能无法及时清空 FIFO。 如果是这种情况、您可以进行系统更改。 例如、您可以启用 RX 中断以嵌套其他中断。

    此致、
    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有点困惑。
    我们通过读取 SCIRXBUF 从 FIFO 中读取字节。
    如果当 RXFFLV 为4、然后 RXFFST!= 4时触发、我是否仍然读取 SCIRXBUF 四次?
    我如何实际知道要读取多少数据?

    是的、我肯定会丢失数据包。 我认为 FFTXDL = 4会帮助我在下一个字节到来之前读取 FIFO、但它并没有好得多、而且对于时序要求、我不能适应更大的延迟。
    我需要每毫秒发送最多20个字节、因此我的当前数学是20个字节*(8+4)位/267857波特= 0.896毫秒。
    我不想把这笔钱推得更远。
    RX FIFO 应每四个字节触发一次、持续5次1毫秒、在发送端进行类似的数学运算。
    我有一个 CAN 接收中断(接收人发送的命令的频率不高)和一个毫秒计时器计数中断。
    因此、我不确定嵌套中断会对 RX FIFO 发生很大变化。
    提高波特率和之间的延迟是否是一种帮助 TX FIFO 在下一个字节之前读出的方法? 还是这会引入总线误差?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有一位专家来研究这个问题的第一部分。

    我尚未在如此高的波特率下测试 SCI。 我沟通过的最高值是115200。 您使用的波特率是它的两倍以上。

    您能否尝试降低波特率并查看您是否遇到同样的问题?

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不幸的是、降低波特率不允许我及时发送我的所有数据。
    我用示波器协议分析器示波实际的 SCI 总线、信号本身正常、分析器不会发现信号或字节错误。

    是否有办法将 RXFFINT 标志置为高电平、并且不调用中断例程?
    通过调试已经向我显示、有时我的 sciRxFifoIsr 函数被调用几千次、然后停止递增、即使我可以看到 RXFFINT 标志为高电平也是如此。

    关于 RXFFST!= 4的问题吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我相信我已经找到并修复了我的问题的根源。 我不知道系统中另一个具有更高优先级的中断、并且干扰了接收时序。

    不过,我仍对以下问题感兴趣:
    "如果我在 RXFFLV 为4时触发、然后 RXFFST!= 4时、我仍然读取 SCIRXBUF 四次吗?
    我如何实际知道要读取多少数据?"

    我能否获得专家帮助的估计响应时间?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先,这一特定的帖子没有解决我的问题。
    第二,我有一些尚未解决的问题,一个多星期以来没有得到进一步答复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Neal、

    如果另一个 ISR 已经挤占了 RX ISR、那么当你最终处理中断时、FIFO 中可能会有4个以上的值。 即使在 RXFFIL 引起中断后、缓冲区也将继续正常填充、因此您不会因此而遇到任何问题。 如果您想读出缓冲区中的所有值、只需读取 RXFFST 寄存器、然后从 RX FIFO 中读取该数量的字。

    此致、
    Cody