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.

[参考译文] TMS320F280025C:SCI 中断与 CAN 中断以及 sciaTXFIFOISR 问题

Guru**** 2455560 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1282288/tms320f280025c-sci-interrupt-vs-can-interrupt-and-sciatxfifoisr-problems

器件型号:TMS320F280025C

你(们)好!

我正在研究将现有的 SCI TX 通信(我将数据传输到 LCD 屏幕)转换为基于中断的模式、因为我发现 CAN 中断会干扰消息流。 我假设如果我将 SCI 移至基于中断的解决方案、那么我可以将 SCI 中断优先级设置为高于 CAN 优先级以避免这一问题?

使用 示例"sci_ex2_loopback_interrupts.c"作为参考、我想将我的现有 TX 数据移动到 sDataA[]缓冲区并按照下面的 TX ISR 进行发送。  为了使 sDataA 能够使用、对大小是否有任何限制?  

我真正不明白的是、当我没有要发送的数据时会发生什么情况。 IE 在 sDataA[]中没有新数据。 这个中断一直在触发,我 不想继续 调用 SCI_writeCharArray()来清除中断(这似乎是必要的,以避免这种卡住)。  

请您提供意见。

非常感谢

 

__interrupt void sciaTXFIFOISR (void)
{

SCI_writeCharArray (SCIA_BASE、sDataA、sDataA_length);  

SCI_clearInterruptStatus (SCIA_BASE、SCI_INT_TXFF);

//
//发出 PIE ACK
//
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);

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

    周老师、您好!

    你能否尝试清除  ISR 中的 TXINTENA 位、而只在写入 sDataA 之后再启用它?

    谢谢!

    卢克

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

    Luke、您好!  

    非常感谢您的答复。

    注意我将 FIFO 用于 TX、因此可能会稍有不同。

    我是否要使用以下命令执行此操作:  Sci_enableInterrupt (SCIA_BASE、SCI_INT_TXFF  )或 Interrupt_enable (INT_SCIA_TX);?

    我 尝试上述任何一种方式都已成功、并在 sciaTXFIFOISR 末尾使用相反的命令来禁用中断。  

    我现在遇到的问题是、 在 sciaTXFIFOISR 发送数据时、有时会写入我的 sDataA 缓冲区。  

    我找不到一条可靠的命令来查询 SCI TX 数据是否在发送期间仍处于繁忙状态、或者在活动 ISR 期间未处于繁忙状态、以阻止 向此 sDataA 缓冲区写入数据。 您能建议一种可行的方法来做到这一点吗? 我尝试过一种变通方法、设置了一个变量值、但没有运气、似乎卡住了:  

    在  sciaTXFIFOISR 例程结束时、我尝试添加以下代码:

    INTERRUPT_ACTIVE = FALSE;
    Interrupt_disable (INT_SCIA_TX);

    在我的  sDataA 更新(发生在 main ())结束时,我添加了代码:

    interrupt_active = true;
    Interrupt_enable (INT_SCIA_TX);
    while (interrupt_active=true)
    {
    //等待数据被发送

    在成功触发中断(从而退出 while 循环) 3次之后、我似乎在上述 while 循环中陷入困境。 我不确定是什么原因会导致中断停止触发、因此无法将  INTERRUPT_ACTIVE 的值修改 回 FALSE 以退出 while 循环。

    非常感谢您提供宝贵意见。

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

    周老师、您好!

    如果在更新 sDataA 缓冲区时禁用了 SCI 中断、则更新 sDAtaA 缓冲区的时间和发送到 TX FIFO 的时间之间不应有任何重叠、 ISR 会在返回主循环之前将整个阵列写入 TX FIFO。 使用您在实现 interrupt_active 解决方法之前编写的代码、您能否在调用 SCI_writeCharArray 之前和之后尝试切换 GPIO、以及在更新 sDataA 之前和之后切换不同的 GPIO、以确认 sDataA 上同时发生读取和写入?

    谢谢!

    卢克

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

    Luke、您好!

    使用这种方法时出现的问题是、尝试后我注意到一些屏幕数据没有被写入。 我认为发生的情况是、如果你在写入 sDataA 缓冲区之前禁用 SCI 中断、并且有一个 TX 正在进行、那么传输就会中断。

    我现在执行它的方法是只在 ISR 例程结束时禁用 SCI 中断(以确保所有数据都已发送)、然后在 sDataA 缓冲区更新后重新启用它。 我在更新 sDataA 缓冲区之后就在主循环的末尾添加了"while" 以等待 ISR 结束、以便在此 ISR 完成之后也会退出主函数、否则不会发生其他 sDataA 更新。

    奇怪的是、我注意到"while"循环有时会卡住。 退出条件是让 bool 标志在 TX ISR 中设置为 false、但有时即使 ISR 已更新也会评估为 true、这有点困难。

    当我将 FIFO 缓冲区大小增加到16时、这种现象会分解所有数据、并且不会进入 while 循环、因为我认为传输发生得快得多。  

    对这种奇怪的行为有什么想法吗?

    再次感谢您提供宝贵意见、

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

    周老师、您好!

    为了说明这一点、在将 FIFO 大小增加到16时不会有问题?

    在主循环或 ISR 中设置代码断点时、您只会遇到您描述的问题吗? 我已经看到、在 ISR 中设置断点时、FIFO 通信外设的行为不同。 您是否还可以尝试在编译器设置中禁用优化、以查看问题是否仍然存在? 如果编译器已将代码修改为与您在.c 文件中看到的代码不同的内容、即使编译的代码在功能上与您编写的代码等效、SOetimse 断点也不会正常运行。

    谢谢!

    卢克

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

    Luke、您好、我确认 在将 FIFO 大小增加到16时没有问题。

    否则、它似乎在成功发送2或3次后被锁定(我已经添加了一个变量 interrupt_count 来计算成功中断的数量)。 我删除了此测试的所有断点、以查看正常使用情况下的行为。

    作为一项实验、在数据缓冲器更新结束时将 FIFO 设置为8、我添加了一个可调延迟 delay_val、最初设置为100 (请参阅下文)。

    通信正常。 我开始减小  delay_val 的值 、一旦达到10、 enable_count1 (请参阅下文)就会 迅速增加。 此时、INTERRUPT_COUNT  变量停止增加。 即使我随后将 delay_val 增加 到100、它也绝不会从该值中恢复、并且 INTERRUPT_COUNT  保持锁定状态。  

    当 FIFO 设为16时解决了这个问题、但我担心在使用期间、在某些情况下通信可能会锁定。  

    //数据缓冲区更新底部的代码(从 main 调用)。

    interrupt_active = true;

    Interrupt_enable (INT_SCIA_TX);
    device_delay_us (delay_val);//初始设置为100。
    while (interrupt_active=true)//块
    {
    //等待数据被发送

    enable_count1++;
    //中断;

    //到 ISR

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

    周老师、您好!

    您能否发送代码以便我了解导致这种情况的原因是什么? 如果可能、演示问题并可在独立 LaunchPad 或控制卡上运行的示例代码对我调试问题非常有帮助。

    谢谢!

    卢克

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

    Luke、您好!

    我有一个 F280025C Launchpad、我可以安排这个工作。 欢迎您进一步了解该优惠。 有什么地方我可以把它私下发送给你吗?

    谢谢

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

    周老师、您好!

    我在 E2E 上向您发送了朋友申请、您可以通过私人消息将申请发送给我。

    Luke

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

    嘿、Steven、我将关闭这个主题、因为这个主题已经转移到私人消息中。