打印
[STM32L4+]

【STEVAL-STWINKT1B测评】5、RS485通讯

[复制链接]
1811|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ev, TE, ST, RS, RS485
一、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的虚拟串口收发,发现也是一样的问题,感觉是不是硬件上哪里有问题,同样的代码在其它板子上是可以跑的,搞了很长时间也没有找到具体原因,先记录下来,后面空了再来看。


使用特权

评论回复
沙发
呐咯密密| | 2024-9-20 10:11 | 只看该作者
是不是因为和STLLINK的接口冲突了

使用特权

评论回复
板凳
yangjiaxu| | 2024-9-20 10:14 | 只看该作者
其实,485通讯和串口通讯一样,UART这种,主要是有个使能端,其实现在有很多都不用使能端了,直接全双工

使用特权

评论回复
地板
4y1b3| | 2024-9-21 11:41 | 只看该作者
这里的主要思想是通过两根电线传输一个信号

使用特权

评论回复
5
Henryko| | 2024-9-21 12:10 | 只看该作者
485跟串口是不是除了电平都一样啊?

使用特权

评论回复
6
xinmeng_wit|  楼主 | 2024-9-24 19:37 | 只看该作者
Henryko 发表于 2024-9-21 12:10
485跟串口是不是除了电平都一样啊?

不仅仅是电平不一样,485是半双工,串口是全双工

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

240

帖子

1

粉丝