一、RS485介绍
RS-485(目前称为EIA/TIA-485)是通信物理层的标准接口,一种信号传输方式,OSI(开放系统互连)模型的第一级。 创建 RS-485 是为了扩展 RS-232 接口的物理功能。
串行 EIA-485 连接是使用两根或三根电线的电缆完成的:一根数据线、一根带反转数据的电线,通常还有一根零线(接地,0 V)。 这样,发射器和接收器通过 22 或 24 AWG 实心线的双绞线电缆交换数据。
这里的主要思想是通过两根电线传输一个信号。 当一根电线传输原始信号时,另一根电线传输其反向副本。 这种传输方法提供了对共模干扰的高抵抗力。 用作传输线的双绞线可以是屏蔽或非屏蔽的。
二、接口确认
通过原理图可以看出,RS485接口与stlink共用了USART2端口,引脚分别为:
USART2_RST ----> PD4
USART2_TX-------> PD5
USART2_RX-------> PD6
三、cubreMX配置
四、应用程序编写
生成usart驱动后,就可以编写应用程序了,主要是封装一层对485收发器的控制代码。
rs485.c和rs485.h文件如下。
rs485.c:
#include "usart.h"
#include "main.h"
#include "stm32l4xx_hal_uart.h"
static uint8_t rx_buffer = 0;
static uint8_t rx_flag = 0;
void rs485_send( uint8_t *str, uint16_t len )
{
if ( str != 0 )
{
while( __HAL_UART_GET_FLAG( &huart2, UART_FLAG_TXE ) != 1 );
HAL_GPIO_WritePin(GPIOD, RS485_DE_Pin, GPIO_PIN_SET);
HAL_UART_Transmit(&huart2, str, len, 1000);
HAL_GPIO_WritePin(GPIOD, RS485_DE_Pin, GPIO_PIN_RESET);
}
}
void rs485_start_recv( void )
{
HAL_UART_Receive_IT(&huart2, &rx_buffer, 1);
}
uint8_t rs485_get_rx_data( void )
{
return rx_buffer;
}
void rs485_set_rx_flag( void )
{
rx_flag = 1;
}
void rs485_clr_rx_flag( void )
{
rx_flag = 0;
}
uint8_t rs485_get_rx_flag( void )
{
return rx_flag;
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
rs485_set_rx_flag();
rs485_start_recv();
}
rs485.h:
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef RS485_H
#define RS485_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
void rs485_send( uint8_t *str, uint16_t len );
void rs485_start_recv( void );
uint8_t rs485_get_rx_data( void );
void rs485_set_rx_flag( void );
void rs485_clr_rx_flag( void );
uint8_t rs485_get_rx_flag( void );
/**
* @}
*
*/
#ifdef __cplusplus
}
#endif
#endif /*RS485_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
五、测试结果
测试下来,可以通过485端口发送数据到pc,但是pc发送给mcu的数据收不到。
然后又测试了通过jlink的虚拟串口收发,发现也是一样的问题,感觉是不是硬件上哪里有问题,同样的代码在其它板子上是可以跑的,搞了很长时间也没有找到具体原因,先记录下来,后面空了再来看。
|