您尚未登录。

楼主 #1 2020-04-02 13:52:27

路人甲
会员
注册时间: 2017-09-07
已发帖子: 202
积分: 199.5

请教大家一个问题,全志linux主线uart驱动里面控制一个io脚实现rs485功能,应该如何修改?

如题

离线

楼主 #5 2020-04-03 17:11:21

路人甲
会员
注册时间: 2017-09-07
已发帖子: 202
积分: 199.5

Re: 请教大家一个问题,全志linux主线uart驱动里面控制一个io脚实现rs485功能,应该如何修改?

感谢大家, 参考上面的代码, 逻辑分析仪发现时序控制脚时序还是不对。

离线

楼主 #7 2020-04-03 17:21:05

路人甲
会员
注册时间: 2017-09-07
已发帖子: 202
积分: 199.5

Re: 请教大家一个问题,全志linux主线uart驱动里面控制一个io脚实现rs485功能,应该如何修改?

感谢晕哥,我再按上面的试一试。

离线

楼主 #8 2020-04-03 19:36:07

路人甲
会员
注册时间: 2017-09-07
已发帖子: 202
积分: 199.5

Re: 请教大家一个问题,全志linux主线uart驱动里面控制一个io脚实现rs485功能,应该如何修改?

晕哥 说:

询问了以前用f1c100s控制 da14585 蓝牙芯片的朋友, 他说:

改 8250_port.c 里面的 serial8250_tx_chars()

这里发送数据前控制电平(高),

发完送数据前控制电平(低)


因为我的f1c100s io 口检测 da14585 的 cts 引脚电平,

如果为高电平就等待,

如果为低电平就启动发送。

我的这个流控逻辑和你的RS485逻辑基本一样。

2020-04-03_170444.png

2020-04-03_170248.png

2020-04-03_170425.png

差不多搞定了, 就是按上面晕哥的建议修改, 逻辑分析仪显示时序正常了.

离线

楼主 #10 2020-04-04 23:49:06

路人甲
会员
注册时间: 2017-09-07
已发帖子: 202
积分: 199.5

Re: 请教大家一个问题,全志linux主线uart驱动里面控制一个io脚实现rs485功能,应该如何修改?

liuchangyin 说:

在外部可以加一个三极管,自动控制读写

客户要求用 gpio 驱动里面控制

离线

楼主 #11 2020-04-04 23:51:37

路人甲
会员
注册时间: 2017-09-07
已发帖子: 202
积分: 199.5

Re: 请教大家一个问题,全志linux主线uart驱动里面控制一个io脚实现rs485功能,应该如何修改?

离线

楼主 #12 2020-04-05 01:23:33

路人甲
会员
注册时间: 2017-09-07
已发帖子: 202
积分: 199.5

Re: 请教大家一个问题,全志linux主线uart驱动里面控制一个io脚实现rs485功能,应该如何修改?

再找到一篇好文: Linux-485收发切换延迟的解决方法



3.1 由应用程序控制是否打开串口设备的485功能
在串口驱动里切换485方向对性能有一些影响。
而某些应用可能只需要标准串口,不需要支持485模式。
因此最好由应用程序来控制,是使用标准串口还是支持485模式的串口。
这主要利用ioctl()实现。

应用程序在初始化打开串口时,禁用/使能串口的485模式

fd = open(...);
init_serial(fd, ...);

struct serial_rs485 rs485conf;
rs485conf.flags |= SER_RS485_ENABLED;   // 使能本串口485模式,默认禁用
ioctl(fd, TIOCSRS485, &rs485conf);

驱动程序中对使能了485模式的串口作特殊处理。
利用struct uart_8250_port结构体中的struct serial_rs485 rs485成员判断串口是否支持485模式。
在serial_8250.h中有定义rs485数据成员,以及设置此数据成员的成员函数rs485_config

离线

楼主 #13 2020-04-20 08:11:57

路人甲
会员
注册时间: 2017-09-07
已发帖子: 202
积分: 199.5

Re: 请教大家一个问题,全志linux主线uart驱动里面控制一个io脚实现rs485功能,应该如何修改?

根据楼上这篇文章彻底解决了驱动中gpio控制RS485方向控制问题:

serial8250_tx_chars() 函数中执行 __stop_tx(up) 之后:

                //等待发送完成
                while (port->ops->tx_empty(port) != TIOCSER_TEMT)
                {
                    ;
                }

                gpio_set_value(133, 0);//拉低PE5, 进入接收状态

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn