- UID
- 872339
|
关键字: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。
|
|