简短问题:在进行 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写道"鲁滨逊面临危险"。
有什么想法或建议? 我能俯瞰什么吗?