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.
亲爱的先生们,
我想使用发送中断 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 恰好出现在停止位的末尾之后。
附录是我的代码供参考。
您好、Dennis、
同时启用接收器和发送器解决了问题。 尽管如此、EOT 只属于传输、它的工作应该与启用/禁用接收器逻辑无关。
在应用中、必须确保只有接收或发送有效。 因此、我在启用接收器和启用发送器之间进行了切换、这会导致 EOT 不能正常工作。 现在、我只使用传输和接收中断使能。
感谢您对此问题的支持。