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.

[参考译文] CC2642R:将 UART2驱动器用于 RTS/CTS 引脚控制以实现半双工 RS485?

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1188550/cc2642r-using-uart2-driver-for-rts-cts-pin-control-to-get-to-half-duplex-rs485

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

我一直在这个上的衬套周围跳动。  我知道 MCU h/w 有一个 UART 可以执行 RTS/CTS 引脚控制、它位于'SYSC715'页面中。

但是、它似乎不起作用、只能将 FlowControl 设置为开启、然后在 SysConfig 中定义 CTS 和 RTS 引脚。

我需要的是让 RTS 降至低电平、以便根据需要将我的 RS485线路驱动器 IC 切换为输出或输入。  我目前使用的是这种方法

将 GPIO_write()简单地写入引脚,并在切换该线路之前和之后具有较小的延迟。  这实际上是硬件 UART 的任务

因为它"知道"何时需要从 TX 引脚发送缓冲字符、所以执行此操作。  我希望在设置 RTS 并忽略 CTS 后执行该操作

引脚、因为它不是必需的、也不需要通过任何方式将它连接到任何地方。

在浏览了 UART 源代码并单步执行它之后、除了我想说的之外、我看不到一整组用户配置

流控制、这里是 SysConfig 引脚编辑器中要使用的两个引脚。

CC26x2R1F H/W 数据手册中不清楚的是 RTSEN 和 RTS 引脚的作用、或由 H/W 设置/复位它们的时间

我知道 RTSEN 启用了该函数、但该寄存器中的 RTS 位表示它似乎"反相"了'RTS 信号"、我猜是这样的

这意味着 MCU 引脚上会出现什么情况?  那么、该寄存器位只是一种将 UART 的内部 RTS 信号反相的方法?

这意味着"RTS 信号"是一些内部值、通常会将 LO 降至请求发送状态、而 RTS 寄存器引脚则简单

将该信号反相到 MCU 引脚上会出现的值?

如果我的描述正确或正确、该怎么办?

TI 工程师是否有任何源代码示例可将其与驱动程序库模块配合使用或直接与 H/W 寄存器配合使用?

更改我尝试避免的库源文件、会让您感到非常困惑和混乱。 我怀疑

TI 库开发团队中的某个人会对 UART2库进行编码、并可能有一些例程。

我还看到有两个事件可能对我有所帮助:(来自 UART2.H)

/*!
 *@简述  UART 将开始传输数据。
 *
 *此事件在 RS-485半双工系统中可用于将 TX 使能切换为高电平。
 *
#define UART2_EVENT_TX_BEGIN (0x10)

/*!
 *@短述  UART 停止传输数据。
 *
 *此事件在 RS-485半双工系统中可用于将 TX 使能端切换为低电平。
 *
#define UART2_EVENT_TX_finished (0x20)

这两个事件似乎在"事件回调"中可用、SDK 页面中对此没有详细说明。 我找到了

它的源代码文档比在线花式页面要新得多。  这似乎是他们要使用的调用/文档:

/*!
 * @简要介绍     UART 驱动程序所使用的回调函数的定义。
 *             可以在任务或中断上下文中进行回调。
 *
 * @param[in] UART2_handle           UART2_handle
 *
 * @param[in] 发生的事件                  UART2_EVENT。
 *
 * @param[in] data                   - UART2_EVENT_overrun:累加计数
 *                                     - UART2_EVENT_break:未使用
 *                                     - UART2_EVENT_奇 偶校验:未使用
 *                                     - UART2_EVENT_FRAME:未使用
 *                                     - UART2_EVENT_TX_BEGIN:未使用
 *                                     - UART2_EVENT_TX_ENDULished:未使用
 *
 * @param[in] userArg                指定了用户提供的参数
 *                                     在 UART2_Params 中。
 *
 * @param[in] 状态                 表示 UART2_STATUS 代码的代码
 *                                     传输成功或失败。
 *
typedef void (* UART2_EventCallback)(UART2_Handle handle、uint32_t 事件、uint32_t 数据、void * userArg");

网址:/ti/simplelink_cc13xx_cc26xx_sdk_6_30_01_03/source/ti/drivers/UART2.h

我想我可以使用这种方法、但我在 TI 的库中发现的一些东西无法正常工作、工作异常或异常

难以理解、先编写代码、然后进行调试。 有人能证明 UART 事件确实起作用吗?

我可以在发生这两个事件时设置/重置 RS485信号、而不必以这种方式进行内联程序延迟。

我希望我在这里不会感到很糟糕、但我想充分说明我尝试使用 SDK 实现半双工 RS485的经验。

感谢您的任何帮助或建议、

Marc

我使用的是 CC2642R1F 器件。

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

    更新了:我使用 UART2_EVENT_TX_BEGIN 和 UART2_EVENT_TX_ENDed 将一个示例编码为事件。 我明白了

    对其中的每一项进行回调。  但是、将我的 Modbus 方向设置移动到这些不起作用。  使用时不清楚的是什么

    Oscope 是在执行 UART2_write( mbuart,&c, 1, NULL )之后这两个事件实际发生的情况,它发送1个字符。 输出。

    如果 UART2的驱动程序在文档中对此进行了详细介绍、那将会更好。  在源代码中四处走动很慢

    对 eventCalback 的实际工作方式进行一些猜测。  更不用说这些事件相对于的时序

    UART 实际上移出字符数据。

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

    尊敬的 Marc:

    以下是 TRM 和 UART2.h TI 驱动程序参考的直接链接。  TRM 的第21.4.4.2.1节详细介绍了硬件流控制:

    通过将 UART0RTS 输出连接到接收器件上的 ClearTo-Send 输入、并将接收器件上的请求发送输出连接到 UART0CTS 输入、可实现两个器件之间的硬件流控制。 UART0CTS 输入控制发送器。 发送器只能在 UART0CTS 输入有效时发送数据。 UART0RTS 输出信号指示接收 FIFO 的状态。 UART0CTS 保持有效状态、直到达到预编程的水线位、这表示 RX FIFO 没有空间存储其他字符。

    此外、在 FR 和 CRL 寄存器说明中:

    允许发送:该位是低电平有效 UART CTS 输入管脚的补充。 也就是说、当 CTS 输入引脚为低电平时、该位为1。  
    请求发送该位是低电平有效 UART RTS 输出的补充。 也就是说、当该位被编程为1时、引脚上的 RTS 输出为低电平。

    您可以查看该信息 sources\ti\drivers\uart2\UART2CC26X2.c 在  UART2Support_dmaStartTx 和 UART2_EVENT_TX_BEGIN 期间、UART2_EVENT_TX_FIND 分别传递到回调、这意味着应更新 UART2.h 文档。  您可以 将 UART2CC26X2.c 直接添加到项目工作区、以便调试该文件、而不是使用预构建的 TI 驱动程序库、这将在设置事件标志时确认 UART 活动的状态。  当然、逻辑分析仪或示波器也会极大地帮助调查。

    此致、
    Ryan

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

    感谢你的答复。  我发现您提到的代码段、其中驱动程序调用 UART2_EVENT_TX_BEGIN 和 UART2_EVENT_TX_ENDed 来生成事件。  我看到的问题是、在 UART 实际将数据移出之前、TX_BEGIN 是未知的、因为当我的代码响应事件并设置方向位时、一个或多个字符可能已从别处消失、因为我的方向位不是 设置。  此外、这仅在写轮询模式下有效、这是可以的。  我必须通过检查驱动程序源代码来找出所有这些。  缺少相关的 SDK 文档。

    我认为最好的办法是将轮询源代码写入我自己的编译、只需将 GPIO 调用放入设置方向、而不是生成事件、并希望时序可以使用该方法。  好的一点是我只需要19200波特、所以它不会将事情推向太多。

    正如您所说的、如果启用了实际 UART 内核中的硬件 RTS/CTS 位、则如果 CTS 未置位、则不允许发送器发送。  我没有该位、但 RTS 可以置位、也可以不置位、我目前无法置位。  令人困惑的是、用户可以将 CTSEN 保留为禁用状态、但启用 RTSEN、在这种情况下 UART 硬件会做什么?  是否仍需要 CTS 进行传输?  我想这是芯片设计团队的一个问题。  我过去使用过的一些数据手册中有内部 h/w 子段以及寄存器设置如何应用的很好图表。  该芯片的数据手册非常庞大、但不包含旧帽子简易 UART 的方框图、但实际上、流控制状态机仍在运行、其某些未知细节并未向我们的编程人员显示。

    总之、我看到了几种方法来实现此目的、即使用延迟时序环路从 UART 发送 TX 数据。

    再次感谢、

    Marc Y.

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