首页 » 科学 » 正点原子开拓者FPGA开拓板资料连载第十七章 RS485串口通信实验_暗记_旗子

正点原子开拓者FPGA开拓板资料连载第十七章 RS485串口通信实验_暗记_旗子

神尊大人 2024-11-15 01:44:38 0

扫一扫用手机浏览

文章目录 [+]

2)摘自《开拓者FPGA开拓指南》关注官方微旗子暗记"大众年夜众号,获取更多资料:正点原子

3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-13912-1-1.html

正点原子开拓者FPGA开拓板资料连载第十七章 RS485串口通信实验_暗记_旗子 科学

第十七章 RS485串口通信实验

RS-485是针对UART串口的一种接口标准,它定义了串行通信系统中发送器和吸收器的一系

列电气特性。
比较于RS-232,RS-485标准的通信系统抗滋扰能力较强,可实现长间隔数据传输,

同时支持多个收发器连接到同一个通信网络中。
因此,RS-485在工业掌握领域以及有类似需求

的系统中得到了广泛的运用。

本章包括以下几个部分:

17.1 RS-485简介

17.2 实验任务

17.3 硬件设计

17.4 程序设计

17.5 下载验证

RS-485简介

在“串口通信实验”章节我们详细地先容了UART串口通信以及RS-232接口标准。
实际上,

除了RS-232之外,RS-422和RS-485也都是常用的串行通信接口标准,它们定义了接口不同的电

气特性,如RS-232是单端输入输出,而RS-422/485为差分输入输出等。

在先容RS-485之前,我们先来理解一下串口通信过程中单端传输与差分传输的差别。
单端

传输是指在发送或吸收过程中,用旗子暗记线对地线的电压值来表示逻辑“0”和“1”。
而差分传

输利用两根旗子暗记线来传输一起旗子暗记,这两根旗子暗记线上传输的旗子暗记幅值相等,相位相差180度(极

性相反),用它们的差值来表示逻辑“0”和“1”,如图 17.1.1所示。

图 17.1.1 差分传输办法

在传输过程中,当旗子暗记线上叠加了频率、幅值和相位都相同的滋扰旗子暗记时(共模滋扰),

对付单端传输而言,由于地线电位为0,则传输的旗子暗记就包含了滋扰旗子暗记;而在差分传输办法

下,滋扰可以通过两个旗子暗记线上电压的差值抵消,相称于抑制了共模滋扰,如图 17.1.2所示。

因此相对付单端传输办法,差分传输大大提高了旗子暗记在传输过程中的抗滋扰能力,但是须要多

余的旗子暗记线来实现旗子暗记传输。

图 17.1.2 差分传输抑制共模滋扰

RS-232接口标准涌现较早,旗子暗记采取负逻辑电平、单端传输办法事情。
通过一根旗子暗记线发

送,一根旗子暗记线吸收,加上一根地线,RS-232可实现全双工通信。
由于单端传输办法抗滋扰能

力差,导致RS-232标准通信间隔短(小于15米),数据传输速率低等问题。
其余RS-232仅支持

一对一通信,存在无法实现多个设备互联的缺陷。

RS-422由RS-232发展而来,它是为填补RS-232之不敷而提出的。
RS-422采取差分传输(又

称平衡传输)办法,将最大传输速率提高到10Mbps;当传输速率在100kbps以下时,传输间隔

可达1200米。
由于采取差分传输办法,RS-422须要4根旗子暗记线来实现全双工通信,两根用于发

送、两根用于吸收,一样平常会再加上一根地线。
RS-422许可在一条传输总线上连接最多10个吸收

器,从而实现单个设备发送,多个设备吸收的功能。

为扩展运用范围,在RS-422根本上又制订了RS-485标准。
RS-485同样采取差分传输办法,

但是RS-485只有2根旗子暗记线,由发送和吸收共用,因此发送和吸收不能同时进行,只能实现半

双工通信。
RS-485增加了多点、双向通信能力,即许可多个发送器连接到同一条总线上,各设

备通过使能旗子暗记掌握发送和吸收过程。

实验任务

本节实验任务是利用两块开拓者开拓板通过RS-485端口互联,由各自开拓板上的四个按键

分别掌握对方开拓板上四个LED灯的亮灭。
当按键按下时,对方开拓板上对应的LED灯点亮;按

键开释时,对应的LED灯熄灭。

硬件设计

RS485串口部分的事理图如图 17.3.1所示。
由于FPGA串口输入输出引脚为TTL电平,用3.3V

代表逻辑“1”,0V代表逻辑“0”;而RS-485电平标准采取差分旗子暗记的差值电压来代表逻辑“0”

和“1”。
因此当FPGA与RS485接口标准的设备通信时,须要加电平转换芯片SP3485,实现RS485

电平与TTL电平的转换。

图 17.3.1 RS485串口事理图

由于RS-485为半双工通信办法,须要通过使能旗子暗记来掌握发送和吸收过程。
在图 17.3.1

中,电平转换芯片SP3485的2号引脚为低电平吸收使能,3号引脚为高电平发送使能。
在这里我

们将两个引脚连接在一起,只须要通过一个旗子暗记RS485_DE即可掌握收发过程:当RS485_DE为高

电平时,SP3485处于发送过程;当RS485_DE为低电平时,SP3485处于吸收过程。

图 17.3.2 RS232/RS485选择接口

图 17.3.2为RS232/RS485的选择接口,由上图可知,SP3485芯片端口的RS485_RX和

RS485_TX并没有直接和FPGA的引脚相连接,而是连接到开拓板的P2口,RS232串口和RS485串口

共用P2口的UART2_TX和UART2_RX,UART2_TX和UART2_RX是直接和FPGA的引脚相连接的,这样的

设计办法实现了有限IO的多种复用功能。
因此,在做RS485串口通信实验时,须要利用杜邦线

或者跳帽将RS485_RX和UART2_TX连接在一起,RS485_TX和UART2_RX连接在一起。

本实验中,各端口旗子暗记的管脚分配如下表所示:

表 17.3.1 RS485串口通信实验管脚分配

程序设计

根据实验任务,我们可以大致方案出系统的掌握流程:当检测到有按键按下或开释时,将

按键数据通过RS485串口发送出去;而当RS485串口吸收到对方发送的按键数据时,根据吸收到

的数据改变LED灯的显示状态。
由此画出系统的功能框图如下所示:

图 17.4.1 RS485串口实验系统框图

由系统总体框图可知,FPGA部分包括五个模块,顶层模块(rs485_uart_top)、吸收模块

(uart_recv)、发送模块(uart_send)、按键消抖模块(key_debounce)和LED灯掌握模块

(led_ctrl)。
个中在顶层模块中完成对其余四个模块的例化。

由于RS-485只是对接口标准的定义,数据的传输仍旧是按照UART串口通信协议进行。
因此

我们可以直接调用“串口通信实验”中的串口发送和吸收模块。
在这里我们仍旧设置数据位为

8位,停滞位为1位,无校验位,波特率为115200bps。

各模块端口及旗子暗记连接如图 17.4.2所示:

图 17.4.2 顶层模块事理图

key_debounce为按键消抖模块,在检测到有按键按下或开释时对按键数据进行消抖处理,

在按键数据稳定后给出关照旗子暗记key_flag,并将数据由串口发送模块uart_send发送出去。

uart_recv为串口吸收模块,它卖力吸收对方发送的按键数据,并在一帧数据(8位)吸收结束

后给出关照旗子暗记uart_done。
当LED灯掌握模块led_ctrl检测到该关照旗子暗记时,根据吸收到的按

键数据改变板卡上LED灯的显示状态。

顶层模块的代码如下:

1 module rs485_uart_top(

2 input sys_clk, //外部50M时钟

3 input sys_rst_n, //外部复位旗子暗记,低有效

4

5 input [3:0] key, //按键

6 output [3:0] led, //led灯

7 //uart接口

8 input rs485_uart_rxd, //rs485串口吸收端口

9 output rs485_uart_txd, //rs485串口发送端口

10 output rs485_tx_en //rs485发送使能,高有效

11 );

12

13 //parameter define

14 parameter CLK_FREQ = 50000000; //定义系统时钟频率

15 parameter UART_BPS = 115200; //定义串口波特率

16

17 //wire define

18 wire tx_en_w; //UART发送使能

19 wire rx_done_w; //UART吸收完毕旗子暗记

20 wire [7:0] tx_data_w; //UART发送数据

21 wire [7:0] rx_data_w; //UART吸收数据

22 wire [3:0] key_value_w; //消抖后的按键数据

23

24 //

25 // main code

26 //

27 assign tx_data_w = {4'd0,key_value_w}; //将按键消抖后的值送到发送模块

28

29 uart_recv #( //串口吸收模块

30 .CLK_FREQ (CLK_FREQ), //设置系统时钟频率

31 .UART_BPS (UART_BPS)) //设置串口吸收波特率

32 u_uart_recv(

33 .sys_clk (sys_clk),

34 .sys_rst_n (sys_rst_n),

35

36 .uart_rxd (rs485_uart_rxd),

37 .uart_done (rx_done_w),

38 .uart_data (rx_data_w)

39 );

40

41 uart_send #( //串口发送模块

42 .CLK_FREQ (CLK_FREQ), //设置系统时钟频率

43 .UART_BPS (UART_BPS)) //设置串口发送波特率

44 u_uart_send(

45 .sys_clk (sys_clk),

46 .sys_rst_n (sys_rst_n),

47

48 .uart_en (tx_en_w),

49 .uart_din (tx_data_w),

50 .uart_txd (rs485_uart_txd),

51 .tx_flag (rs485_tx_en) //rs485串口发送使能,高有效

52 );

53

54 key_debounce u_key_debounce(

55 .sys_clk (sys_clk),

56 .sys_rst_n (sys_rst_n),

57

58 .key (key),

59 .key_flag (tx_en_w), //按键有效关照旗子暗记

60 .key_value (key_value_w) //按键消抖后的数据

61 );

62

63 led_ctrl u_led_ctrl(

64 .sys_clk (sys_clk),

65 .sys_rst_n (sys_rst_n),

66

67 .led_en (rx_done_w), //led掌握使能

68 .led_data (rx_data_w[3:0]), //led掌握数据

69 .led (led)

70 );

71

72 endmodule

顶层模块中紧张完成对别的模块的例化,须要把稳的是程序第27行:由于板卡上只有4个

按键,而串口通信过程中数据位为8位,因此须要将消抖后得到的4按键位数据高位补四个零,

然后再给到串口发送模块。
同样,在将吸收的按键数据用于LED灯掌握时,仅将低四位有效位

赋值给LED灯掌握模块,如第68行所示。

串口吸收程序与“串口通信实验”章节中的吸收模块完备相同,而串口发送程序有一点细

微的差异:将串口发送模块内部的“发送过程标志寄存器”tx_flag作为输出端口引出,如代

码中第51行所示。
由于在发送过程中tx_flag为高电平,发送结束后tx_flag拉低,因此可以将

其赋值给RS-485串口发送使能旗子暗记rs485_tx_en,用于掌握串口通信的发送和吸收过程。

rs485_tx_en旗子暗记通过FPGA管脚与SP3485芯片的DE和RE引脚相连,因此在串口发送过程中使能

SP3485进入发送状态,其他韶光SP3485均处于吸收状态。

有关串口收发过程更详细的先容请大家参考“串口通信实验”,下面我们来先容一下其余

两个模块:按键消抖模块和LED灯掌握模块。

在机器按键按下和开释的过程中,由于机器触点的弹性浸染,按键开关在闭合的瞬间不会

立即稳定地导通,在开释时也不是急速就能完备断开。
因此,在闭合及断开的瞬间均伴随有一

连串的抖动,如图 17.4.3所示。
按键的抖动过程表示在数字电路中便是不断变革的高低电平,

为避免在抖动过程中采集到缺点的按键状态,我们须要对按键数据进行肃清抖动处理。

图 17.4.3 机器按键抖动过程

按键抖动的韶光是非由按键的机器特性决定,一样平常为5ms~10ms,在抖动韶光内按键状态

可能会不断的发生变革。
由于按键的抖动过程持续韶光较短,很快就趋于稳定状态。
因此在按

键按下及开释之后,若按键能稳定在同一状态且持续韶光达20ms,我们就认为抖动过程已经结

束,此时的采集的按键数据有效。

按键消抖模块的代码如下所示:

1 module key_debounce(

2 input sys_clk, //外部50M时钟

3 input sys_rst_n, //外部复位旗子暗记,低有效

4

5 input [3:0] key, //外部按键输入

6

7 output reg key_flag, //按键数据有效旗子暗记

8 output reg [3:0] key_value //按键消抖后的数据

9 );

10

11 //reg define

12 reg [31:0] delay_cnt;

13 reg [ 3:0] key_reg;

14

15 //

16 // main code

17 //

18 always @(posedge sys_clk or negedge sys_rst_n) begin

19 if (!sys_rst_n) begin

20 key_reg <= 4'b1111;

21 delay_cnt <= 32'd0;

22 end

23 else begin

24 key_reg <= key;

25 if(key_reg != key) //一旦检测到按键状态发生变革(有按键被按下或开释)

26 delay_cnt <= 32'd1000000; //给延时计数看重新装载初始值(计数韶光为20ms)

27 else if(key_reg == key) begin //在按键状态稳定时,计数器递减,开始20ms倒计时

28 if(delay_cnt > 32'd0)

29 delay_cnt <= delay_cnt - 1'b1;

30 else

31 delay_cnt <= delay_cnt;

32 end

33 end

34 end

35

36 always @(posedge sys_clk or negedge sys_rst_n) begin

37 if (!sys_rst_n) begin

38 key_flag <= 1'b0;

39 key_value <= 4'b1111;

40 end

41 else begin

42 if(delay_cnt == 32'd1) begin //当计数器递减到1时,解释按键稳定状态坚持了20ms

43 key_flag <= 1'b1; //此时消抖过程结束,给出一个时钟周期的标志旗子暗记

44 key_value <= key; //并寄存此时按键的值

45 end

46 else begin

47 key_flag <= 1'b0;

48 key_value <= key_value;

49 end

50 end

51 end

52

53 endmodule

程序中第25行不断检测按键状态,一旦创造按键状态发生改变时,就给计数器delay_cnt

赋初值1000000。
在按键状态不发生改变时delay_cnt递减从而实现倒计时的功能,在倒计时过

程中,一旦检测到按键状态发生改变,则解释有抖动产生,此时重新给delay_cnt赋初值,并

开始新一轮倒计时。
在50Mhz时钟驱动下,delay_cnt若能由1000000递减至1,则解释按键状态

保持稳定韶光达20ms,此时输出一个时钟周期的关照旗子暗记key_flag,并将此时的按键数据寄存

输出。

串口吸收模块在吸收对方发送的按键数据后,将数据低4位(高4位为零)给到LED掌握模

块,并输出关照旗子暗记uart_done。
LED灯掌握模块在检测到uart_done的上升沿时,利用吸收到

的按键数据改变LED灯的显示状态。

LED灯掌握模块的代码如下:

1 module led_ctrl(

2 input sys_clk, //外部50M时钟

3 input sys_rst_n, //外部复位旗子暗记,低有效

4

5 input led_en, //led掌握使能

6 input [3:0] led_data, //led掌握数据

7

8 output reg [3:0] led //led灯

9 );

10

11 //reg define

12 reg led_en_d0;

13 reg led_en_d1;

14

15 //wire define

16 wire led_en_flag;

17

18 //

19 // main code

20 //

21 //捕获led_en上升沿,得到一个时钟周期的脉冲旗子暗记

22 assign led_en_flag = (~led_en_d1) & led_en_d0;

23

24 always @(posedge sys_clk or negedge sys_rst_n) begin

25 if (!sys_rst_n) begin

26 led_en_d0 <= 1'b0;

27 led_en_d1 <= 1'b0;

28 end

29 else begin

30 led_en_d0 <= led_en;

31 led_en_d1 <= led_en_d0;

32 end

33 end

34

35 always @(posedge sys_clk or negedge sys_rst_n) begin

36 if (!sys_rst_n)

37 led <= 4'b0000;

38 else if(led_en_flag) //在led_en上升沿到来时,改变led灯的状态

39 led <= ~led_data; //按键按下时为低电平,而led高电平时点亮

40 else

41 led <= led;

42 end

43

44 endmodule

由于开拓者开拓板上的按键在按下时为低电平,而LED为高电平时点亮,因此为了实现按

键按下时点亮对应LED灯的功能,须要将按键数据取反后赋值给LED输出端口寄存器,如代码中

第39行所示。

下载验证

首先我们打开RS485串口通信实验工程,在工程所在的路径下打开rs485_uart_top /par文

件夹,在里面找到“rs485_uart_top.qpf”并双击打开。
把稳工程所在的路径名只能由字母、数字以及下划线组成,不能涌现中文、空格以及分外字符等。
串口工程打开后如图 17.5.1所

示。

接下来我们将两个开拓者开拓板上的RS485接口用两根杜邦线连接起来,如图 17.5.2所

示。
连接时把稳接口位置逐一对应,不要接反了。
其余开拓者开拓板上的CAN接口与RS485接口

十分相像,利用时请把稳区分。
还有一点须要把稳的是,两块开拓板的P2口都须要利用杜邦线

或者跳帽进行连接选择RS485口,否则无法进行RS485串口通信。
然后分别将两个开拓板上的下

载器一端连电脑,另一端与开拓板上的JTAG下载端口连接,末了连接电源线并打开电源开关。

图 17.5.1 RS485串口通信实验工程

图 17.5.2 开拓者RS485接口、跳帽位置

接下来我们下载程序,验证两个开拓者开拓板上的按键通过RS-485通信端口掌握对方LED

灯亮灭的功能。
工程打开后通过点击工具栏中的“Programmer”图标打开下载界面,通过“Add

File” 按 钮 选择串 口工程 中 rs485_uart_top/par/output_files 目 录 下 的

“rs485_uart_top.sof”文件,下载界面如图 17.5.3所示。

开拓板电源打开后,在程序下载界面点击“Hardware Setup”,在弹出的对话框中选择当

前的硬件连接为“USB-Blaster[USB-0]”。
然后点击“Start”将工程编译完成后得到的sof文

件下载到第一块开拓板中,如图 17.5.3所示。
然后重新设置硬件连接为“USB-Blaster[USB-

1]”,将“rs485_uart_top.sof”文件下载到第二块开拓板中。

图 17.5.3 程序下载完成界面

下载完成后我们依次按下任意一个开拓板上的四个按键,可以不雅观察到其余一个开拓板上对

应的LED灯在按下时点亮,开释时熄灭,解释程序下载验证成功。

标签:

相关文章

e语言,推动智能时代发展的关键力量

随着科技的飞速发展,人类已经迈入了智能时代。在这个时代,语言作为人类交流的重要工具,也在不断演变。e语言作为一种新兴的语言形式,正...

科学 2025-01-05 阅读0 评论0

E语言API,驱动创新,赋能未来

随着信息技术的飞速发展,编程语言在各个领域的应用日益广泛。其中,E语言作为一款新兴的编程语言,凭借其简洁、高效的特点,受到越来越多...

科学 2025-01-05 阅读0 评论0

FISC语言,推动金融科技发展的关键力量

随着科技的飞速发展,金融行业正经历着一场前所未有的变革。在这个过程中,FISC语言作为一种新兴的技术,正逐渐成为推动金融科技发展的...

科学 2025-01-05 阅读0 评论0

Go语言,引领未来编程潮流的技术利器

随着互联网技术的飞速发展,编程语言层出不穷,但能够引领潮流的却寥寥无几。在这其中,Go语言以其独特的魅力和强大的功能脱颖而出,成为...

科学 2025-01-05 阅读0 评论0

Go语言,高效编程的未来力量

随着互联网技术的飞速发展,编程语言层出不穷。在众多编程语言中,Go语言凭借其高效、简洁、易学等特点,逐渐成为开发者的新宠。本文将从...

科学 2025-01-05 阅读0 评论0