Linux内核版本:4.1.15
RS485波特率:230400
发送周期:50ms
发送数据长度:单次11个字节
设备树配置如下:
在IMX6UL下使用UART3作为RS485模式进行数据收发,发现发送数据重复(已排除是上层应用的问题),如下所示:
Hi Zhaoping,
这个问题,是典型的"收/发"方向转换造成的问题。 做收/发转换有3种方法:
1. GPIO控制
你采用的是这个方式。
2. 用UART_CTS_B引脚控制
linux BSP中支持这种工作方式,也就是uart driver中支持。
3. 硬件电路自动感知收发方向
其中,第一种方式最不容易控制,因为你不知道什么时候发送完成,而转为接收;也不知道什么时候接收完成,而转为发送。
你可以看一下你的硬件电路图,是否在UART TO RS485芯片的收发控制脚连接了CTS_B引脚,如果有,你可以采用第二个方法。
然后,到dts目录用类似grep -r -n 'rs485' ./ 命令搜索一下,有的dts中使用了这个配置,参考它配置你的uart节点。
Have a nice day!
BR,
Weidong
你好,谢谢您的答复!
我昨天仔细测试了一下发现如下的规律:如果发送使用DMA方式的话会出现这个问题:原因是在驱动的源码中有两个地方修改了xmit的tail指针:
第一个在dma_tx_callback中,如下所示:
第二个在 imx_transmit_buffer中,如下所示:
如果我发送的数据比较长的话就会导致tail指针回卷,导致旧数据再次发送。
还有一个问题我想咨询一下:为甚在DMA使能的情况下imx_transmit_buffer中还需要将数据写入到URTX0中?
杨兆平
|
|
13581584497@163.com
|
签名由网易邮箱大师定制
在2020年1月9日 10:39,weidong.sun<admin@community.nxp.com> 写道:
|
|
NXP Community
|
|
Re: IMX6UL Linux下Rs485异常
reply from Wigros Sun in i.MX Processors - View the full discussion
Hi Zhaoping,
这个问题,是典型的"收/发"方向转换造成的问题。 做收/发转换有3种方法:
1. GPIO控制
你采用的是这个方式。
2. 用UART_CTS_B引脚控制
linux BSP中支持这种工作方式,也就是uart driver中支持。
3. 硬件电路自动感知收发方向
其中,第一种方式最不容易控制,因为你不知道什么时候发送完成,而转为接收;也不知道什么时候接收完成,而转为发送。
你可以看一下你的硬件电路图,是否在UART TO RS485芯片的收发控制脚连接了CTS_B引脚,如果有,你可以采用第二个方法。
然后,到dts目录用类似grep -r -n 'rs485' ./ 命令搜索一下,有的dts中使用了这个配置,参考它配置你的uart节点。
Have a nice day!
BR,
Weidong
Reply to this message by replying to this email, or go to the message on NXP Community |
Start a new discussion in i.MX Processors by email or at NXP Community |
Following Re: IMX6UL Linux下Rs485异常 in these streams: Inbox |
This email was sent by NXP Community because you are a registered user.
You may unsubscribe instantly from NXP Community, or adjust email frequency in your email preferences
|
|