RS485浅析(硬件原理,软件配置)
485是一种最常用的通信接口,在单片机裸机和Linux系统中都有应用。并且又分为收发电平自动转换和手动转换两种。本文将分别进行举例说明。
485通信原理
差分信号传输
RS485 通信采用差分信号传输,通常情况下只需要两根信号线就可以进行正常的通信。
在差分信号中,逻辑0和逻辑1是用两根信号线(A+和B-)的电压差来表示。
逻辑 1:两根信号线(A+和B-)的电压差在 +2V~+6V 之间。
逻辑 0:两根信号线(A+和B-)的电压差在 -2V~-6V 之间。
连接方式
在 RS485 通信网络中,通常会使用 485 收发器来转换 TTL 电平和 RS485 电平。
节点中的串口控制器使用 RX 与 TX 信号线连接到 485 收发器上,而收发器通过差分线连接到网络总线。
串口控制器与收发器之间一般使用 TTL 信号传输,收发器与总线则使用差分信号来传输。
发送数据时,串口控制器的 TX 信号经过收发器转换成差分信号传输到总线上。
接收数据时,收发器把总线上的差分信号转化成 TTL 信号通过 RX 引脚传输到串口控制器中。
+A,-B信号幅值如下图。说明ttl的RX,TX的信号经SP3485转换后电压值由3.3v转变成5v。当信号为1时,电压:5-0=5;当信号为0时,电压:0-5=-5;
信号软件处理
在RT1061开发板上
首先驱动使能uart。然后需要控制寄存器来控制收发的切换。
发送数据 int write485(const uint8_t *SendData,size_t Len) { // /* Send data only when LPUART TX register is empty and ring buffer has data to send out. */ LPUART_WriteBlocking(LPUART4_PERIPHERAL, SendData, Len); return 0; } 接收数据 void read232(void) { uint8_t data; /* If new data arrived. */ if ((kLPUART_RxDataRegFullFlag) & LPUART_GetStatusFlags(LPUART4_PERIPHERAL)) {(如果接收缓冲区有时间,并且) data = LPUART_ReadByte(LPUART4_PERIPHERAL); /* If ring buffer is not full, add data to ring buffer. */ rs485RxIndex %= 9; Rs485RingBuffer[rs485RxIndex] = data; rs485RxIndex++; if (rs485RxIndex == 9) { rs485ReceivedFlag = true;(数据接收缓冲区9字节) } } LPUART_ClearStatusFlags(LPUART4_PERIPHERAL, kLPUART_RxDataRegFullFlag); }
OK3568 手动控制收发
OK3568自动控制收发
首先需要设置驱动能够调用485收发相关驱动,然后通过8250程序,控制自动收发。需要在应用层进行如下使能,并决定是高电平发送还是低电平发送。
int rs485_enable(const int fd) { struct serial_rs485 rs485conf; int res; /* Get configure from device */ res = ioctl(fd, TIOCGRS485, &rs485conf); if (res < 0) { perror("Ioctl error on getting 485 configure:"); close(fd); return res; } /* Set enable/disable to configure */ // Enable rs485 mode rs485conf.flags |= SER_RS485_ENABLED; /*set logical level for RTS pin equal to 0 when sending: */ rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND); /* Set logical level for RTS pin equal to 1 after sending: */ rs485conf.flags |= SER_RS485_RTS_AFTER_SEND; /* Set rts delay before send, if needed: */ rs485conf.delay_rts_before_send = 0x00000004; /* Set rts delay after send, if needed: */ rs485conf.delay_rts_after_send = 0x00000004; /* Set this flag if you want to receive data even while sending data */ rs485conf.flags |= SER_RS485_RX_DURING_TX; /* Set configure to device */ res = ioctl(fd, TIOCSRS485, &rs485conf); if (res < 0) { perror("Ioctl error on setting 485 configure:"); close(fd); } return res; }
485驱动程序分析,敬请期待下次更新......