STM32F4 您所在的位置:网站首页 水龙头是4分还是6分 STM32F4

STM32F4

2023-06-13 06:31| 来源: 网络整理| 查看: 265

目录

1. 485简介

2. 串口UART存在的问题

3. RS232协议

4. RS485协议

6. 硬件分析

7. 实验程序

7.1 main.c

7.2 RS485.c

7.3 RS485.h

RS232的高电平1的逻辑为-5V~-15V,低电平0的逻辑为+5V~+15V。高电平和TTL的0~5V不兼容,传输的距离也不够长。

1. 485简介

        485(一般称作RS485)是隶属于OSI模型物理层的电气特性,规定为2线,半双工模式,多点通信。其电气特性和RS232不太一样,RS485是用缆线两端的电压差值来传递信号。RS485仅仅规定了接收端和发送端的电气特性。没有规定或推荐任何数据协议。

特点:

        接口电平低,不容易损坏芯片。这一点相对于RS232接口的高电平来说,是非常大的优点。                                                                                                                             RS485的电气特性:逻辑 “1” 以两线间的电压差+(2~6)V表示;逻辑 “0” 以两线间的电压差-(2~6)V表示。接口电平低,不易损坏接口电路的芯片,并且该电平与TTL电平兼容,可以方便与TTL电路连接。        传输速率高。10米时,RS485的数据最高传输速率可达35Mbps,在1200m时,传输速度可达100Kbps。        抗干扰能力强。RS485接口采用平衡驱动器和差分接收器的组合,抗共模干扰能力强,也可以说是抗噪声干扰性好。        传输距离远,支持节点多。RS485总线最长可以传输1200m以上,一般最大支持32个节点。

总结:

        RS232 和 RS485 并不是和 IIC、SPI 协议一样,是一个单独的总线协议,RS232 和 RS485 都是建立在电气层面的,他们的实现都需要依赖于串口。

2. 串口UART存在的问题

        这里为什么要说明串口 UART 存在的问题呢? 是因为一般在进行项目时,通常很少使用串口通信,就是因为串口存在诸多问题。也正是因为串口存在的这诸多问题,所以才有 RS485 通讯存在的意义。

电气接口不统一(致命):

        1. UART只是对信号的时序进行了定义,而未定义接口的电气特性。(电气特性:打个比方,我们买了个家具,不管买的哪个厂家的,回到家之后都可以通过地线、火线、零线接到自家的插座上使用,这是因为插座的尺寸是全国统一标准规定的,而 UART 就没有对这一特性进行规定,导致不同器件之间通信变得复杂化)

        2. UART通信时一般使用处理器提供的电平,即TTL电平,但不同处理器使用的电平是存在差异的,所以不同处理器使用 UART 通信时一般不能直接相连。(打个比方,我想使用51单片机和STM32单片机通信,51单片机处理器提供的电平0~5V,STM32处理器提供的电平是0~3.3V,如果两者之间想要进行通信,必须经过转电平处理才可以)

        3. UART没有规定不同器件连接时连接器的标准,所以不同器件之间通过UART通信时连接很不方便。

抗干扰能力差:

        UART一般直接使用TTL信号来表示 0 和 1 ,但TTL信号的抗干扰能力较差,数据在传输过程中很容易出错。

通信距离极短:

        因为TTL信号的抗干扰能力较差,所以其通信距离也很短,一般只能用于一个电路板上的两个不同芯片之间的通信。

3. RS232协议

        RS232协议是1970年美国电子工业协会 EIA 联合贝尔系统、调制解调器厂家、计算机终端生产厂家共同制定的用于串行通信的标准(从上面介绍的UART的缺点来看,串口通信最致命的缺点就是没有统一的标准,导致不同器件之间的通讯变得异常的复杂,而 RS232 和 RS485 就是这样的一个标准,应用在串口之上,使得串口通信具有一定的标准)。

        该标准规定采用一个标准的连接器,标准中对连接器的每个引脚的作用都加以规定,同时也对信号的电平加以规定。

接口:

        该标准规定采用一个 25 引脚的 DB-25 连接器,标准中对连接器的每个引脚的信号内容加以规定。还对各种信号的电平加以规定;后来1BM的PC机将RS232简化成了 DB-9 连接器,再后来成了事实的标准(就像我们家用的三头插座一样,火线、零线、地线);现在工业控制的RS-232接口一般只使用RXD、TXD、GND三条线(STM32开发板中的原理图上也是如此)。

信号:

        RS232标准规定逻辑 “1” 的电平为-5V到-15V,逻辑 “0” 的电平为+5V到+15V,选择该电气标准的目的在于提高抗干扰能力,增大通信距离,其传送的距离一般可达15m。

C1+:倍增器电荷泵电容器的正极。

V+:充电泵产生的+5.5V。

C1-:倍增器电荷泵电容器的负极。

C2+:反转电荷泵电容器的正极。

C2-:反转电荷泵电容器的负极。

V-:-5.5V由电荷泵产生。

DOUT2:RS-232驱动输出。

RIN2:RS-232接收输入。

VCC:+3V~+5.5V供给电圧。

GND:地。

DOUT1:RS-232驱动输出。

RIN1:RS-232接收输入。

ROUT1:RS-232接收输出。

DIN1:RS-232驱动输入。

DIN2:RS-232驱动输入。

ROUT2:RS-232接收输出。

RS232存在的问题:

        1. 接口的信号电平较高(-15V~+15V),易损坏接口电路芯片,又因为与TTL电平不兼容,所以需要使用电平转换芯片才能与TTL电路连接。

        2. 通信速度较低,不适合用于那些高速通信的场合。        

        3. 易产生共模干扰,抗噪声干扰性弱。

        4. 传输距离较短,一般情况只有15m。

最后强调一点:程序编程方面 RS232 和串口没有任何区别,只是在硬件方面做出了一些改善。

4. RS485协议

        RS485协议是由电信行业协会和电子工业联盟定义;使用该标准的通信网络能在远距离条件下(1500m)以及电子噪声大的环境下有效传输信号。该标准允许连接多个收发器,即具有多站能力,这样可以利用单一的 RS485 接口方便的建立起一个设备网络。

        像串口 UART 和 RS232 是点对点通信;点对点的意思就是说只能实现两个设备之间的收发数据;

        而RS485是可以建立起设备通信网络的,主机可以像下图一样连接多个 RS485 设备进行通信;在理想情况下,RS485需要两个终端匹配电阻(一般在总线的起始和终止端加,也就是主机和最后一个设备上加,匹配电阻通常情况下是120Ω,如下图所示),电阻的阻值等于传输电缆的特性阻抗。

        至于为什么要加这两个终端匹配电阻,是因为如果不加的话,当所有RS485设备都静止或者没有能量的时候就会产生噪音。并且可能在线移的过程中导致数据传输错误。

信号:

        RS485标准规定采用差分信号进行数据传输,两线间的电压差为+2V~+6V表示逻辑 “1” ,两线间的电压差-2V到-6V表示逻辑 “0” 。使用差分信号能有效地减少噪声信号的干扰,延长通信距离,RS485 的通信距离可以达到1500m;RS485 接口信号的电平比 RS232 降低了,所以不易损坏接口电路的芯片,且该电平与TTL电平信号兼容,可以方便与TTL电路连接。

拓展:

        1. 什么是差分信号?

        官方点说:差分信号是用一个数值来表示两个物理量之间的差异。简单来说就是:通常我们通信的信号都是通过一根线来表示高低电平1 或者 0 的,但是差分信号是通过 2 根线互铰在一起传达的(如下图),更精确的说是2根线传达一个信号,这个信号可以是0,也可以是1(不像我们平时通信,1 根线传 0,另一根线传 1)。通过这两根线传达的电平高低差异来定义逻辑1 和逻辑 0 。 

        2.  为什么RS485可以通过差分信号明显的降低噪声干扰?

        其实在我们日常生活中,差分信号的应用还是很多的。比方说我们家用的网线,细心的可以发现,其中就是通过两根线互铰在一起的。

        之所以能明显的降低噪声干扰,是因为噪声是确确实实存在的,我们无法直接去掉这种干扰,可以反过来这样的考虑,既然无法处理这种干扰,那不妨就让他干扰,因为差分信号是用两根线进行传递一个信号的,所以噪音只要干扰,一定是同时干扰我的两根线的,而且干扰我的两根线的程度一定是相同的,这样一来,逻辑1 还是逻辑 1 ,逻辑0 还是逻辑 0 。没有实质上的影响。

接口:

        RS485采用两线制(RS422采用四线制),两线制就是说 RS485 设备通过两根线连接到主机上即可实现通信,这种接线方式为总线式拓扑结构,在同一总线上可以同时存在多个节点。也就是可以连接多个 RS485 设备,实现组成一个通信网络。

        因为采用的是两线制,数据的发送和接收都是要使用这对差分信号线,(两根线是互铰在一起的,发送的时候同时需要这两根线,接收的时候也同时需要这两根线)发送和接收不能同时进行(所以虽然是两根线,但是不能一根用来发送,另外一根用来接收),所以只能采用半双工的方式进行,编程时需要进行格外的处理。

RS485主从机通信:

        通过对 IIC 和 SPI 的学习,我们知道 IIC 通信是通过主机寻址的方式进行的,对应的每个 IIC 从机都有一个确定的地址,主机想要和哪个从机进行通信,找到对应从机的地址即可进行通信。SPI 通信时主机上对应多个 SPI 片选信号线 CS ,有的地方也称作 SS、NSS,实际上是一个意思,都是片选信号线,每个 SPI 从机上都有独立的片选信号线,主机想要和特定的从机通信时,只需要将对应从机的片选信号线置 0 即可,结束通讯时只需要将片选信号线置 1 即可。那么 RS485 呢?

        事实上,RS485的主从机通讯并没有明确的规定,这完全由我们编程的程序来确定,我们可以效仿 IIC ,给每个从机写一个确定的地址,通过寻址的方式来确定主从机通讯。当然,也可以是其他的方式。

电平转换:

        虽然很多处理器都会集成 UART 控制器,但处理器产生的信号一般都是TTL信号并不是符合 RS485 标准的信号,所以一般我们还需要在处理器外部去添加电路将TTL信号转换成差分信号。RS485用到的TTL信号转换成差分信号的芯片就是SP3485。

RO:接收输出引脚。

RE:接收输出使能。(接收使能信号低电平有效)

DE:驱动输出使能。(发送使能信号高电平有效)

DI:驱动输入使能。

GND:地。

A:总线接口,用于连接485总线。 接线的时候A对A,B对B。

B:总线接口,用于连接485总线。

VCC:该芯片支持3.3V供电。

RS485的优势:

        1. 接口信号的电平值较低,不易损坏接口电路芯片,且与TTL电平兼容,可以方便的与TTL电路连接。

        2. 通信速度快。

        3. 抗噪声干扰性强。

        4. 传输距离远(1500m)。

        5. 可以实现多节点网络。

总结:

        举个例子来说明本节中 RS485 和 RS232 的用处。

        我们从A地去往B地。串口UART的方式就是保证谁先去,谁先谁后的顺序,其他的一概不管。而RS485和RS232在串口的基础上强调了怎么去,比方说我们是坐火车、高铁还是飞机的方式,具体什么方式还需要我们来选择,选择不同的方式会大大的减少出行的时间。

6. 硬件分析

        上图是 STM32F4 的 RS485 的相关引脚连接图。其中 SP3485 芯片中的 RE 和 DE 引脚分别为接收使能引脚和发送使能引脚。通过 RS485_RE 连接到芯片的 PG8 引脚上,使能控制SP3485 的收发,当 PG8=0,输出低电平,RE接收使能有效,为接收模式;当 PG8=1,输出高电平,DE 发送使能有效,为发送模式。

        这里需要注意,PA2,PA3 和 ETH_MDIO 和 PWM_DAC 有共用 IO,所以在使用的时候,注意 分时复用,不能同时使用。另外 RS485_RE 信号,也和 NRF_IRQ 共用 PG8,所以他们也不可 以同时使用,只能分时复用。

        电阻 R38 和 R40 是两个偏置电阻,是用来保证总线空闲时,A B 压差不定,引起逻辑错乱,可能出现乱码的情况。

        C71 是电源滤波电容,保证芯片 SP3485 正常稳定的运行,过滤掉其他噪声的干扰。

        本次实验需要将两个开发板上的 P9排针 的跳线帽按上图进行连接;

        最后,我们用 2 根导线将两个开发板 RS485 端子的 A 和 A,B 和 B 连接起来。这里注意不 要接反了(A 接 B),接反了会导致通讯异常!!

7. 实验程序

        本实验将实现两个开发板之间的RS485通讯,KEY0控制发送,当按下开发板的KEY0按键时,就会发送5个数据给另外一个开发板,在两个开发板上分别显示发送的值和接收到的值。

7.1 main.c #include "stm32f4xx.h" #include "delay.h" #include "usart.h" #include "LED.h" #include "lcd.h" #include "Key.h" #include "usmart.h" #include "RS485.h" //LCD状态设置函数 void led_set(u8 sta)//只要工程目录下有usmart调试函数,主函数就必须调用这两个函数 { LED1=sta; } //函数参数调用测试函数 void test_fun(void(*ledset)(u8),u8 sta) { led_set(sta); } int main(void) { u8 key; u8 i=0; u8 t=0; u8 CNT=0; //CNT是一个累加数,一旦KEY0按下,就以这个数位基准连续发送5个数据 u8 RS485Buf[5]; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168); uart_init(115200); //切记:不初始化延迟函数和串口是不能用LCD的 LED_Init(); LCD_Init(); Key_Init(); RS485_Init(9600); //初始化RS485,设置波特率为9600 POINT_COLOR=RED; LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"RS485 TEXT"); LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(30,110,200,16,16,"2023/06/08"); LCD_ShowString(30,130,200,16,16,"KEY0:Send"); //显示提示信息,按KEY0发送 POINT_COLOR=BLUE; LCD_ShowString(30,150,200,16,16,"Count:"); //显示当前计数值 LCD_ShowString(30,170,200,16,16,"Send Data:"); //提示发送的数据 LCD_ShowString(30,210,200,16,16,"Receive Data:"); //提示接收到的数据 while(1) { key=KEY_Scan(0); //获取Key按键扫描函数 if(key==1) //KEY0按下,显示发送一位数据 { for(i=0;i5)//因为定义的接收缓存区最大值就是5 key=5; for(i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有