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.

[参考译文] CC3200:将 GPIO 引脚转换为 UART

Guru**** 2769425 points

Other Parts Discussed in Thread: CC3200, CC3200SDK

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/667499/cc3200-converting-gpio-pins-to-uart

器件型号:CC3200

您好!

我正在执行一个项目、其中我必须将 BLE、GSM、触摸屏连接到 CC3200。 CC3200有2个 UART、但我的工作需要4个 UART。 是否有任何方法将 GPIO 引脚用作 TX/RX?

请帮助!

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

    您好、Manu、

    TI 没有将 GPIO 用作 CC3200的 UART 的示例、但您可以尝试将 GPIO 用作软件驱动的 UART 解决方案。 您可以在线找到许多不同的用于将 UART/RS232与 GPIO 进行位拆裂的实现方案。

    其中一种实现方式使用硬件计时器+ GPIO 来实现 UART:

    http://www.ti.com/lit/an/slaa083/slaa083.pdf

    其理念是设置一个硬件计时器、该计时器以等于 UART 波特率的频率进行中断。 当该计时器中断时、您可以分别为 RX/TX 对 GPIO 进行采样或设置 GPIO 引脚。  在此基础上、您可以有一些缓冲方案、允许您的应用持续获取数据/将数据放入计时器将用于 所需接收/发送操作的缓冲区中。

    根据您是否同时使用所有 UART 器件、另一种可能适用于您的应用的解决方案是将您的器件连接到多组可能的 UART 引脚、 然后在需要时将 UART 信号多路复用到所需的连接。

    在 pinmux.c 中、通常会对引脚复用进行一次性配置。 但是、您也可以根据需要在应用中更改引脚复用。

    例如、如果您有四个器件、则可以使用 UART0将一个器件连接到引脚55/57、使用 UART1将另一个器件连接到引脚1/2。 然后、将第三个器件连接到引脚3/4、将第四个连接到引脚58/59、这也是 UART0/UART1各自允许的引脚。 然后,您的应用程序可以通过调用 PinModeSet()将 UART 信号多路复用到所需器件的引脚来控制哪个器件可以访问 UART 外设。 这样、您就可以有效地与两个器件共享一个 UART。

    我希望这有助于澄清您的选择。 请尝试一下、让我知道它是如何工作的。

    此致、
    Michael

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Michael、
    感谢您的回复。它对我们帮助很大。

    我们发现第二种方法(即 PinModeSet())更适合我们的项目。此函数是库函数还是用户定义的函数?如果这是库函数,您能告诉我们可以在哪个库中找到该函数吗?

    由于我是此板的初学者、我无法解释您的建议并在我的项目中实现相同的功能。

    我们的问题是需要4个 UART、但 CC3200只有2个 UART。 请建议解决此问题的任何可能方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Manu、

    PinModeSet()包含在 "${CC3200_SDK_ROOT}/driverlib/ccs/Release/driverlib.a 库中。 该函数的实现可在 CC3200SDK_1.3.0\cc3200-sdk\driverlib\pin.c 中找到。 但是、该实现是对某些硬件寄存器的非常简单的设置、与传递到函数中的完全相同。

    如果您查看默认情况下包含在 SDK 分发的示例中的 pinmux.c 文件、则通常会在程序初始化期间一次性配置所需的所有引脚。 例如,在 UART_DMA 项目中,pinmux.c 具有启用 UART 外设时钟的 PinMuxConfig()函数,然后将 UART 多路复用为封装引脚55和57。 PinTypeUART()也可以在 pin.c 中找到,它所做的就是为您配置输出引脚的驱动强度以及多路复用 UART 信号。

    现在、如果您希望与4个 UART 器件通信、但只有2个 UART、则可以将器件的引脚复用功能用作多路信号分离器、其中有一个 UART 信号可切换到两个不同的输出。 要在两个器件之间进行选择,您可以调用具有以下类似内容的 PinModeSet()函数:

    空 UART0_SwitchToDeviceA{
    //假设器件 A 连接到引脚55/57 UART0 TX/RX
    //假设器件 B 连接到引脚3/4 UART0 TX/RX
    PinModeSet (PIN_03、PIN_MODE_0);
    PinModeSet (PIN_04、PIN_MODE_0);
    PinModeSet (PIN_55、PIN_MODE_3);
    PinModeSet (PIN_57、PIN_MODE_3);
    }
    void UART0_SwitchToDeviceB{
    //假设器件 A 连接到引脚55/57 UART0 TX/RX
    //假设器件 B 连接到引脚3/4 UART0 TX/RX
    PinModeSet (PIN_55、PIN_MODE_0);
    PinModeSet (PIN_57、PIN_MODE_0);
    PinModeSet (PIN_03、PIN_MODE_7);
    PinModeSet (PIN_04、PIN_MODE_7);
    } 

    您可以参阅 CC3200 TRM 表16-7 (第482页)、了解每个封装引脚的可能引脚映射、以及需要为 UART1执行的引脚复用设置。 请注意、您需要将不活动的 UART 器件引脚重置为 GPIO (PIN_MODE_0)、以防止总线争用。

    您需要从此处了解如何在同一 UART 外设上运行的两个不同 UART 器件之间安全切换、例如如何处理两个 UART 器件希望同时与 CC3200通信的情况。 这对于 UART RX 尤其成问题、因为根据定义、您可以随时异步获取数据而不发出警告。 处理这种情况的适当方法取决于您拥有哪种 UART 器件、它们是否仅为 TX、仅为 RX、您是否利用了侧通道流控制方法等

    我希望这有助于您了解如何在两个不同的器件之间共享 UART 外设。

    此致、

    Michael