硬件:nuc972,串口6、串口10外接485接口电路,(PB2---ttyS6发送 接 485发送,PB3---ttyS6接收 接 485接收,PB4---ttyS6 RTS 接 485收发控制;PB12---ttyS10发送 接 485发送,PB13---ttyS10接收 接 485 接收,PB14---ttyS10 RTS 接 485收发控制)。两串口经过485芯片后,将A、B互连。
软件:linux BSP nuc970bsp-release-20151106。应用程序是bsp中的applications/demos/uart/的例程,在uart.c的open_port函数末尾return前增加如下代码用于使能串口的485模式:
struct serial_rs485 Set485;
memset(&Set485,0,sizeof(struct serial_rs485));
Set485.flags |= SER_RS485_ENABLED;
ioctl(portfd,TIOCSRS485,&Set485);
经过测试,这样修改可以使能串口的485模式,但是收发脚的极性是反的。(发送变低,接收变高)所以将
Set485.flags |= SER_RS485_ENABLED; 修改成 Set485.flags |= SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND。但改成这样后只要一运行,系统就复位了。
linux-3.10.x/drivers/tty/serial/nuc970_serial.c中的代码在函数nuc970serial_config_rs485函数中 SER_RS485_RTS_ON_SEND只影响了如下代码:
if(rs485conf->flags & SER_RS485_RTS_ON_SEND){
serial_out(p,UART_REG_MCR,(serial_in(p,UART_REG_MCR) & ~0x200));
else
serial_out(p,UART_REG_MCR,(serial_in(p,UART_REG_MCR) | 0x200));
}
只是修改了UA_MCR的bit9,和编程手册中的说明是一致的,不明白改一下RTS引脚的极性为啥会导致系统复位,有没有人碰到和我一样的问题?
|