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.

[参考译文] CC2652R7:UART2硬件流控制不能正常工作

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1121086/cc2652r7-uart2-hardware-flow-control-doesn-t-work-as-expected

器件型号:CC2652R7
Thread 中讨论的其他器件:SysConfig

您好!  

我们正在尝试使用 UART2上的硬件流控制(CTS/RTS)与另一个器件进行通信、以免因突发数据传输中的缓冲区溢出而丢失任何数据。

我们认为 SysConfig 并不是很困难、但它不像我们预期的那样工作。 我们所做 的就是在 UART2上启用"流控制"、然后将 CTS/RTS 分配给 SysConfig 中 PinMux 配置中的特定 GPIO。

因此、即使对等器件将 RTS (CC2652R7上的 CTS)设置为低电平、CC2652R7也不会停止传输数据。

我们发现、即使在 SysConfig 上使用此设置UART2CC26X2.c 驱动程序中的以下代码也无法正确启用 CTS/RTS。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
* If Flow Control is enabled, configure hardware flow control
* for CTS and/or RTS.
*/
if (UART2CC26X2_isFlowControlEnabled(hwAttrs) &&
(hwAttrs->ctsPin != GPIO_INVALID_INDEX)) {
uartEnableCTS(hwAttrs->baseAddr);
}
else {
uartDisableCTS(hwAttrs->baseAddr);
}
if (UART2CC26X2_isFlowControlEnabled(hwAttrs) &&
(hwAttrs->rtsPin != GPIO_INVALID_INDEX)) {
uartEnableRTS(hwAttrs->baseAddr);
}
else {
uartDisableRTS(hwAttrs->baseAddr);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这可能是由于在 SysConfig 中启用流控制后、ctsPinMux 和 rtsPinMux 似乎在 ti_drivers_config.c 的硬件属性中正确设置、 但 ctsPin 和 rtsPin 仍然设置为 GPIO_INVALID_INDEX、即使我们看到 CONFIG_GPIO_UART2_0_CTS 和 CONFIG_GPIO_UART2_0_RTS 是在 GPIO 部分创建的。

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static const UART2CC26X2_HWAttrs uart2CC26X2HWAttrs[CONFIG_UART2_COUNT] = {
{
.baseAddr = UART1_BASE,
.intNum = INT_UART1_COMB,
.intPriority = (~0),
.rxPin = CONFIG_GPIO_UART2_0_RX,
.txPin = CONFIG_GPIO_UART2_0_TX,
.ctsPin = GPIO_INVALID_INDEX,
.rtsPin = GPIO_INVALID_INDEX,
.flowControl = UART2_FLOWCTRL_HARDWARE,
.powerId = PowerCC26XX_PERIPH_UART1,
.rxBufPtr = uart2RxRingBuffer0,
.rxBufSize = sizeof(uart2RxRingBuffer0),
.txBufPtr = uart2TxRingBuffer0,
.txBufSize = sizeof(uart2TxRingBuffer0),
.txPinMux = IOC_PORT_MCU_UART1_TX,
.rxPinMux = IOC_PORT_MCU_UART1_RX,
.ctsPinMux = IOC_PORT_MCU_UART1_CTS,
.rtsPinMux = IOC_PORT_MCU_UART1_RTS,
.dmaTxTableEntryPri = &dmaUart1TxControlTableEntry,
.dmaRxTableEntryPri = &dmaUart1RxControlTableEntry,
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

此外、我们还尝试通过调用以下函数来强制启用 CTS/RTS、而不管 UART2硬件属性中的引脚设置如何、对等器件的硬件流控制似乎工作正常。

Fullscreen
1
2
uartEnableCTS(hwAttrs->baseAddr);
uartEnableRTS(hwAttrs->baseAddr);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

因此、我们需要您的帮助、以了解如何使 UART2的硬件流控制正常工作、而不会混淆驱动程序代码、但只能使用 SysConfig 上的简单配置

SDK 版本:simplelink CC13xx_CC26xx SDK 5.30.01.01。

谢谢。

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

    您好、NaoU、

    感谢您报告此问题、我也从我的结尾复制了此问题。  我将此行为报告给 SysConfig 开发团队以待解决、同时您可能可以尝试在中进行以下更改 /source/ti/drivers/.meta/uart2/UART2CC26XX.Board.c.xdt:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % if (inst.flowControl) {
    /*
    * Broken code to be removed and replaced with working version
    % ctsPinName = 'ctsPin' in inst ? inst.ctsPinInstance.$name : 'GPIO_INVALID_INDEX';
    % rtsPinName = 'rtsPin' in inst ? inst.rtsPinInstance.$name : 'GPIO_INVALID_INDEX';
    */
    % ctsPinName = inst.ctsPinInstance.$name;
    % rtsPinName = inst.rtsPinInstance.$name;
    % flowName = 'UART2_FLOWCTRL_HARDWARE';
    % }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此致、
    Ryan

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

    谢谢 Ryan、

    我们将在测试结果后通知您。

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

    您好、Ryan、

    该解决方案按预期工作。

    非常感谢!

x 出现错误。请重试或与管理员联系。