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.

[参考译文] UCD3138:复位 UART 模块

Guru**** 2553260 points


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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/743630/ucd3138-reset-uart-module

器件型号:UCD3138

大家好、

 -如果轮询 TX_RDY 位且该位卡在0、如何复位 UART 模块?

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

    UARTCTRL3内部的第7位被称为 SW_RESET、 用于复位 UART。

    此致、

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

    当数据从发送缓冲区复制到移位寄存器以开始传输时、设置 TX_RDY。  

    如果您在 EVM 中查看我们的 init_UART 函数、您将看到此行:

     Uart1Regs.UARTTXBUF.ALL =';//输出一个字节来启动操作。

    这会设置 TX_RDY。  如果没有发送第一个字节、它似乎不会被置位。

    TX_RDY 是比 TX_EMPTY 更好的信号、因为您可以在前一个字节仍在传输时使用它来加载字节。  

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

    您好!

     感谢您的回复。

     -您是说我可以通过将 SW_RESET 设置为1来重置 UART 吗? UCD 本身就会清楚这一点吗?

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

    尊敬的 Ian:

     -请帮助检查这是否正常。 谢谢你。

     if (Uart0Regs.UARTTXST.bit.TX_RDY){
       UART_TX_TIMEOUT = 0;

    (笑声)


     }否则{
       if (UART_TX_TIMEOUT >= UART_TX_TIME){

    (笑声)

         UART_TX_TIMEOUT = 0;

         Uart0Regs.UARTCTRL3.bit.SW_RESET = 1;//添加复位
         Uart0Regs.UARTTXBUF.ALL =';//输出一个字节来启动操作。
       }否则{

         UART_TX_TIMEOUT++;

       }
     }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不建议使用上述代码。 它可能会在消息中间输出一个字节、或在 UART 未就绪时写入一个字节。 复位也可以在传输过程中停止一个字节、这并不是一件好事。

    相反、我会尝试查看是否设置了 TX_RDY 或 TX_EMPTY。 如果设置了其中一个、则可以发送一个字节、如果两个字节都未设置、则不应发送一个字节。

    但是、我对为什么写入字节甚至是必需的有点困惑、因为从器件的角度来看、我在加电时看到 TX_RDY 设置、在 SW_RESET 之后也看到了设置。 您是否实际看到过没有设置 TX_RDY 的芯片? 您的根本问题是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想知道如果 UART 模块停止、我可以做什么。 我知道在正常情况下一切都很好。 然后、PMBus 模块等异常情况下、有时它会停止并将 CLK 拉低。 然后我需要对其进行重置。

    因此、我需要一个函数来检查 UART 是否停止、并尝试将其复位。

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

    UART 没有外部时钟进入。  一旦它获得一个起始位、它就会以给定的波特率对位进行采样、直到它到达字节的末尾、或者您已经将其编程为接收的位数。  我们发现锁定它的唯一方法是在错误的时间向 UARTHBAUD、UARTMBAUD、UARTLBAUD 寄存器写入较低的值。  这会将其锁定、但只会暂时锁定。  如果您不是动态更改波特率、那么您应该不能将其锁定。  

    在消息不完整的情况下、最好在消息上设置某种超时以保持同步、并且最好在一段时间内至少在字节之间设置一次字节宽延迟、以便在字节被截断时允许重新同步。

    当然、最好对消息进行校验和。

    最好是从事务的另一端返回一条消息、说该消息已被接受。  部分原因是收件人无法拉伸时钟、因此您需要确保不会太快地发送消息。

    但是、由于没有外部时钟、死锁不是一个问题。  

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