WhyCan Forum(哇酷开发者社区)

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

您尚未登录。

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

路人甲
会员
注册时间: 2017-09-07
累计积分: 180

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

如题

离线

#2 2020-04-02 14:25:43

TivonLiu
会员
注册时间: 2019-12-27
累计积分: 32

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

可能要自己写驱动吧,要熟悉驱动框架,非实时系统实现时序操作有困难吧。

离线

#3 2020-04-02 14:39:15

staunchheart
会员
注册时间: 2019-12-17
累计积分: 181

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

UART1/UART2应该是有RTS引脚的,可以看一下配置。
应该可以实现流向控制,不过还是建议用自动流向控制这类电路网上大把。
也可以用13487这种带流向控制的485芯片。
如果实在没有,也可在应用层控制,设置流向引脚IO,一样能实现。

最近编辑记录 staunchheart (2020-04-02 14:41:09)

离线

#4 2020-04-02 15:17:03

smartcar
会员
注册时间: 2018-02-19
累计积分: 704

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

离线

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

路人甲
会员
注册时间: 2017-09-07
累计积分: 180

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

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

离线

#6 2020-04-03 17:14:29

晕哥
管理员
注册时间: 2017-09-06
累计积分: 9,190

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

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

改 8250_port.c 里面的 serial8250_tx_chars()

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

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


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

如果为高电平就等待,

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

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

离线

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

路人甲
会员
注册时间: 2017-09-07
累计积分: 180

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

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

离线

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

路人甲
会员
注册时间: 2017-09-07
累计积分: 180

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

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

离线

#9 2020-04-04 11:01:40

liuchangyin
会员
注册时间: 2020-03-17
累计积分: 203

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

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

离线

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

路人甲
会员
注册时间: 2017-09-07
累计积分: 180

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

liuchangyin 说:

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

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

离线

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

路人甲
会员
注册时间: 2017-09-07
累计积分: 180

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

离线

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

路人甲
会员
注册时间: 2017-09-07
累计积分: 180

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
累计积分: 180

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, 进入接收状态

离线

#14 2020-04-21 17:39:08

chendong
会员
注册时间: 2019-07-22
累计积分: 73

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, 进入接收状态

我这样用调试串口的终端输入有点问题,回车多一行空白,删除键不灵,TAB 键显示不全。

离线

#15 2020-04-21 20:58:03

xzm7358
会员
注册时间: 2019-03-06
累计积分: 5

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

感谢路人甲的分享,实际项目用到RS485的很多,学习了

离线

#16 2020-04-21 21:42:57

sy373466062
会员
注册时间: 2018-11-12
累计积分: 81

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

刚好用到,大家可以参考一下新塘的内核的做法。

在线

#17 2020-04-21 21:56:31

有梦的地方
会员
注册时间: 2020-03-17
累计积分: 284

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

sy373466062 说:

刚好用到,大家可以参考一下新塘的内核的做法。

请教新唐如何做的?

离线

#18 2020-04-21 22:41:14

chendong
会员
注册时间: 2019-07-22
累计积分: 73

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

有梦的地方 说:

请教新唐如何做的?

我原来就是用新塘972 的,用这个模式方法在新塘里面是可以实现485 的。但是这个添加ioctl 之后调试串口输入会有影响,TAB键显不全,删除键不管用,回车键会多出一行空白的来。在新塘那边这么用没事。

离线

#19 2020-04-21 23:53:45

大海
会员
注册时间: 2020-04-21
累计积分: 10

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

打算学习一下,大佬们有小白的学习资料分享一下吗

离线

#20 2020-04-22 14:40:06

test0001
会员
注册时间: 2019-12-04
累计积分: 16

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

我在rk3308上是通过tcdrain(tty_fd);这个借口来做的,你可以试试
select_gpio_fd = open(SYSFS_RS485_VAL, O_RDWR);

    if(select_gpio_fd == -1)
    {
            printf("ERR: Radio hard reset pin value open error.\n");
            return -1;
    }
    write(select_gpio_fd, SYSFS_GPIO_H, sizeof(SYSFS_GPIO_H));
    len = write(tty_fd, send_msg, sizeof(struct tty_msg));
    if (len < 0) {
        printf("rs485 write data error \n");
    }
    tcdrain(tty_fd);
    write(select_gpio_fd, SYSFS_GPIO_L, sizeof(SYSFS_GPIO_L));

离线

#21 2020-04-26 21:53:53

xxdebug
会员
注册时间: 2018-12-08
累计积分: 13

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

不改软件不增加器件:uart tx脚接485 RE TE,485 T接地,R接RX。10年前用到的老办法。

离线

#22 2020-06-19 09:51:10

zhang235hai
会员
注册时间: 2020-04-06
累计积分: 128

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, 进入接收状态

按照这个方式进行编译,发现报一下的错误
drivers/tty/serial/8250/8250_port.c:1791:9: error: implicit declaration of function ‘gpio_set_value’; did you mean ‘sg_set_page’? [-Werror=implicit-function-declaration]
         gpio_set_value(34, 0);//拉低PE5, 进入接收状态
         ^~~~~~~~~~~~~~
         sg_set_page

离线

#23 2020-06-19 10:14:33

哇酷小二
管理员
注册时间: 2020-04-22
累计积分: 1,852

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

zhang235hai 说:

按照这个方式进行编译,发现报一下的错误
drivers/tty/serial/8250/8250_port.c:1791:9: error: implicit declaration of function ‘gpio_set_value’; did you mean ‘sg_set_page’? [-Werror=implicit-function-declaration]
         gpio_set_value(34, 0);//拉低PE5, 进入接收状态
         ^~~~~~~~~~~~~~
         sg_set_page

#include <linux/gpio.h>

在线

#24 2020-06-19 11:43:06

zhang235hai
会员
注册时间: 2020-04-06
累计积分: 128

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

哇酷小二 说:

#include <linux/gpio.h>

可以编译通过了,但是所有串口貌似不能正常工作了,终端输入都不行了

离线

#25 2020-11-09 14:34:26

X3
会员
注册时间: 2020-04-08
累计积分: 23

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, 进入接收状态

发现Linux5.4.70 执行 port->ops->tx_empty(port) 会死机。

离线

#26 2020-11-10 20:42:59

zwanh
会员
注册时间: 2020-04-11
累计积分: 15

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

直接硬件自动切换行不行?
485%E8%87%AA%E5%8A%A8%E5%88%87%E6%8D%A2.png

离线

页脚

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