实现目标
1、掌握UART/USART/RS485等几个常见概念的区别
2、掌握RS485的逻辑电平、硬件接线等基础知识
3、具体实现目标:1、利用两个单片机组成RS485通信网络;2、两个单片机之间能实现正常收发数据。
一、串口、RS485等之间的关系
**串口:**是一个广义术语,通常指的是采用串行通信协议的接口,它可以包括多种具体的物理接口标准和逻辑电平标准。
UART(通用异步收发传输器):是一种集成电路,负责处理串行通信协议中的时序生成、数据编码解码等功能,是嵌入式系统中常见的用于实现串行通信的硬件模块。UART本身并不规定具体的电气特性,而是产生遵循串行通信时序的信号(如启动位、数据位、校验位和停止位)。
TTL(晶体管-晶体管逻辑)电平:是一种逻辑电平标准,通常在集成电路内部或者集成电路之间近距离通信时使用,它的高低电平相对较低,通常为3.3V或5V表示逻辑1,0V表示逻辑0。
RS232:是一种早期广泛应用于计算机和终端设备之间的串行通信接口标准,它规定了详细的电气特性,如逻辑1(负电压,通常为-3V-15V)和逻辑0(正电压,通常为+3V+15V)。尽管逻辑电平与TTL电平不同,但可以通过电平转换器将UART产生的TTL电平转换为RS232电平进行远距离传输。
RS422:是一种全双工、差分传输的串行通信标准,它具有较高的抗干扰能力和较长的传输距离,支持多点传输,每个信号都有明确的方向(发送和接收分离),常用于工业控制领域。
**RS485:**也是一种差分传输的串行通信标准,与RS422类似,但增加了多点通信的能力,支持多个设备通过同一条线路进行通信,但同一时间内只能有一个设备发送数据。
综上所述,UART是生成串行通信时序的硬件模块,而TTL、RS232、RS422和RS485则分别代表了不同的电气接口标准和逻辑电平标准。在实际应用中,UART产生的TTL电平信号通常需要通过电平转换器转化为RS232、RS422或RS485标准的信号,以便在不同的物理环境中进行可靠的串行通信。
二、RS485概述
RS485 是美国电子工业协会(Electronic Industries Association,EIA)于1983年发布的串行通信接口标准,经通讯工业协会(TIA)修订后命名为 TIA/EIA-485-A。RS485 是一种工业控制环境中常用的通讯协议,其中RS是 Recommended Standard 的缩写。RS485 是 半双工异步 串行通信。
1、特点
- 支持多节点:一般最大支持 32 个节点。
- 传输距离远:最远通讯距离可达1200米。
- 抗干扰能力强:差分信号传输。
- 连接简单:只需要两根信号线(A+和B-)就可以进行正常的通信。
2、差分信号传输
RS485 通信采用差分信号传输,通常情况下只需要两根信号线就可以进行正常的通信。
在差分信号中,逻辑0和逻辑1是用两根信号线(A+和B-)的电压差来表示。
逻辑 1: 两根信号线(A+和B-)的电压差在 +2V~+6V 之间。
**逻辑 0:**两根信号线(A+和B-)的电压差在 -2V~-6V 之间。
3、RS485连接方式
- CPU:中央处理器,负责控制整个系统的运行和数据处理。
- UART控制器:集成在CPU内部或外部的通用异步收发传输器,用于生成和解析串行通信数据流。
- TXD/RXD连接:
- TXD(Transmit Data):UART控制器的发送数据线,通常连接到485收发器的接收端(如DE/RE引脚禁能时的接收端或RO引脚)。
- RXD(Receive Data):UART控制器的接收数据线,通常连接到485收发器的发送端(如DI引脚)。
- 485收发器:如SP3485、TP8485E、MAX485等,这类芯片用于实现TTL电平与RS485差分信号电平之间的转换,并具备收发控制功能。
- DE(Driver Enable)/RE(Receiver Enable):控制485收发器工作在发送或接收模式,防止在同一时刻既发送又接收导致冲突。
- DI(Data Input):接收来自UART的TTL电平信号,并转换为RS485差分信号。
- RO(Receiver Output):将接收到的RS485差分信号转换为TTL电平,发送给UART。
- 485_A/485_B:这是RS485总线的差分信号线,485_A和485_B两根线通过双绞线连接到所有的RS485设备,确保信号质量良好。
- 匹配电阻:在485_A和485_B的两端(或靠近设备端)通常会并联一个120欧姆左右的终端电阻,目的是吸收信号反射,确保RS485总线的稳定性,抑制噪声,增强信号质量
4、RS485总线芯片
SP3485 芯片是一款非常经典的+3.3V低功耗半双工RS485收发器,数据传输速率高达10Mbps。单片机串口通信一般是TTL电平,如果需要RS485 通信,就需要RS485芯片在中间转换一下。因为RS485通信是半双工通信,就是发送数据的时候不能同时接收数据,所以我们选择SP3485做RS485收发器。
SP3485芯片典型原理图
SP3485 芯片的引脚说明
二、原理图设计
说明:开发板上没有485芯片,本章内容用proteus软件仿真实现。
三、STM32CubeMX 配置
1.USART 配置
配置1:USART1, 异步通信模式,波特率9600 ,484芯片控制端DIR为输出模式。
配置2:开启USART中断
四、程序设计
1、主机程序
1.1定义两个变量
cpp
/* USER CODE BEGIN PV */
int RxByte,TxByte;
/* USER CODE END PV */
1.2 在while(1)里添加下面程序,实现数据发送
cpp
//发送数据
HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_SET);
TxByte = 0x55;
HAL_UART_Transmit(&huart1, (uint8_t *)&TxByte, 1, 0xFF);
HAL_Delay(500);
2、从机程序
2.1定义两个变量
cpp
/* USER CODE BEGIN PV */
int RxByte,TxByte;
/* USER CODE END PV */
2.2 开启接收中断,设置从机485芯片为接收模式
cpp
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxByte, 1);
HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_RESET);//将485芯片设置为接收模式
HAL_Delay(200);
/* USER CODE END 2 */
2.3 串口接收中断回调函数,实现数据接收和转发功能。
cpp
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (0x55 == RxByte)
{
TxByte = 0x01;
HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_SET);
HAL_UART_Transmit(&huart1, (uint8_t *)&TxByte, 1, 0xFF);
}
else
{
TxByte = 0x77;
HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_SET);
HAL_UART_Transmit(&huart1, (uint8_t *)&TxByte, 1, 0xFF);
}
HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_RESET); //重新使能串口接收中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxByte, 1);
}
/* USER CODE END 4 */
五、实验效果
说明:单片机开发板没有设计485芯片,用仿真实现。
六、仿真实现
功能说明:
1、主机发送0x55给从机,从机收到后,反发送0x01给主机。