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.

[参考译文] MSPM0L1306:中断控制的 UART 传输:使用 EOT-DON-Interrupt 时出现问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1275347/mspm0l1306-interrupt-controlled-uart-transmission-problems-using-eot-done-interrupt

器件型号:MSPM0L1306

亲爱的先生们,

我想使用发送中断 TX 中断和 EOT 完成中断来发送一个字节缓冲区。 我不使用 FIFO。

这已经可以正常工作、所有字节都已正确发送。 我的问题与最后一个字节有关。

传输最后一个字节时、必须检测到完整字节、包括 停止位被移出(在某些已连接的硬件可被关闭之前)。 因此、当我向发送寄存器写入最后一个字节时、我从 TX 中断更改为 EOT-完成-中断。 TX 中断在停止位的开始、EOT-DONE 中断应在停止位的结束时发生。

很遗憾、我没有获得任何 EOT-DONE-Interrupt。 未设置标志。 使用 TX 中断和 TX 中断标志、一切都很顺利。

有人使用这个 μ µC 上的 EOT-DONE-INTERRUPT 有什么经验吗?

感谢您的支持。

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

    尊敬的 Matthias:

    如何启用 EOT-DONE 中断、以及在代码中的什么位置检查是否设置了该中断?

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

    您好、Dennis、

    以下是基于 SDK 示例的中断函数。
    我不使用 FIFO。
    正确检测到 Rx 和 Tx 中断调用、并调用相应的处理程序。

    void UART0_IRQHandler (void)   //来自 TI 示例
    {
    开关(DL_UART_Main_getPendingInterrupt (UART_0_INST))
    {
     案例 DL_UART_MAIN_IIDX_RX:
      IRQ__vHandlerUartRx ();
     中断;

     案例 DL_UART_MAIN_IIDX_TX:
      IRQ__vHandlerUartTx ();
     中断;

     案例 DL_UART_MAIN_IIDX_EOT_DONE:
      IRQ__vHandlerUartEotDone ();
     中断;

     默认值:
     中断;

    正确接收主器件发送的消息、然后正确设置发送缓冲区、缓冲区的中断控制发送也会起作用。
    对于每个 TX 中断、缓冲器的一个字节被写入发送寄存器。

    但是、由于 TX 中断在停止位的开始时触发(然后发送寄存器为空、下一个字节)、我需要 EOT-DON-INTERRUPT 来代替最后一个字节、以便在最后一个字节的停止位结束时调用该中断。 只有这样、我才能正确控制连接的硬件。
    只使用 TX 中断将需要插入一个位时间的延迟。 这可以正常工作、但不可预期、因为 EOT-DONE 是此特性的特点。

    如果最后一个字节被写入发送寄存器、我希望下一个中断为 EOT-DONE-IRQ、而不是 TX-IRQ。
    发送中断原则上为:

    void IRQ__vHandlerUartTx (void)
    {
     DL_UART_Main_translData (UART_0_INST、(* Sendbuf++);  //发送字节的发送缓冲区并指向 Next
     ByteCount++;   //增加发送的字节的计数

     if (ByteCount >= BytesToSend)   //检查它是否是传输到 TX 缓冲区的最后一个字节并启用 EOT-DONE
     {  
      DL_UART_Main_disableInterrupt (UART_0_INST、DL_UART_MAIN_INTERRUPT_TX);
      DL_UART_Main_enableInterrupt (UART_0_INST、DL_UART_MAIN_INTERRUPT_EOT_DONE);

      //现在下一个中断应该是 EOT-DONE-IRQ,而不是 TX-IRQ。
     }

    这是 EOT-DONE-handler、如果要发送的最后一个字节被完全移出、则应调用该函数:
    遗憾的是、该函数未从 aboce 开关/案例调用。

    void IRQ__vHandlerUartEotDone (void)
    {
      DL_UART_Main_disableInterrupt (UART_0_INST、DL_UART_MAIN_INTERRUPT_EOT_DONE);
      Re 启用接收();

    您是否知道我在禁用 TX 中断和启用 EOT-DON-Interrupt 时出了什么问题?

    谢谢你。

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

    尊敬的 Matthias:

    我对答复的拖延表示歉意。  TRM 中尚不清楚具体的用法。  但它确实表示它是在最后一位离开串行器时生成的、我不确定这对于 UART 还是其扩展模式、LIN、DALI 等是否正确。

    我将其设置为与您看到的内容重复。

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

    尊敬的 Matthias:

    EOT 中断的行为似乎与 TRM 中的描述不一致。 我尝试了3种不同的场景来查看何时产生 EOT 中断。  如下图所示、我在 TXINT 和 EOT ISR 处理程序中设置、然后清除和 IO 引脚(生成脉冲)、以显示是否以及何时进入处理程序的该部分。

    在顶部迹线中、设置 TXINT 后到发送下一个字节之间有很长的延迟。  我这样做是为了产生长时间延迟。  您会注意到 EOT 确实会出现、但并不是我预期的那样。  它出现在下一个字节的起始位。   

    我重复这些步骤、使延迟越来越小、直到没有 EOT。

    我将与我们的设计人员一起了解原因。

    如果事实证明这是该行为、那么答案是肯定的、则您需要具有某种类型的延迟。  您可以在"一次性"模式下使用具有所需延迟的计时器。  然后、在发送最后一个字节时、可以启动计时器计时器。  当定时器周期结束时、定时器可以生成中断、然后您可以执行必要的操作。

    我将告诉您设计师的看法。

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

    尊敬的 Matthias:

    为了向您提供有关此问题的最新信息、我目前正在与我们的设计工程师讨论此问题。  我已经为他们提供了演示问题的代码示例、现在等待他们查看内部时序。  他们很可能会在周一(印度设计师)提供有关这方面的答案。

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

    尊敬的 Matthias:

    我还在等待设计团队通过仿真验证 UART 逻辑、但与此同时、如果很有可能是在错误的时间生成了 EOT、 或者根本不需要(基于我之前的实验)、我们需要制定相关的解决方案。  我的第一个想法是使用单次触发模式的计时器、以便在适当的时间生成中断。  由于您是在加载 TXBUF 而不是加载 TXFIFO、因此您知道何时会发送最后一个字节。  您可以启动计时器。  这样可行吗?

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

    您好、Dennis、

    遗憾的是、应用中没有任何空闲计时器。 否则,我相信你的建议会起作用。
    您希望 TI 设计团队何时解决此问题?

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

    尊敬的 Matthias:

    我的上一次沟通是今天。  他们在试图弄清楚为什么在代码中执行 EOT 时看起来不被设置、而是在对仿真执行时序分析时进行设置。  我明天晚上(2012年10月10日)与他们通话进行讨论。

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

    尊敬的 Matthias:

    我们的设计人员推荐以下各项。  

    1.同时启用 RX 和 TX (我假设你这样做是因为你在 ISR 中显示了一个 RX 处理程序、但需要确保)。  我没有。  由于某种原因、我启用了 TX。  对我来说、启用两者都能解决我这边的问题。

    2.启用 RX 引脚上的上拉电阻,以确保其始终为逻辑"1"

    我验证了它能在我的代码上正常工作。 让我知道它是否适合您。

    这是我的逻辑探头时序。  您可以看到 EOT 恰好出现在停止位的末尾之后。

    附录是我的代码供参考。

    e2e.ti.com/.../uart_5F00_eot_5F00_issue_5F00_mspm0l1306.zip

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

    您好、Dennis、

    同时启用接收器和发送器解决了问题。 尽管如此、EOT 只属于传输、它的工作应该与启用/禁用接收器逻辑无关。

    在应用中、必须确保只有接收或发送有效。 因此、我在启用接收器和启用发送器之间进行了切换、这会导致 EOT 不能正常工作。 现在、我只使用传输和接收中断使能。

    感谢您对此问题的支持。