历史上的今天
返回首页

历史上的今天

今天是:2025年03月26日(星期三)

正在发生

2020年03月26日 | stm32---RS485半双工通信

2020-03-26 来源:eefocus

典型的串口通信标准有 RS232 和 RS485,RS232 是全双工点对点的通信,而 RS485 是半双工通信(2 线制),可以一点对多点进行组网,而且 RS485 是用缆 线两端的电压差值来表示传递信号,这与 RS232 电气特性大不一样。RS485 仅仅 规定了接受端和发送端的电气特性,并没有规定或推荐任何数据协议,因此 RS485 的协议层可以和 RS232 一样。


连接方式


发送数据时,串口控制器的 TX 信号经过 收发器转换成差分信号传输到总线上,而接收数据时,收发器把总线上的差分信 号转化成 TTL 信号通过 RX 引脚传输到串口控制器中


SP3485


SP3485是板子上的收发器。对收发器,RO是接收输出端,DI是发送数据输入端, RE 是接收使能信号(低电平有效), DE 是发送使能信 号(高电平有效)


开发板把RE和DE共同连接到了PG3,用高低电平来表示是输出有效还是接收有效。


本次列程是用USART2


rs485.c


#include "rs485.h"

#include "SysTick.h"

 

/*******************************************************************************

* 函 数 名         : RS485_Init

* 函数功能         : USART2初始化函数

* 输    入         : bound:波特率

* 输    出         : 无

*******************************************************************************/  

void RS485_Init(u32 bound)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOAG时钟

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

    

    /*  配置GPIO的模式和IO口 */

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //TX-485    //串口输出PA2

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;         //复用推挽输出

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 

    GPIO_Init(GPIOA,&GPIO_InitStructure);       /* 初始化串口输入IO */

    

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3; //RX-485       //串口输入PA3

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;     //模拟输入

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOA,&GPIO_InitStructure);

    

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3; //CS-485

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;     //推挽输出

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

    GPIO_Init(GPIOG,&GPIO_InitStructure);

    

    //USART2 初始化设置

    USART_InitStructure.USART_BaudRate = bound;//波特率设置

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

    USART_Init(USART2, &USART_InitStructure); //初始化串口2

    

    USART_Cmd(USART2, ENABLE);  //使能串口 2

    

    USART_ClearFlag(USART2, USART_FLAG_TC);

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接受中断

 

    //Usart2 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3

    NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;       //子优先级2

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能

    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、

    

    RS485_TX_EN=0;              //默认为接收模式   

}

 

/*******************************************************************************

* 函 数 名         : USART2_IRQHandler

* 函数功能         : USART2中断函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/ 

void USART2_IRQHandler(void)

{

    u8 res;     

    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据

    {       

        res =USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR

        RS485_TX_EN=1; //发送模式,RS232是全双工发送读取可同时,不需要这样转换模式分时

        delay_ms(1);

        USART_SendData(USART2,res);

        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=1);

        delay_ms(2);

        RS485_TX_EN=0;//接受模式

    }  

    USART_ClearFlag(USART2,USART_FLAG_TC);  

}   

 

 

rs485.h


#ifndef _rs485_H

#define _rs485_H

 

#include "system.h"

 

 

//模式控制

#define RS485_TX_EN     PGout(3)    //485模式控制.0,接收;1,发送.

                                                         

void RS485_Init(u32 bound);

 

 

#endif

 

main.c


 

 

#include "system.h"

#include "SysTick.h"

#include "led.h"

#include "usart.h"

#include "rs485.h"

 

 

/*******************************************************************************

* 函 数 名         : main

* 函数功能         : 主函数

* 输    入         : 无

* 输    出         : 无

*******************************************************************************/

int main()

{

    u8 i=0;

 

    SysTick_Init(72);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组

    LED_Init();

    USART1_Init(9600);

    RS485_Init(9600);

    

    while(1)

    {

        i++;

        if(i%20==0)

        {

            led1=!led1;

        }

        

        delay_ms(10);

    }

}

推荐阅读

史海拾趣

Gemmy Electronics Co Ltd公司的发展小趣事
对于声波或超声波驱赶式捕鼠器,需检查发声元件和发射模块是否工作正常。
ALLTHREAD公司的发展小趣事

面对日益激烈的市场竞争,ALLTHREAD意识到必须不断提升生产效率和质量。于是,他们开始引入先进的自动化设备和智能化生产技术,对生产线进行全面升级。通过技术升级,ALLTHREAD的生产效率得到了大幅提升,产品质量也更加稳定可靠。

CONTRINEX公司的发展小趣事

面对海洋环境的独特挑战,Contrinex推出了海洋系列传感器。这些传感器采用全金属技术,外壳材质为V4A/AISI 316L不锈钢,防护等级高达IP68/IP69K,能够抵御恶劣的海洋环境。同时,该系列传感器还具备卓越的EMC防护性能,能够满足各种海洋应用需求。这一创新产品的推出,进一步巩固了Contrinex在传感器行业的领先地位。

Hengstler GmbH公司的发展小趣事

在数控加工领域,Contrinex的数字测量智能传感器带来了革命性的变革。这些先进的传感器能够精确实时地测量拉杆位置,通过智能决策,确保加工精度,防止潜在损坏。其卓越的性能和稳定性,使得Contrinex在这一领域取得了显著的成绩,并赢得了众多客户的赞誉。

Headland Technology Product Group公司的发展小趣事

HBControls的创立可以追溯到上世纪90年代初,当时电子工业正处于快速发展阶段。创始人李明(化名)凭借在电子行业多年的工作经验,敏锐地察觉到继电器市场的巨大潜力。然而,初创时期资金短缺、技术瓶颈和市场认可度低成为了摆在他面前的三座大山。李明带领团队夜以继日地研发产品,不断优化性能,同时积极寻找合作伙伴,逐步打开了市场。经过数年的不懈努力,HBControls终于在继电器领域站稳了脚跟。

Good Sky Electric Co Ltd公司的发展小趣事
Z32A、Z32K、Z3025J型摇臂钻床的主电路通常包括断路器、主电路熔断器、接触器正反转主触点、热继电器以及电机等关键元件。这些元件共同协作,确保钻床的安全稳定运行。

问答坊 | AI 解惑

认识ARM体系结构的发展

处理器的体系结构定义了指令集(ISA)和基于这一体系结构下处理器的程序员模型。尽管每个处理器 性能不同,所面向的应用不同,每个处理器的实现都要遵循这一体系结构。ARM体系结构为嵌入系统发展 商提供很高的系统性能,同时保持优异的功耗和 面 ...…

查看全部问答>

FPGA、CPLD常用protel库

FPGA、CPLD常用protel库…

查看全部问答>

[51] 郭天祥十天学习51单片机仿真板

大家看一下,怎么样让这个板子上的SOUNDER响啊,用kei软件,C语言编写的程序应该是什么样的,哪位大侠帮我这个刚接触单片机的菜鸟编个程序啊,我怎么弄不响啊?谢谢大家了! QQ:553695150 [ 本帖最后由 tiankai001 于 2010-4-27 10:18 编辑 ]…

查看全部问答>

我要做一个A点阵电子显示屏!~!~大家帮帮忙!~

要求如下: 一、基本功能要求:设计并制作LED电子显示屏和控制器。 1.自制一台简易16行*32列点阵显示的LED电子显示屏; 2.自制显示屏控制器,扩展键盘和相应的接口实现多功能显示控制,显示屏显示数字和字母,亮度可用按键连续调整。 3.显示屏 ...…

查看全部问答>

[求助]求高人帮我看下程序

;-------------------------------------------------------------------------- ;[H1+H2]+[ADR]+[CMD]+[CRC] ;[L1+L2]+[ID]+[TEM_1]+[TEM_2]+[TEM_3]+[TEM_4]+[TEM_5]+[DOOR] ;-------------------------------------------------------------- ...…

查看全部问答>

COTS电源

COTS产品是指一些现有的,容易使用,无需修改的元器件。相对于其它可以根据特殊情况而特定应用的系统而言,COTS系统更能节省成本和时间。 目前的军用开关电源或军用电源模块通常由COTS产品组成,主要包括军用DC-DC电源和军规电源滤波器。 COTS产品 ...…

查看全部问答>

水质检测器电路

本帖最后由 jameswangsynnex 于 2015-3-3 19:54 编辑   …

查看全部问答>

请教c语言读写IO空间

用总线连接方式控制HD44780液晶模块,D15-D8连接到液晶模块的DB7-DB0,A1和A0接到液晶的R/W和RS,RD和WE接到液晶的片选信号E。 哪位能给一个C语言读写IO空间的代码例子?多谢…

查看全部问答>

周公的M0有问题么

周公的M0有问题吧   每次编程序 是直接复制的前一个工程 然后修改代码的   为什么隔一段时间就无法写入程序 然后就要ISP擦除   我不可能给芯片加密的啊   已经出现过3次了  觉得很郁闷…

查看全部问答>

UCOS的问题请教下。

ARM启动后,设置了PPL时钟工作频率,然后进入main函数执行,在main函数创建启动任务及其他任务,在启动任务里面创建系统滴答时钟定时器。    因为有个模块需要延时100MS复位时间,才能开始工作,初始化时间也要30MS左右。那么我能把这个 ...…

查看全部问答>