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.
工具/软件:TI-RTOS
尊敬的专家:
我正在研究 UARTTiva 自适应、它支持半双工操作(用于专有总线的主器件实现)。 我不使用 DMA、而是使用中断驱动方法 UARTTiva。
即使我通过以下代码取消屏蔽了 UART 中断屏蔽中的 EOT 位
#define UART_INT_EOT 0x800 //传输结束中断屏蔽
/*启用传输结束中断*/
UARTIntClear (hwAttrs->baseAddr、UART_INT_EOT);
UARTIntEnable (hwAttrs->baseAddr、UART_INT_EOT);
当最后一个位被发送时、我没有得到中断。 调试寄存器视图显示了要取消屏蔽的中断。 在 UART 原始中断状态和 UART 屏蔽中断状态中、当中断发生时(始终仅分别为 TXRIS 或 TXMIS)、我都看不到 EOT 位被置位
通过以下代码将 UART 控制(UARTCTL)寄存器的 EOT 位置位后
UARTDisable (hwAttrs->baseAddr);
HWREG ((hwAttrs->baseAddr)+ UART_O_CTL)|=(UART_CTL_EOT);
UARTEnablehwAttrs->baseAddr;
当中断按预期发生(TXMIS)时、BUSY 标志始终清零、但 EOTRIS 仍始终清零。
是真正支持 EOT 中断的器件、如 TivaTM4C129ENCPDT 微控制器中所述
EOTRIS 数据表(第1323页)?
您好、Charles、
感谢您提供的有用信息、我真的错过了此功能。
然而、这并不是我想要的、因为现在由于中断延迟、UART 在长电报内运行为空。 (这对我的用例来说可能是可以接受的。)
我正在寻找一个真正的 EOT 中断、因此 FIFO 重新加载可以通过 TX 中断及时完成、而 EOT 中断会将 TX 引脚的方向更改为输入以获得高阻抗。 根据数据表、EOTIM 位应启用此中断类型"1当 UARTRIS 寄存器中的 EOTRIS 位置位时、向中断控制器发送中断。"、但 EOTRIS 位似乎从未置位...
我缺少什么吗? 设备或文档是否有缺陷?
数据表不是很清楚、因为"EOT 中断"没有在"19.3.9中断"章节中列出、而是在"19.3.11 DMA 操作"章节中列出:"为了指示 UART 串行器的传输完成、应在 UARTCTL 寄存器中启用传输结束位(EOT 位)。 将 UARTIM 寄存器的 EOTIM 位置位、即可在传输结束时产生中断。"
EOT 中断是否仅在 UARTCTL 寄存器中的 DMA 和 EOT 位置位时有效? 您能解释一下在哪些条件下设置 EOTRIS 位吗? (数据表说明"所有传输数据和标志的最后一位已离开串行器。" 似乎不完整。)
[引用用户="Charles Tsaa"]
[CT]如果启用 EOT、您是否能够看到任何中断? 如果您在 UART ISR 中放置断点、CPU 会在那里暂停吗? 如果答案是肯定的、则会生成 EOT 中断。 如果 EOTRIS 从未设置为从开始、那么无论 EOTIM 位是什么、您都不会收到中断。
[/报价]
您好、Charles、
感谢您的澄清和回答。
我并不完全理解您所说的"如果您启用 EOT":
如果我启用 UART 控制(UARTCTL)寄存器中的 EOT 位并通过将 EOTIM 位设置为1来解除 EOT 掩码、我将获得中断、CPU 会在 UART ISR 中的断点处停止。
我使用以下代码:
静态空 UARTTivaHD_hwiIntFxn (UARg arg) { uint32_t 状态; UARTTivaHD_Object *object =((UART_Handle) arg)-> object; UARTTivaHD_HWAttrs const *hwAttrs =((UART_Handle) arg)->hwAttrs; uint32_t rxErrors; /*清除中断*/ status = UARTIntStatus (hwAttrs->baseAddr、true);
UARTIntClear (hwAttrs->baseAddr、status);//此处为断点 Log_print3 (Diags_User1、"UART HW Intr:状态%d、要写入的%d 字节、IsBusy=%d"、 status、object->writeCount、UARTBusy (hwAttrs->baseAddr); //... }
UARTIntStatus 返回的状态始终为32dec、因此 TX 中断从不为2048dec。 UARTBusy 始终为 false。
这符合预期、不再是我们的主题。
如果我只通过将 EOTIM 位设置为1 (保持 UART_TXINT_MODE_FIFO)来解除 EOT 掩码、则仅当电报长于 FIFO 空间时、我才会看到中断、因此 UARTTivaHD_WRITE 函数会启用 TX 中断。 该中断始终为32dec。 寄存器视图中的 EOTRIS 位始终被清零。
如果电报很短、则根本不会产生中断。
您说的"如果 EOTRIS 从未设置为以开头"是什么意思:由处理器进行设置、还是我必须以某种方式进行设置?
如果您想更深入地了解代码、请参阅项目的以下 zip 文件:
e2e.ti.com/.../uartconsole_5F00_EK_5F00_TM4C129EXL_5F00_TI.zip
也许您可以提供一个具有有效 EOT 中断的小示例代码? 我可以使用它检查我的硬件。
您好!
[引用 user="SProbst"]我不能完全理解您所说的"如果启用了 EOT":[/quot]
我是要用 UART_TXINT_MODE_EOT 调用 UARTTxIntModeSet()? 通过调用 UARTTxIntModeSet(),它将置位 UARTCTL 寄存器中的位4 (EOT 位)以启用 TX 中断的传输结束。 请注意、有两种方法可以产生 TX 中断、一种是达到可编程的 TX FIFO 深度、或当 FIFO 为空且所有位都被发送时。
如果您已经 使用 UART_TXINT_MODE_EOT 调用了 UARTTxIntModeSet(),但仍未看到 EOTRIS 已设置,则可能是因为它。 请注意下面显示的 UARTCTL 寄存器中位4 (EOT)的描述。 通过设置位4、它将确定'TXRIS'位的行为。 当 TXRIS 位置位时、表示 FIFO 已达到指定的 FIFO 深度、或者 FIFO 为空、所有位都已离开串行器。 如果已经用 UART_TXINT_MODE_EOT 调用了 UARTTxIntModeSet()并且只看到 TXRIS 位被置位但没有 EOTRIS 位,那么这可能是发生的情况。 当 TXRIS 位置位时、它间接地表示传输结束刚刚发生。 您可能会问、为什么 TXRIS 和 EOTRIS 不同时设置? 这是一个我需要调查的问题,如果确实如此。 但我需要首先询问您是否已在 UARTCTL 寄存器中设置 UART_TXINT_MODE_EOT。
Sven、您好!
[引用 user="SProbst"]了解数据表的不同之处:
UART_TXINT_MODE_EOT SET => TXRIS 仅在发送最后一位后
UART_TXINT_MODE_EOT 被清零=>仅当通过 FIFO 级别[/报价]时 TXRIS
您的理解是正确的。
[引用 user="SProbst"]如果设置了 UART_TXINT_MODE_EOT、则始终清除忙标志。[/quot]
您何时读取忙标志? 在 ISR 中? 如果您已经设置 了 UART_TXINT_MODE_EOT、那么当发送器空闲时、当所有位都被发送出去并且 FIFO 为空时、就会生成 EOT。 如果发送器处于空闲状态、则标志被清除。
很抱歉、我没有 PC 回家了。 我明天将读取您的代码。
您好、Charles、
是的、我读取 ISR 内部的 BUSY 标志、因此我同意您的意见、即应该将其清除。
我想使用 UART_TXINT_MODE_FIFO (这样 FIFO 不会在电报内运行为空)、但在最后一位离开处理器后仍会产生 EOT 中断。
这是可行的吗?
您好、Charles、
感谢您复制我的观察结果。 总结长帖子:
EOTRIS 不工作、
UART_TXINT_MODE_EOT 中均未设置(UARTCTL 寄存器中的 EOT 位)
UART_TXINT_MODE_FIFO 中也没有(UARTCTL 寄存器中的 EOT 位清零)。
在 UART_TXINT_MODE_EOT 模式(与 TXRIS 重复)下、但在 UART_TXINT_MODE_FIFO 模式下不存在 EOTRIS、这是一个很好的理由。
如果它是数据表的缺陷/模糊或无法判断器件问题。 轮询 UARTBusy 标志(可能在计时器中断中)可能是一种权变措施。 如果 DMA 的工作方式有所不同、则似乎有问题。