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.

[参考译文] TM4C129ENCPDT:"Best "控制 RS485收发器的发送使能线路的方法?

Guru**** 2460850 points
Other Parts Discussed in Thread: TM4C129ENCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/654363/tm4c129encpdt-best-way-to-control-transmit-enable-line-of-a-rs485-transceiver

器件型号:TM4C129ENCPDT

简短问题:在进行 RS485通信时、在 TM4C 软件中控制发送使能 GPIO 的"最佳"方法是什么?

当然、"最佳"在引号中、因为这是非常主观的、所以这里是...

问题的详细版本:

我正在进行半双工 RS485通信。 我的 TM4C 的三个引脚连接到 RS485收发器。 这三个引脚分别是 PD5/U2TX、PD4/U2RX 和 PD6、用作 GPIO 来控制 RS485收发器的发送使能。 当 PD6为高电平时、RS485收发器处于"发送"模式。 当 PD6为低电平时、RS485收发器处于"接收"模式。 (由于 RS485是多分支、我们将通过主/从协议和寻址避免总线争用、在该协议中、主器件可以随时向任何从器件发送查询、并且只有被查询的从器件可以响应。)

软件必须执行以下操作:

在发送之前、必须将发送使能 GPIO 设置为高电平。

2.发送最后一个停止位后、必须立即将发送使能 GPIO 置为低电平。

听起来足够简单、对吧?

我们的应用是"裸机"、使用的是不带 RTOS 的 TivaWare。 在这种情况下、它的结构是轮询超级循环、具有为时间敏感事件提供服务的各种中断。

我遇到了以下选项:

选项 A:天真的选项是完全在主上下文中为传输提供服务。 当有数据要传输时、我们将 GPIO 设置为高电平、并将尽可能多的字符填充到 UART 传输缓冲区中。 当没有更多数据要传输时、我们检查 EOT 位、如果准备好、我们将 GPIO 设置回低电平。 不允许软件的任何部分在 while 循环中"锁定" CPU、因此使用此方法、我们无法准确控制传输结束和将 GPIO 设置为低电平之间所经过的时间。 也就是说、如果没有要传输的数据、但尚未发生传输结束、那么在我们重新检查之前将会经过一段未知的时间。 如果在我们返回到接收模式之前另一个器件开始响应、这可能会剪切传入的数据。 不好。

选项 B:略小的天真选项是使用 UART 发送中断并将 UARTCTL 的 EOT 位置1。 这意味着当最后一个停止位离开串行器时、UART 发送中断 TXRIS 位将被触发。 主上下文将 GPIO 设置为高电平、并将消息的第一个字符放入 UART 发送缓冲区。 此后、每次一个字符完成传输时都会触发发送中断。 在中断中、我们检查是否有其他字符要发送;如果是、我们发送它;如果不是、我们将 GPIO 设置回低电平。 这有一个优势、即从 EOT 到将 GPIO 设置为低电平的时间要短得多、而且可预测性要高得多。 缺点是我们传输的每个字符都必须为中断提供服务。

选项 C:与选项 B 类似、但使用发送 FIFO。 通信会有点"突发"、但我们将减少中断服务。 主上下文会将尽可能多的数据填充到发送 FIFO 中。 当 UARTCTL 的 EOT 位设置为1时、我们将仅在整个缓冲区被发送且发送器将空闲后才接收发送中断。 如果我们有额外的数据、我们将把它填充到 FIFO 中。 否则、我们将关闭 GPIO。 当我说沟通会很糟糕时、我意味着每16 (或17?)次 则字节之间的延迟会稍长一些。 这是完全可以接受的。 我不确定。

选项 D:软件中的一些尚不知名(对我而言)解决方案、可实现选项 C 中的所有功能、但没有"令人失望"的功能。 我想实现一个 FSM、它将根据我们是否有更多的数据要传输在 EOT 之间切换为1和0;但这将会出现许多 gotchas 和边缘情况、这些情况会使它在某些非常难以诊断的方法中失败。 此外、数据表中的这句话(在 UARTCTL 说明下)表示这种情况无论如何都不可能正常工作:"如果软件需要更改模块中的配置、则必须在写入配置更改之前将 UARTEN 位清零。" 所以、这个想法已经提出了。 也许 DMA 是一种选择、但在其他人对此提出的问题中、CB1写道"鲁滨逊面临危险"。

有什么想法或建议? 我能俯瞰什么吗?

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

    需要注意 的是、MCU UART 端口的"特定和少数"提供"调制解调器控制信号"、 该信号很可能用作您的"DE"信号。    (该信号-或其反转。)

    至于"流程和逻辑要求"-通过您的"选项 A-D"提供-可能(其他)形式的串行协议提供了可接受的模型?    我当然想到 的是"CAN" 、而"根据现有(经证明的)方法进行涂层裁缝"的信念可能会拖下去、"创造一个全新(未经测试的)的方法"。

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

    [引用 USER="CB1_MOBILE"]

    需要注意 的是、MCU UART 端口的"特定和少数"提供"调制解调器控制信号"、 该信号很可能用作您的"DE"信号。    (该信号-或其反转。)

    至于"流程和逻辑要求"-通过您的"选项 A-D"提供-可能(其他)形式的串行协议提供了可接受的模型?    我当然想到 的是"CAN" 、而"根据现有(经证明的)方法进行涂层裁缝"的信念可能会拖下去、"创造一个全新(未经测试的)的方法"。

    [/报价]

    您好@CB1_MOBILE、感谢您的参与。

    关于您的第一点、我注意到我们使用的 UART (TM4C129ENCPDT 上的 UART2)具有可选的 CTS 和 RTS 引脚。 我们的 RS485_TXEN 信号(设计人员为连接到 RS485收发器 DE 输入的 GPIO 提供的网络名称)恰好位于 PD6上、这恰好是 UART 的 RTS 引脚。 在有关 RS485的另一个主题中(幸运的是、您碰巧参与了讨论)、有人建议将 RTS 引脚用于完全相同的目的。 但是、当我深入研究它时、我发现另一个线程有人尝试使用 RTS 引脚实现该目的但未成功、并解释说当 UART 接收器为空时、RTS 引脚驱动为低电平、而不是在传输时。 因此、这看起来不是很有希望的。

    顺便说一下、搜索引擎非常糟糕、我觉得我无法再找到其中的任何线程。

    如果需要 CTS 引脚(跳线至 RTS 引脚?) 这是不可能的、因为它用于此板上的其他用途。

    关于您使用 CAN 的问题和建议。 此 RS485接口可与现有设备兼容。

    目前、我已经实施了选项 C 或选项3。 无论它被调用。 我们使用的是 FIFO、Tx 中断配置为在 EOT 上触发、每17个字节就会有很小的延迟。 (17是因为被压入 FIFO 的第一个字节被立即传输到移位寄存器;随后需要额外的16个字节来填充 FIFO 达到极限值、并且 Tx 中断在第17个字节及其停止位被完全移出后发生。)

    我很高兴地报告、在停止位完全移出后、EOT 中断确实会(立即)发生。 一些 MCU 过早提供该中断、等等

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于 RS485多点线路上的所有器件都将了解主控是如何传递的、因此选项 C 的"突发"不应成为问题。 但是、您可以使用 UDMA 加载 TXFIFO、然后使用 EOT 中断例程禁用收发器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您-但我"继续"认为(某些)" CAN 总线及其更高级、多分支、协议"的各个方面 都将证明非常有用、并且可能适合的"RS485"设计。

    通过许多"努力设计挑战"-遵循(即"借用")经过验证的成功方法(即"CAN 协议")证明、"受保护/开发/富有洞察力"远高于(任何) "新引入的技术!"     也请注意" 不完整信任"的投票.。  "不应该是问题!"    这种对冲是正确 的-因为任何新设计都会持续很久-证明可疑...

    此类论点已经获得了胜利- "使用 API"证明远远优于 "发明-然后测试-有时起作用、(也许)"DRM"。