首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入式系统应用中实现RS485的方向切换

嵌入式系统应用中实现RS485的方向切换

关键字:RS485   方向切换   嵌入式系统   DM8168  

2 软件方式控制RS485方向

2.1 驱动能力分析

在复杂的RS485控制环境下,用上面介绍的硬件方式来控制RS485的方向会存在比较突出的驱动能力不足的问题。修改上述控制方法,将TTL这一侧的2线控制改为3线控制,就是将收发控制信号不用当前的/TXD来控制,而从主控分出一根GPIO线来控制收发。

按照输出电流计算,3线控制方式相对用2线控制的总线上下拉作为输出的方式,其驱动能力提高了25~50倍(不同厂家不同型号有差异),如果辅以终端电阻灵活配置的措施,RS485的驱动能力将完全不是问题。表1是两种控制方式驱动能力的对比。

2.2 软硬件环境



图2 软件控制方法中的硬件设计



软件控制方法采用图2的硬件设计,图中很突出的修改是使用MCU的GPIO来控制RE和DE。RS485芯片的供电采用5 V供电,提高驱动能力。RS485芯片的RE和DE控制使用MCU的GPIO输出高低电平来控制。简单来说就是,在RS485进行数据传输时,通过GPIO来控制传输方向。这里采用的MCU是TI公司的DM8168处理器来实现软件的RS485切换功能。软件版本使用UBoot2010.06和linux2.6.37。用软件来实现RS485的收发,尽量要保证执行效率;要达到上面的目的就需要对串口驱动进行调试,使用串口驱动用到的软件资源和串口控制器本身的硬件资源来实现RS485的控制。



表1 软件和硬件控制方式驱动能力的对比



2.3 UBoot代码修改

需要修改的文件:
① board/ti/ti8168/evm.c
② drivers/serial/ns16550.c
③ include/configs/ti8168_evm.h

ti8168_evm.h文件中增加切换宏定义:
#define CONFIG_RS485_DIR_SW 1

evm.c文件中增加切换函数:
void rs485_dir_sw(int rs485_dir){
if (rs485_dir ==0)
_raw_writel(RS485_DIR_MASK, TI81XX_GPIO1_CLEARDATAOUT);
else
_raw_writel(RS485_DIR_MASK, TI81XX_GPIO1_SETDATAOUT);
}

s16550.c串口驱动文件中增加RS485方向控制:
void NS16550_putc(NS16550_t com_port, char c){
#ifdef CONFIG_RS485_DIR_SW
rs485_dir_sw(1);
#endif
……//此处代码省略
#ifdef CONFIG_RS485_DIR_SW
while((serial_in(&com_port->lsr) & UART_LSR_TEMT) == 0)
rs485_dir_sw(0);
#endif
}
  其中UART_LSR_TEMT表示发送BUF和移位寄存器为空。默认情况下RS485是接收状态,一旦要发送数据,就把RS485切换为发送状态。发送完数据后,等待发送BUF和移位寄存器为空,然后切换回接收状态,这里无需使用timeout。
返回列表