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.

[参考译文] 当 SCI TX 移位寄存器变为空时、我需要一个中断

Guru**** 2482105 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LS0432

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/716243/i-need-an-interrupt-when-sci-tx-shift-register-becomes-empty

主题中讨论的其他器件:HALCOGENTMS570LS0432

我使用的是 HALCOGEN 和 FreeRTOS 提供的 SCI 驱动程序。 我使用 GIO 向外部 RS485收发器发送使能线路。 当我需要传输时、我升高 GIO 并进行传输。 我的问题是、传输完成后、我需要清除 GIO。 当 TX_LENGTH 为零时,我尝试清除 linHighLevelInterrupt()中的 GIO,但 GIO 太早清除,收发器不会发送最后一个字节。 在 TX 移位寄存器发送完所有位之前、我似乎得到了 TX 就绪中断。 当传输真正完成时、如何获得中断? 以下是我对 linHighLevelInterrupt()开关案例12的修改:

   案例12U:
       /*发送*/
      /*SAFETYMCUSW 30 S MR:12.2、12.3 "用于发送/接收轮询和中断模式下的数据计数"*/
        -g_sciTransfer_t.TX_length;
      
       如果((g_sciTransfer_t.TX_length)> 0U)
       {
         uint8 txdata =* g_sciTransfer_t.TX_data;
           scilinREG->TD =(uint32)(txdata);
           /*SAFETYMCUSW 567 S MR:17.1,17.4 "需要指针增量"*/
           G_sciTransfer_t.TX_DATA++;
       }
       其他
       {
           scilinREG->CLEARINT = SCI_TX_INT;
           sciNotification (scilinREG、(uint32) SCI_TX_INT);
           
             //如果 TX 发送 reg 为空,则我们可以
             //关闭使能线
              gioSetBit (gioPORTA、LIN_EN、false);
       }
       中断;

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

    通常、在从 SCITD 到 SCITXSHF 的第一次传输之后会生成发送中断、然后您可以使用 TX 空标志来监控 SCITXSHF 和 SCITD 寄存器。 当 SCITXSHF 和 SCITD 寄存器都为空时、SCI 设置 TX 空标志。

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

    我使用的是 TMS570LS0432和 FreeRTOS。

    这个应答需要一些任务来运转、等待 TX 空标志变为高电平。 我当然不想在 ISR 中运行。 我真的不想依赖我的任务、因为它每10毫秒唤醒一次、并且在传输完成后保持 GIO 线路的时间太长。

    简短回答:TX 空标志变为高电平时是否没有中断? 这令人失望。

    我的示波器显示、在9600波特下、从我获得最后 一个 SCI_TX_INT 中断到传输实际上完全从 RS485端口传递出去的时间、大约需要1.75ms。 我的解决方法是在 FreeRTOS 中创建一个专用于清除 GIO 的任务。 当获取 SCI_TX_INT 中断且 TX_LENGTH 为零时、我将唤醒此任务;它执行2毫秒的 vTaskDelay、丢弃 GIO 线路、然后执行 vSuspend。 在传输清除 RS485线路后、这一特性始终保持使能 GIO 0.256ms。

    在传输清除 RS485线路后、我会更高兴能够立即丢弃线路、但这非常接近。