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.

[参考译文] RTOS/TM4C129ENCPDT:半双工 UART 驱动程序- EOT 中断不工作

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/715831/rtos-tm4c129encpdt-half-duplex-uart-driver---eot-interrupt-not-working

器件型号:TM4C129ENCPDT
主题中讨论的其他器件: TM4C123

工具/软件: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 中断的器件、如 TivaTmTM4C129ENCPDT 微控制器中所述
EOTRIS 数据表(第1323页)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    请尝试使用 UART_TXINT_MODE_EOT 来启用传输结束。

    30.2.2.47 UARTTxIntModeSet
    设置 UART 发送中断的工作模式。
    原型:
    无效
    UARTTxIntModeSet (uint32_t ui32Base、
    uint32_t ui32模式)
    参数:
    ui32Base 是 UART 端口的基地址。
    ui32Mode 是发送中断的操作模式。 可能是这样
    UART_TXINT_MODE_EOT 在发送器空闲时触发中断、或
    根据当前发送 FIFO 深度触发 UART_TXINT_MODE_FIFO。
    描述:
    此函数允许设置 UART 发送中断的模式。 默认情况下、
    当 FIFO 深度低于通过设定的阈值时、发送中断有效
    调用 UARTFIFOLevelSet()。 或者、如果在 ui32Mode 设置为的情况下调用此函数
    UART_TXINT_MODE_EOT 时、一旦发送器完全被置为有效、发送中断就会被置为有效
    空闲-发送 FIFO 为空、所有位、包括任何停止位、都已清零
    发送器。
    注:
    传输结束模式的可用性因使用的 Tiva 部件而异。 请参阅
    用于确定是否提供此支持的器件的数据表。
    返回:
    无。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、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 位吗? (数据表说明"所有传输数据和标志的最后一位已离开串行器。" 似乎不完整。)

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

     Sven、您好!

     请从中断部分摘录以下内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我的最后一条回复在我完成之前已发出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我正在寻找一个真正的 EOT 中断、因此 FIFO 重新加载可以通过 TX 中断及时完成、而 EOT 中断会将 TX 引脚的方向更改为输入以获得高阻抗。 根据数据表、EOTIM 位应启用此中断类型"1当 UARTRIS 寄存器中的 EOTRIS 位置位时、向中断控制器发送中断。"、但 EOTRIS 位似乎从未置位...

    [CT]如果启用 EOT、您是否能够看到任何中断? 如果您在 UART ISR 中放置断点、CPU 会在那里暂停吗? 如果答案是肯定的、则会生成 EOT 中断。 如果 EOTRIS 从未设置为从开始、那么无论 EOTIM 位是什么、您都不会收到中断。

    EOT 中断是否仅在 UARTCTL 寄存器中的 DMA 和 EOT 位置位时有效? 您能解释一下在哪些条件下设置 EOTRIS 位吗? (数据表说明"所有传输数据和标志的最后一位已离开串行器。" 似乎不完整。)

    [CT] EOT 是否独立于 DMA 模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="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。  

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    "但我需要首先询问您是否已在 UARTCTL 寄存器中设置 UART_TXINT_MODE_EOT。 "
    在第一个测试用例中:是
    在第二个测试案例中:否
    请参阅上面我的帖子。

    我理解数据表有一些不同:
    UART_TXINT_MODE_EOT SET => TXRIS 仅在发送最后一位后
    UART_TXINT_MODE_EOT 被清零=>仅当通过 FIFO 电平时 TXRIS

    这也更适合我的调查、即如果设置了 UART_TXINT_MODE_EOT、则始终清除 BUSY 标志。
    您能调查一下吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    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 中断。

    这是可行的吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sven、您好!
    不幸的是,它们是相互排斥的。 如果您选择 UART_TXINT_MODE_FIFO、则当 TX FIFO 降至可编程阈值以下时、会在移位寄存器位于中间并移出串行数据时生成中断。 请注意、EOT 也意味着 FIFO 也必须为空。 它不仅仅是在每帧移位所有位之后。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    我同意、在 UART_TXINT_MODE_FIFO 中、只有当 FIFO 低于设置的阈值时、才会发生由于 TXRIS 而产生的中断。 但是、当最后一位离开处理器(FIFO 也为空)时、由于 EOTRIS 产生的第二个中断应该会发生。 这就是我如何理解 EOTRIS 位的数据表说明。 如果该位从未被置位、该位的用途是什么?
    您能否联系处理器的设计人员以获取有关 EOTRIS 位的更多信息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Sven、您好!

     请参阅以下说明、其中指出如果选择了 EOT、则会忽略 TXIFLSEL。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    我不理解您的上一篇帖子。 我想使用 UART_TXINT_MODE_FIFO 模式、因此 UARTCTL 中的 EOT 位会被清零。
    我的问题是、为什么我没有获得 EOT 中断。 我在数据表中找不到任何提示、即需要为 EOT 中断设置 UARTCTL 中的 EOT 位。 解除 EOTRIS 屏蔽应该足够了。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sven、您好!
    我同意数据表在这方面并不十分明确。 数据表显示 EOT 对 TXRIS 位的行为有影响。 这意味着如果 EOT 被置位、那么在 FIFO 为空并且最后一位从串行器中移出后、TXRIS 将被置位。 我认为我们同意这一点。 如果您考虑一下、如果 TXRIS 在最后一位移位后已经指示 TX 完成、EOTRIS 位的用途是什么? 他们是否只是重复相同的状态? 考虑到这一点、我想了解 TM4C123数据表中对它的描述。 我并不奇怪、EOTRIS 应该定位的位字段被标记为保留。 如果看一下 UARTIntEnable() API,则甚至没有用于 UART_INT_EOT 的宏。 您试图自己定义此宏。 我怀疑 EOTRIS 是否会在任何条件下设置。 话虽如此,我明天也会和一些专家谈谈。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    有关 EOTRIS 问题的新闻吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sven、您好!
    很抱歉耽误你的回答。 我上周与我的同事进行了交谈、他说他的理解与数据表相同、即 UART 位决定 TXRIS 位的设置方式。 如果 UARTCTL 寄存器的 UART 位置位、则在所有位移出且 FIFO 为空后、TXRIS 位置位。

    我自己运行了一些代码、根本看不到 EOTRIS 位被置位、不管 UART 位是否被置位。 这证明了我在最后一个答复中的推理。 当 TXRIS 置位时、表示传输结束、没有任何用途来置位将指示相同状态的 EOTRIS。 在 FIFO 模式下、ROTRIS 也不会置位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、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 的工作方式有所不同、则似乎有问题。