如题
离线
可能要自己写驱动吧,要熟悉驱动框架,非实时系统实现时序操作有困难吧。
离线
UART1/UART2应该是有RTS引脚的,可以看一下配置。
应该可以实现流向控制,不过还是建议用自动流向控制这类电路网上大把。
也可以用13487这种带流向控制的485芯片。
如果实在没有,也可在应用层控制,设置流向引脚IO,一样能实现。
最近编辑记录 staunchheart (2020-04-02 14:41:09)
离线
离线
感谢大家, 参考上面的代码, 逻辑分析仪发现时序控制脚时序还是不对。
离线
询问了以前用f1c100s控制 da14585 蓝牙芯片的朋友, 他说:
改 8250_port.c 里面的 serial8250_tx_chars()
这里发送数据前控制电平(高),
发完送数据前控制电平(低)
因为我的f1c100s io 口检测 da14585 的 cts 引脚电平,
如果为高电平就等待,
如果为低电平就启动发送。
我的这个流控逻辑和你的RS485逻辑基本一样。
在线
感谢晕哥,我再按上面的试一试。
离线
询问了以前用f1c100s控制 da14585 蓝牙芯片的朋友, 他说:
改 8250_port.c 里面的 serial8250_tx_chars()
这里发送数据前控制电平(高),
发完送数据前控制电平(低)
因为我的f1c100s io 口检测 da14585 的 cts 引脚电平,
如果为高电平就等待,
如果为低电平就启动发送。
我的这个流控逻辑和你的RS485逻辑基本一样。
差不多搞定了, 就是按上面晕哥的建议修改, 逻辑分析仪显示时序正常了.
离线
在外部可以加一个三极管,自动控制读写
离线
在外部可以加一个三极管,自动控制读写
客户要求用 gpio 驱动里面控制
离线
离线
再找到一篇好文: 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
离线
根据楼上这篇文章彻底解决了驱动中gpio控制RS485方向控制问题:
serial8250_tx_chars() 函数中执行 __stop_tx(up) 之后:
//等待发送完成
while (port->ops->tx_empty(port) != TIOCSER_TEMT)
{
;
}
gpio_set_value(133, 0);//拉低PE5, 进入接收状态
离线
根据楼上这篇文章彻底解决了驱动中gpio控制RS485方向控制问题:
serial8250_tx_chars() 函数中执行 __stop_tx(up) 之后:
//等待发送完成 while (port->ops->tx_empty(port) != TIOCSER_TEMT) { ; } gpio_set_value(133, 0);//拉低PE5, 进入接收状态
我这样用调试串口的终端输入有点问题,回车多一行空白,删除键不灵,TAB 键显示不全。
离线
感谢路人甲的分享,实际项目用到RS485的很多,学习了
离线
刚好用到,大家可以参考一下新塘的内核的做法。
离线
刚好用到,大家可以参考一下新塘的内核的做法。
请教新唐如何做的?
离线
请教新唐如何做的?
我原来就是用新塘972 的,用这个模式方法在新塘里面是可以实现485 的。但是这个添加ioctl 之后调试串口输入会有影响,TAB键显不全,删除键不管用,回车键会多出一行空白的来。在新塘那边这么用没事。
离线
打算学习一下,大佬们有小白的学习资料分享一下吗
离线
我在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));
离线
不改软件不增加器件:uart tx脚接485 RE TE,485 T接地,R接RX。10年前用到的老办法。
离线
根据楼上这篇文章彻底解决了驱动中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
离线
按照这个方式进行编译,发现报一下的错误
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>
离线
#include <linux/gpio.h>
可以编译通过了,但是所有串口貌似不能正常工作了,终端输入都不行了
离线
根据楼上这篇文章彻底解决了驱动中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) 会死机。
离线
直接硬件自动切换行不行?
离线
我也遇到同样的问题,很多数据一起发送的时候,就会发送不全,原因是GPIO拉低拉早,目前还没有找到判断FIFO为空的办法,我是T507平台
离线
@X3
我的4.19的也死机了,朋友,你好,你的问题解决了吗?
离线