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.

[参考译文] CCS/UCD3138A64OEVM-662:通过 UART 连接 WIFI

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/788507/ccs-ucd3138a64oevm-662-interfacing-wifi-via-uart

器件型号:UCD3138A64OEVM-662
主题中讨论的其他器件:UCD3138A64UCD3138128

工具/软件:Code Composer Studio

您好、先生、您能不能详细介绍如何通过 UCD3138a64中的 UART 引脚连接 WIFI (ESP8266)模块、也可以提供一些程序或小细节。 谢谢你。

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

    工程师正在对此进行研究、并将作出响应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您查看我们的大多数 EVM 代码、您应该会看到一个示例 UART 初始化代码以及要使用它的代码。 在我们的电源代码中、通常我们为接收数据的 UART 使用4800波特。 这意味着我们可以仅轮询10KHz 中断中的接收数据。 实际上、至少在理论上、您可以以高达100K 波特的波特率进行轮询、因为字节速率将是位速率的1/10、因为有8位数据、加上一个停止位和一个开始位。 我们从后台循环传输数据、因为我们控制自己的传输速率。

    确保电源安全运行是第一要务、因此您需要小心、不要让串行接口实时运行。 我不知道通过 ESP8266连接 WiFi 接口的要求是什么。 但是、除了上述需要首先进行电源控制和监控之外、UCD 上的 UART 与通用简单 UART 完全没有区别。 它通过一个位集和一个可选中断告诉您它有一个字节。 它还会告诉您它何时准备好接受一个字节。 这两个字节都是缓冲的、因此您可以在发送字节时将字节放入缓冲区、并且可以在另一个字节进入时从缓冲区读取一个字节。 如果您可以找到为该类型的 UART 编写的代码-即没有 DMA 或更大缓冲区的代码-您应该能够在 UCD 上使用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如何在 UART 中输入 AT 命令、就像我之前在另一个平台中所做 的那样、请键入一条或两条命令作为语法、并且我正在使用 UART1

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    上面显示的问题是、只要您发出字符串、它就会长时间绑定后台任务。 我不认为这是一个运行电源的好主意、因为在后台应该有其他任务、如 PMBus。

    如果您想按上面的方式执行此操作、这实际上是 C 语言编程、而不是与 UCD 专门相关。 我真的不想在这个论坛上提供基本 C 语言编程建议的先例。

    若要使用 UART0 Ps 发送字符串,您需要使用函数调用中交给您的字符串指针,并有一个循环,等待 UART 准备好发送另一个字节,然后将该字节写入 UART 硬件缓冲寄存器。 然后指向该字符串中的下一个字节。
    当字符串中的下一个字节是 EOF 时、您将停止、因为 EOF 标记了字符串的末尾。

    您可以在 C 语言编程手册的字符串变量部分看到一些示例。

    为了使其成为后台任务、我将具有函数调用- UART_TX_handler。 我会有一个表示 UART TX 忙的标志和一个字符指针。

    如果您仍想使用 uart0_PUT、我会让它将指向所需字符串的指针加载到字符指针中、然后设置 UART_TX_BUSY 标志。

    我会在后台循环中调用 UART_TX_handler。

    UART_TX_handler 将首先检查 UART_TX_BUSY 标志是否已设置。 如果是、它将检查 UART 是否已准备好接受数据。 如果是、它将检查指针指向的字节。 如果字节为 EOF、它将清除 UART_TX_BUSY 标志。 否则、它会将字节写入 UART 硬件寄存器、并使指针递增。

    如果要发送一系列文本消息、则需要一个状态机、该状态机具有每条消息的状态。 它将启动消息、然后等待 UART_TX_BUSY 标志被清除、然后再启动下一条消息。 如果希望消息之间出现延迟、可以将固件计数器放置在标准中断中、该中断由状态机加载并具有所需时间、然后由中断计数到0。 状态机可以等待计时器变为零、然后进入下一状态。 这比使用多线程操作系统更有效、但时间效率要高得多。 一旦您习惯了它、就可以快速写入它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我必须将波特率设置为115200,值是多少。 例如202表示9600。 115200的情况是什么
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您希望使用16 (十进制)

    公式为(1953125/波特率)-1

    如果您使用115200、它将很快进入-您将无法使用正常标准中断进行轮询。   

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

    SIR 您已经在 UART 社区中发布了 UART 程序,它 在 UART 0引脚上运行良好。 我在初始化过程中在 UART1上遇到的问题

    (三

    下面的代码在 UART 0上正常运行、但在编辑 UART1后应用相同的代码未正常运行

    void init_uart0 (void)

    volatile unsigned char rx_BYTE;

    Uart0Regs.UARTCTRL3.bit.SW_RESET = 0;//初始化 UART 时软件复位

    Uart0Regs.UARTCTRL0.bit.data_size = 7;//8位
    Uart0Regs.UARTCTRL0.bit.STOP = 1;/2停止位
    Uart0Regs.UARTCTRL0.bit.SYNC_MODE = 1;//异步模式

    Uart0Regs.UARTHBAUD.bit_BAUD_DIV_H = 0;
    Uart0Regs.UARTMBAUD.bit.BAUD_DIV_M = 0;
    Uart0Regs.UARTLBAUD.bit.BAUD_DIV_L = 49;//对于38400 //对于控制板为47,对于开环为44

    Uart0Regs.UARTRRXST.bit.RX_ENA=1;//启用 RX

    Uart0Regs.UARTTXST.bit.TX_ENA=1;//启用 TX

    UART0Regs.UARTINTST.ALL = 0xff;//这两条语句应清除状态位
    Uart0Regs.UARTINTST.ALL = 0;

    RX_BYTE = Uart1Regs.UARTRXBUF.bit.RXDAT;//清除 RXRDY 标志

    Uart0Regs.UARTIOCTRLTX.bit.IO_FUNC = 1;//启用发送引脚
    Uart0Regs.UARTIOCTRLRX.bit.IO_FUNC = 1;//启用接收引脚

    Uart0Regs.UARTCTRL3.bit.clock = 1;//内部时钟选择;
    Uart0Regs.UARTCTRL3.bit.SW_RESET = 1;//软件复位已释放 UART 初始化完成?

    Uart0Regs.UARTIOCTRLSCLK/bit.IO_FUNC = 0;//禁用 UART 的外部时钟。

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


    空字符_out_0 (字符数据)

    volatile char rx_Byte;

    while (Uart0Regs.UARTTXST.bit.TX_RDY = 0)

    if (Uart0Regs.UARTRXST.bit.RX_RDY = 1)

    RX_BYTE = Uart0Regs.UARTRXBUF.bit.RXDAT;//清除 RXRDY 标志

    PMBus_handler ();

    Uart0Regs.UARTTXBUF.ALL = DATA;//输出一个字节

    *********

    您能否发送 UART1、以便我可以将 AT 命令发送到 wifi。

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

    主席先生,请答覆上述的问题

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

    UART 0和 UART 1之间不应存在差异。 当您说它不起作用时、您的意思是什么?  例如、如果您尝试在发送引脚上持续输出一个字节、会发生什么情况? 您是否看到它出现在示波器上? 波特率是否正确? 如果您使其正常工作、那么如果您将该字节放入接收端会发生什么情况? 这奏效了吗?

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

    不、先生、UART1的情况并非如此。 但 UART0工作正常。 我们只需从 UART 串行发送字符。  

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

    为了确保这一点、我尝试了 UCD3138128上的 UART1、除了存储器大小外、它与 A64相同。  它工作正常、至少在传输过程中是如此。  我没有测试接收端。  

    以下是初始化代码:

    void init_uart1 (void)

    易失性 uint32 rx_Byte1;//volatile、用于发出关于设置但不读取的警告

    Uart1Regs.UARTCTRL3.bit.SW_RESET = 0;//初始化 UART 时软件复位

    Uart1Regs.UARTCTRL0.bit.data_size = 7;//8位

    Uart1Regs.UARTCTRL0.bit.STOP = 1;/2停止位

    Uart1Regs.UARTCTRL0.bit.SYNC_MODE = 1;//异步模式

    Uart1Regs.UARTHBAUD.ALL = 0;

    Uart1Regs.UARTMBAUD.ALL =波特率值 M;

    Uart1Regs.UARTLBAUD.ALL = BAUD_RATE _VALUE L; //对于38400 //对于控制板为47,对于开环为44

    Uart1Regs.UARTRRXST.bit.RX_ENA=1;//启用 RX

    Uart1Regs.UARTTXST.bit.TX_ENA=1;//启用 TX

    UART1Regs.UARTINTST.ALL = 0xff; //这两条语句应清除状态位

    Uart1Regs.UARTINTST.ALL = 0;

    RX_BYTE1 = Uart1Regs.UARTRXBUF.ALL;//清除 RXRDY 标志

    Uart1Regs.UARTIOCTRLTX.bit.IO_FUNC = 1;//启用发送引脚

    Uart1Regs.UARTIOCTRLRX.bit.IO_FUNC = 1;//启用接收引脚

    Uart1Regs.UARTCTRL3.bit.clock = 1;//内部时钟选择;

    Uart1Regs.UARTCTRL3.bit.SW_RESET = 1;//软件复位已释放 UART 初始化完成?

    Uart1Regs.UARTIOCTRLSCLK/bit.IO_FUNC = 0;//禁用 UART 的外部时钟。

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


    为了测试它,我从下载了 LLC 代码

    我缩小了主函数、以便它所做的就是初始化 PMBus 和 UART1、然后输出一个字符:

    void main()

    init_uart1();

    INIT_PMBus (88);

    for (;;)

    CHAR_OUT (0xAA);

    我更改了 char_out 以切换到 uart1、并添加对 PMBus_handler 的调用:

    void char_out (char 数据)

    while (Uart1Regs.UARTTXST.bit.TX_RDY = 0)

    PMBus_handler ();

    Uart1Regs.UARTTXBUF.ALL = DATA;//输出一个字节


    我还不得不说:

    #include "PMBus_common.h"

    以避免出现警告消息。  

    我建议您尝试相同的方法、看看它是否适合您。  这样、就没有其他代码会使事情变得混乱。  

    我一直在尝试考虑可能阻止它工作的因素、在我看来、也许 GLBIOEN 寄存器中的位正在被置位?  这会将这些位的控制权从 UART 中带走、并将其提供给全局 IO 逻辑。

    如果是我、我会说我可能完全看错了引脚、但可能没有人会犯这个错误。  或者、外部可能有一些硬件使事情混乱-例如、您将一 个器件的 TX 连接到另一个器件的 TX、将 RX 连接到 RX。