嵌入式Linux设备在启动期间阻塞RS485总线

时间:2016-04-04 07:24:03

标签: embedded-linux bootloader usart rs485 arm9

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

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

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

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

非常感谢任何帮助,提示或见解!

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

有些规格:

  • ARM920T rev 0(v41)CPU
  • Linux 2.6的专有发行版
  • 使用Busybox
  • Atmel USART司机

从启动日志中提取:

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

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

类似问题:

这里可能会讨论类似的问题:UART initialisation: Prevent UART to pull RTS high
但我不确定如何继续提出建议的解决方案。

RS485 output during startup from my device

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

可能您可以访问源代码,因此您可以调查该GPIO的用户和时间。只需grep atmel gpio控制器端口地址的内核源代码就可以搞清楚会发生什么。如果幸运的话,可能会有内核命令行选项,您可以从引导加载程序传递以将该行设置为您需要的行。

答案 2 :(得分:1)

  

如果您能找到下面提到的所需内容,这个答案可能有用   你的董事会!

一旦我在PWM上遇到同样的问题。在那里我发现我的引导加载程序负责相同,我在引导加载程序配置中进行了更改,它开始正常工作。

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

enabling/disabling可以通过根据您的配置更改值0, 1 or 2来完成,您也可以通过在行中注释//来禁用任何内容。