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驱动程序分析,敬请期待下次更新......
posted @ 2024-07-29 11:45  yyfaaa  阅读(20)  评论(0编辑  收藏  举报