4

我正在使用一台工业 Linux 计算机来实现通过 RS485 总线与多个连接的设备进行通信时遇到问题。我遇到的是 RS485 USART 驱动程序使用的 IO 引脚在启动时设置为不同的电平,而不是进入 RS485 空闲/三态。结果,总线上的其他设备在设备启动时被阻塞超过 30 秒,引发各种外部问题。事件过程可以在附图中查看,我在启动期间用示波器测量了输出电压。

我的猜测是,实际驱动器在电压水平达到其三态水平之前不会启动(例如,此设备约为 2.2V)。之后,一切都按预期工作。

我试图找到任何配置文件来设置引导时引脚的默认 IO 级别(认为这可能由引导加载程序设置)无济于事。

此外,我尝试应用启动脚本来“足够早地”运行以将 DATA- 设置为高,但据我所知,有问题的设备没有提供任何接口来控制这些引脚作为常规 GPIO。

任何帮助、提示或见解将不胜感激!

编辑:我不是经验丰富的 Linux 开发人员,所以如果我遗漏了任何重要的细节,请强调。

一些规格:

  • ARM920T 版本 0 (v41) CPU
  • Linux 2.6 的专有发行版
  • 使用 Busybox
  • 爱特梅尔 USART 驱动程序

从引导日志中提取:

Linux 版本 2.6.28.10 (root@) (gcc 版本 4.1.2) #94 PREEMPT Tue Oct 29 10:22:19 CET 2013
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0003177
/...
.. ./
端口 /dev/ttyS3 的 RS485 模式已启用
/...
...(我猜这里大约需要 30 秒)
.../
atmel_usart.3: MMIO 0xfffcc000 (irq = 9) 处的 ttyS3 是 ATMEL_SERIAL
atmel_serial.3:将 RS485 RTS 引脚向下放置
/...
...
.../

完整启动日志: https ://drive.google.com/file/d/0B2XYl1mNCa8jNUZ5V0Nic1hkU0U/view

类似问题:

此处可能讨论了一个类似的问题:UART 初始化:防止 UART 拉高 RTS
但我不确定如何继续使用建议的解决方案。

从我的设备启动期间的 RS485 输出

4

3 回答 3

1

这不过是胡思乱想,但可能值得在启动期间尽早添加一个向设备(例如 /dev/ttyS1 或其他)回显 NULL 字符的启动脚本。这可能足以让驱动程序初始化硬件。

您还可以尝试在 Linux 源代码中找到驱动程序以查看它是如何启动的。

于 2016-04-04T12:22:47.890 回答
1

如果您可以在董事会下面找到所需的东西,这个答案可能会起作用!

曾经我在 PWM 上也有同样的问题。在那里我发现我的引导加载程序负责同样的事情,我改变了引导加载程序配置,它开始正常工作。

检查板供应商或第三方提供的 BSP(如果你有源),如果你的引导加载程序是 U-boot,你可以在里面找到它U-boot-(source)/include/configs/(your-board).h,你可以找到 RS484 的配置。根据您的电路板数据表,您可以检查在同一引脚上复用的其他内容,如果启动时间不需要,则禁用这些内容并启用 RS485。

enabling/disabling可以通过0, 1 or 2根据您的配置更改值来完成,您也可以通过注释掉//该行来简单地禁用任何东西。

于 2016-04-07T11:57:22.190 回答
1

可能您可以访问源代码,因此您可以调查谁以及何时弄乱了该 GPIO。只需 grep atmel gpio 控制器端口地址的内核源代码即可了解发生了什么。如果幸运的话,可能会有内核命令行选项,您可以从引导加载程序中传递该选项以提前将行设置为您需要的内容。

于 2016-04-06T19:02:21.040 回答