文档库 最新最全的文档下载
当前位置:文档库 › UART串口通信设计实例

UART串口通信设计实例

UART串口通信设计实例
UART串口通信设计实例

2.5 UART串口通信设计实例(1)

接下来用刚才采用的方法设计一个典型实例。在一般的嵌入式开发和FPGA设计中,串口UART是使用非常频繁的一种调试手段。下面我们将使用Verilog RTL编程设计一个串口收发模块。这个实例虽然简单,但是在后续的调试开发中,串口使用的次数比较多,这里阐明它的设计方案,不仅仅是为了讲解RTL编程,而且为了后续使用兼容ARM9内核实现嵌入式开发。

串口在一般的台式机上都会有。随着笔记本电脑的使用,一般会采用USB转串口的方案虚拟一个串口供笔记本使用。图2-7为UART串口的结构图。串口具有9个引脚,但是真正连接入FPGA开发板的一般只有两个引脚。这两个引脚是:发送引脚TxD和接收引脚RxD。由于是串行发送数据,因此如果开发板发送数据的话,则要通过TxD线1 bit接着1 bit 发送。在接收时,同样通过RxD引脚1 bit接着1 bit接收。

再看看串口发送/接收的数据格式(见图2-8)。在TxD或RxD这样的单线上,是从一个周期的低电平开始,以一个周期的高电平结束的。它中间包含8个周期的数据位和一个周期针对8位数据的奇偶校验位。每次传送一字节数据,它包含的8位是由低位开始传送,最后一位传送的是第7位。

这个设计有两个目的:一是从串口中接收数据,发送到输出端口。接收的时候是串行的,也就是一个接一个的;但是发送到输出端口时,我们希望是8位放在一起,成为并行状态(见图2-10)。我们知道,串口中出现信号,是没有先兆的。如果出现了串行数据,则如何通知到输出端口呢?我们引入“接收有效”端口。“接收有效”端口在一般情况下都是低电平,一旦有数据到来时,它就变成高电平。下一个模块在得知“接收有效”信号为高电平时,它就明白:新到了一个字节的数据,放在“接收字节”端口里面。

二是发送数据到串口。发送数据的时候,我们也希望输入端口能够给出一个简单的形式。我们引入“发送有效”信号,它为高电平,表示我们希望把“发送字节”送入TxD发送出去。但是“发送有效”信号是否生效是有限制的,也就是正在发送的时候,是不能接收新的数据并发送的。所以,我们引入一个“发送状态”信号,它标识当前的“发报机”是否处于忙碌状态。如果“发报机”处于忙碌状态,则它拒绝“发送有效”信号,不予执行。

根据上面的分析,可以确定端口信号如下:

1.module rxtx (

2. clk,

3. rst,

4. rx,

5. tx_vld,

6. tx_data,

7.

8. rx_vld,

9. rx_data,

10. tx,

11. txrdy

12. );

13.input clk;

14.input rst;

15.input rx;

16.input tx_vld;

17.input [7:0] tx_data;

18.

19.output rx_vld;

20.output [7:0] rx_data;

21.output tx;

22.output txrdy;

rx对应RxD,tx对应TxD。rx_vld就是“接收有效”信号,rx_data则是“接收字节”信号。tx_vld是“发送有效”信号,tx_data是“发送字节”信号。txrdy是“发送状态”信号,它是低电平表示正处于发送状态,不接收新的字节而进行发送。

我们知道,串行数据的频率是9600Hz,而FPGA开发板的频率却是非常高的。这里,我们假定FPGA的工作频率是25MHz,则串口发送1位信息,则FPGA上的clk需要计数:25 000 000/9600=2604次。我们知道rx一旦变化,不论是从0到1,还是从1到0,都表示1位信息的传递开始。因此,我们在设计一个最大计数值为2604的计数器的时候,rx的变化都将导致这个计数器重新开始计数。如果计数到2604附近,rx发生变化,那么又将导致计数器清零;如果rx没有发生变化,没关系,计数器在计数到2604时,自动清零。因此,rx的变化会不断调整计数器的计数。

在这个计数器计算到中间,也就是1302时,是最佳采样时刻,这个时候,rx的电平是我们需要知道的位信息。对于rx的接收,需要2~3个寄存器同步,来消除异步传送的不确定性。下面描述的rx1、rx2、rx3、rxx只是对rx进行延时,消除异步效果。

1.reg rx1,rx2,rx3,rxx;

2.always @ ( posedge clk ) begin

3. rx1 <= rx;

4. rx2 <= rx1;

5. rx3 <= rx2;

6. rxx <= rx3;

7. end

对于rxx,我们将检测它的变化,这个变化将作为置位计数器的标志。rx_change表示rxx 发生了改变,它比较了rx_dly和rxx的差别。

1.reg rx_dly;

2.always @ ( posedge clk )

3. rx_dly <= rxx;

4.

5.wire rx_change;

6.assign rx_change = (rxx != rx_dly );

下面将实现一个计数器,它将以2604为周期进行计数。如果rx保持长时间不变,比如传送多个1或多个0,则计数器以2604为周期计数,可以计算到底有多少个1或0传送—因为在传送多个1或0时,rx是不会发生变化的,但是计数器会从2604恢复到0,可以计算传递了多少位。rx_en是我们提取rx的标志时刻,这时候计数器位于串行数据的中间—计数到1302时。

1.reg [13:0] rx_cnt;

2.always @ ( posedge clk or posedge rst )

3.if ( rst )

4. rx_cnt <= 0;

5.else if ( rx_change | ( rx_cnt==14'd2603 ) )

6. rx_cnt <= 0;

7.else

8. rx_cnt <= rx_cnt + 1'b1;

9.

10.wire rx_en;

11.assign rx_en = ( rx_cnt==14'd1301 );

如果在RxD检测到0,即在rx_en等于1时,检测到rxx等于1'b0,我们知道探测到一个字节的传送开始。这标志着后续将传送8位数据、1个奇偶校验位和1个停止位。因此,在rx_en==1'b1,rxx==1'b0时,启动一个以10为周期的计数器。以10为周期的计数器递进的标志是rx_en==1'b1—这是传送1个位的标志。当计数到9时,计数终止,计数器清0,此时一个字节的数据接收完毕。在第二次探测到rxx在rx_en有效时等于0,又将重复第二次计数,如此周而复始。

1.reg data_vld;

2.always @ ( posedge clk or posedge rst )

3.if ( rst )

4. data_vld <= 1'b0;

5.else if ( rx_en & ~rxx & ~data_vld )

6. data_vld <= 1'b1;

7.else if ( data_vld & ( data_cnt==4'h9 ) & rx_en )

8. data_vld <= 1'b0;

9.else;

10.

11.reg [3:0] data_cnt;

12.always @ ( posedge clk or posedge rst )

13.if ( rst )

14. data_cnt <= 4'b0;

15.else if ( data_vld )

16. if ( rx_en )

17. data_cnt <= data_cnt + 1'b1;

18. else;

19.else

20.data_cnt <= 4'b0;

我们在前面已经用到了这个计数器形式。在这里,使用这种类型计数器,就是通过探测到传送开始的0位,启动一个以10为周期的计数器进行对后续位的接收,并在接收完毕后,自动恢复到初态。在data_vld为高电平时,对应8位数据、1个奇偶校验位以及1个停止位的接收。所以data_cnt从0到7计数时,我们可以依次接收rxx的数据。因为rxx是从低位到高位传递,所以向右移位。

1.reg [7:0] rx_data;

2.always @ ( posedge clk or posedge rst )

3.if ( rst )

4. rx_data <= 7'b0;

5.else if ( data_vld & rx_en & ~data_cnt[3] )

6. rx_data <= {rxx,rx_data[7:1]};

7.else;

同理,在data_vld计数到停止位时,我们认为该字节接收完毕,发送一个周期的高电平信号,通知给其他模块:表示已经接收到1字节,位于rx_data内。其他模块在探测到rx_vld 为高电平时,取出rx_data。

1.always @ ( posedge clk or posedge rst )

2.if ( rst )

3. rx_vld <= 1'b0;

4.else

5.rx_vld <= data_vld & rx_en & ( data_cnt==4'h9);

以上就是串口接收数据的设计代码。在发送时,我们也希望能够利用rx_en这个定时信息,使用它来发送数据。首先,我们在tx_vld==1'b1时,保存tx_data,用来发送。tx_rdy_data 就是用来暂存tx_data的。只有在txrdy等于1的情况下,也就是发送单元处于空闲状态时,tx_data才能保存入tx_rdy_data。

1.reg [7:0] tx_rdy_data;

2.always @ ( posedge clk or posedge rst )

3.if ( rst )

4. tx_rdy_data <= 8'b0;

5.else if ( tx_vld & txrdy )

6. tx_rdy_data <= tx_data;

7.else;

当tx_vld有效时,会触发一个发送过程。在发送时,tx会发送起始0位、8位数据、1个奇偶校验位和1个停止位,总共是11位。因此,tx_vld触发了一个以11为周期的计数

器,在每计数到一个数以后,会发送相应的位信息。在发送完毕后,计数器清0。

1.reg tran_vld;

2.always @ ( posedge clk or posedge rst )

3.if ( rst )

4. tran_vld <= 1'b0;

5.else if ( tx_vld )

6. tran_vld <= 1'b1;

7.else if ( tran_vld & rx_en & ( tran_cnt== 4'd10 ) )

8. tran_vld <= 1'b0;

9.else;

10.

11.reg [3:0] tran_cnt;

12.always @ ( posedge clk or posedge rst )

13.if ( rst )

14. tran_cnt <= 4'b0;

15.else if ( tran_vld )

16. if( rx_en )

17. tran_cnt <= tran_cnt + 1'b1;

18. else;

19.else

20.tran_cnt <= 4'b0;

在上面,我们用到了同类的计数器。这类计数器通常由一个电平触发,然后持续固定的时间,这样就能做到收发自如,可控性比较好。下面,我们根据计数器计数值发出tx信息。tx的电平会在每次rx_en有效的时候改变。

1.reg tx;

2.always @ ( posedge clk or posedge rst )

3.if ( rst )

4. tx <= 1'b1;

5.else if ( tran_vld )

6. if ( rx_en )

7. case ( tran_cnt )

8. 4'd0 : tx <= 1'b0;

9. 4'd1 : tx <= tx_rdy_data[0];

10. 4'd2 : tx <= tx_rdy_data[1];

11. 4'd3 : tx <= tx_rdy_data[2];

12. 4'd4 : tx <= tx_rdy_data[3];

13. 4'd5 : tx <= tx_rdy_data[4];

14. 4'd6 : tx <= tx_rdy_data[5];

15. 4'd7 : tx <= tx_rdy_data[6];

16. 4'd8 : tx <= tx_rdy_data[7];

17. 4'd9: tx <= ^tx_rdy_data;

18. 4'd10: tx <= 1'b1;

19. default: tx <= 1'b1;

20. endcase

21. else;

22.else

23.tx<= 1'b1;

最后,给出txrdy的描述。txrdy对外界提供一个信息:不能在txrdy为低电平时传送新的数据,因为发送单元正处于传送数据的过程中,不能接收新的数据了。

1.assign txrdy = ~tran_vld;

如果在上面的代码的基础上再加上endmodule,就是一个完整的Verilog RTL设计了。

UART IP设计

UART IP设计文档 1,主要特征; UART采用的是一种起止式异步协议,特点是一个字符一个字符地传输,并且传送一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。一个字符传送完成后,奇偶校验位之后的停止位和空闲位都规定为高电平,而起始位为低电平,这样就保证起始位开始处一定有个下降沿,这个下降沿用来界定一个字符传输的开始,它的到来就表示下面是数据位,要准备接收;而停止位标志一个字符的结束,它的出现表示一个字符传送完毕,这样就为通信双方提供了何时开始收发和何时结束的标志。 2,整体框图 图2.1 UART IP整体框图 UART IP的整体框图如图2.1所示。它有控制电路模块、发送控制模块和接收控制模块三部分组成。CPU通过对控制电路模块中的寄存器进行设置达到对内部电路的控制和管理,从而实现UART和CPU以及其它UART模块间的数据收发功能。3,整个模块的外部接口 图3.1 UART IP外部接口 4,子模块说明 (一)控制电路模块 该模块的主要功能为:a、与CPU接口,将CPU对内部控制寄存器的写操作转化

为对发送控制器和接收控制器的控制信号;b、将CPU写入到内部数据发送寄存器的数据进行锁存并提供给发送控制器;c、将接收控制器接收的数据提交给CPU,同时提交接收数据的状态信息;d、对收、发控制器的中断进行管理。对于中断寄存器的读操作同时对寄存器清零,以避免重复产生中断,这需要专门的电路进行维护和管理。 (二)发送控制模块 该模块的主要功能为:a、根据clk_div_ctl给出的时钟分频比将xmt_data上的数据按照从低位到高位的顺序依次发出。在数据发送过程中需要根据规范插入起始位、奇偶校验位和停止位。b、发送控制器在xmt_en为高电平时开始向线路方向发送数据。完成当前字节发送后通过xmt_over通知控制电路当前发送完成,由控制电路负责产生中断和进行中断管理。 发送控制模块的仿真波形如下: 图4.1发送控制模块仿真波形 a.当发送状态机处于idle状态时,如果xmt _en有效则产生一个clk_cnt_clr 信号,用于对时钟计数器清零,同时进入start状态,见图4.1中“1”处。 b.在start状态下,如果sample有效则输出起始位,同时进入data状态,见图 4.1中“2”处。 c.在data状态下,在sample有效时连续输出8位数据。最后一个比特开始输出后进入parity状态,准备输出奇偶校验位,,见图4.1中“3”处。 d.在parity状态下,如果出现sample则进入stop状态,在stop状态下如果sample有效则输出截止位,并进入waiting状态,见图4.1中“4”处。 e.在waiting状态下,截止位保持有效,并在sample有效时进入idle状态,sdout 持续为1,见图4.1中“5”处。 f在由waiting进入idle状态时,输出xmt_over信号,通知控制电路当前数据发送完成。注意这里的xmt_over信号只是在一个时钟周期内保持有效,见图4.1中“6”处. (三)接收控制模块 该模块的主要功能为:a、检测接收数据中的起始位,并完整地接收数据。b、根

cc2530串口UART0通信实验(20200627130016)

/********************* 头文件*************************************************/ #include #include /********************* 宏定义*************************************************/ #define uint unsigned int #define uchar unsigned char // --------------- LED 控制端口------------------------------- // #define GLED P1_0〃绿色LED定义 #define RLED P1_1〃红色LED定义 // --------------- 按键输入端口------------------------------- // #define KEY1 P0_0 /********************* 全局变量**********************************************/ unsigned char Uart0_Rx; unsigned char Text_Data[]=" 海舟物联网教育!\r\n"; /********************* 函数声明***********************************************/ void Delay(uint); void Init_LED(void); void Init_Uart0(void); void Init_Sysclk(void); void Uart0_TX_Data(unsigned char *Data,int len); /****************************************************************************** * 函数名称: void Delay(uint n) * 函数功能: 软件延时函数 * 入口参数: * 出口参数: * 备注: ******************************************************************************/ void Delay(uint n) { uint i; for(i=0;i

RS232串口通信实验报告

RS232串口通信实验报告 学院:电子信息学院 班级:08031102 姓名:张泽宇康启萌余建军 学号:2011301966 2011301950 2011301961 时间:2014年11月13日 学校:西北工业大学

一.实验题目: 设计一个简单的基于串口通信的信息发送和接受界面 二.实验目的: 1.熟悉并掌握RS232串口标准及原理。 2.实现PC机通过RS232串口进行数据的收发。 3.熟悉VC语言编写程序的环境,掌握基本的VC语言编程技巧。 三.实验内容 程序代码: P// PC1PC2Dlg.cpp : implementation file // #include "stdafx.h" #include "PC1PC2.h" #include "PC1PC2Dlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

串口通信实验报告全版.doc

实验三双机通信实验 一、实验目的 UART 串行通信接口技术应用 二、实验实现的功能 用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。 三、系统硬件设计 (1)单片机的最小系统部分 (2)电源部分 (3)人机界面部分

数码管部分按键部分 (4)串口通信部分 四、系统软件设计 #include #define uchar unsigned char #define uint unsigned int void send(); uchar code0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的数码管显示 sbit H1=P3^6; sbit H2=P3^7;

sbit L1=P0^5; sbit L2=P0^6; sbit L3=P0^7; uint m=0,i=0,j; uchar temp,prt; /***y延时函数***/ void delay(uint k) { uint i,j; //定义局部变量ij for(i=0;i

{ m=1; //KEY1键按下 return(m); } if(H2==0) { m=4; //KEY4键按下 return(m); } } } if(L2==0) { delay(5); if (L2==0) { L2=0;H1=1;H2=1; if(H1==0) { m=2; //KEY2键按下 return(m); } if(H2==0) { m=5; //KEY5键按下 return(m); } } } if(L3==0) { delay(5); if (L3==0) { L3=0;H1=1;H2=1; if(H1==0) { m=3; //KEY3键按下

UART串口通信设计实例

2.5 UART串口通信设计实例(1) 接下来用刚才采用的方法设计一个典型实例。在一般的嵌入式开发和FPGA设计中,串口UART是使用非常频繁的一种调试手段。下面我们将使用Verilog RTL编程设计一个串口收发模块。这个实例虽然简单,但是在后续的调试开发中,串口使用的次数比较多,这里阐明它的设计方案,不仅仅是为了讲解RTL编程,而且为了后续使用兼容ARM9内核实现嵌入式开发。 串口在一般的台式机上都会有。随着笔记本电脑的使用,一般会采用USB转串口的方案虚拟一个串口供笔记本使用。图2-7为UART串口的结构图。串口具有9个引脚,但是真正连接入FPGA开发板的一般只有两个引脚。这两个引脚是:发送引脚TxD和接收引脚RxD。由于是串行发送数据,因此如果开发板发送数据的话,则要通过TxD线1 bit接着1 bit 发送。在接收时,同样通过RxD引脚1 bit接着1 bit接收。 再看看串口发送/接收的数据格式(见图2-8)。在TxD或RxD这样的单线上,是从一个周期的低电平开始,以一个周期的高电平结束的。它中间包含8个周期的数据位和一个周期针对8位数据的奇偶校验位。每次传送一字节数据,它包含的8位是由低位开始传送,最后一位传送的是第7位。

这个设计有两个目的:一是从串口中接收数据,发送到输出端口。接收的时候是串行的,也就是一个接一个的;但是发送到输出端口时,我们希望是8位放在一起,成为并行状态(见图2-10)。我们知道,串口中出现信号,是没有先兆的。如果出现了串行数据,则如何通知到输出端口呢?我们引入“接收有效”端口。“接收有效”端口在一般情况下都是低电平,一旦有数据到来时,它就变成高电平。下一个模块在得知“接收有效”信号为高电平时,它就明白:新到了一个字节的数据,放在“接收字节”端口里面。

UART串口通信实验报告

实验四 UART 串口通信 学院:研究生院 学号:1400030034 姓名:张秋明 一、 实验目的及要求 设计一个UART 串口通信协议,实现“串 <-->并”转换功能的电路,也就是 “通用异步收发器”。 二、 实验原理 UART 是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实 现全双工传输和接收。在嵌入式设计中,UART 用来主机与辅助设备通信,如汽 车音响与外接AP 之间的通信,与PC 机通信包括与监控调试器和其它器件,如 EEPROM 通信。 UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一 位接一位地传输。 其中各位的意义如下: 起始位:先发出一个逻辑” 0的信号,表示传输字符的开始。 资料位:紧接着起始位之后。资料位的个数可以是 4、5、6、7、8等,构成 一个字符。通常采用ASCII 码。从最低位开始传送,靠时钟定位。 奇偶校验位:资料位加上这一位后,使得“ 1的位数应为偶数(偶校验)或奇数 (奇校验),以此来校验资料传送的正确性。 停止位:它是一个字符数据的结束标志。可以是 1位、1.5位、2位的高电 平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能 在通信中两台设备间出现了小小的不同步。 因此停止位不仅仅是表示传输的结束, 并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步 的容忍程度越大,但是数据传输率同时也越慢。 空闲位:处于逻辑“ 1状态,表示当前线路上没有资料传送。 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol )。 一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为 120 字符/秒,传输使用256阶符号,每个符号代表8bit ,则波特率就是120baud,比 特率是120*8=960bit/s 。这两者的概念很容易搞错。 三、 实现程序 library ieee; use ieee.std 」o gic_1164.all; end uart; architecture behav of uart is en tity uart is port(clk : in std_logic; rst_n: in std 」o gic --系统时钟 --复位信号 rs232_rx: in std 」o gic rs232_tx: out std 」o gic --RS232接收数据信号; --RS232发送数据信号;); use ieee.std_logic_ un sig ned.all;

UART串口通信实验报告

实验四UART串口通信 学院:研究生院学号:1400030034姓名:张秋明 一、实验目的及要求 设计一个UART串口通信协议,实现“串<-->并”转换功能的电路,也就是“通用异步收发器”。 二、实验原理 UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。 UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。 其中各位的意义如下: 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。 资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。 三、实现程序 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity uart is port(clk : in std_logic; --系统时钟 rst_n: in std_logic; --复位信号 rs232_rx: in std_logic; --RS232接收数据信号; rs232_tx: out std_logic --RS232发送数据信号;); end uart; architecture behav of uart is

UART原理及接受模块设计

2 UART 原理 2.1 UART 的通信原理 UART 即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。数据位后面是奇偶校验位,最后是停止位,停止位是用高电平来标记一个字符的结束,并为下一个字符的传输做准备。停止位后面是不同长度的空闲位。停止位和空闲位都规定为高电平,这样可以保证起始位有一个下降沿。UART 的帧格式如图2.1所示。 图2.1 UART 的帧格式 Figure 2.1 The frame format of UART UART 的帧格式包括线路空闲状态(idle ,高电平)、起始位(start bit ,低电平)、5~8位数据位(data bits)、校验位(parity bit ,可选)和停止位(stop bit ,位数可为1、1.5、2位)。 在串口的异步通信中,数据以字节为单位的字节帧进行传送。发送端和接收端必须按照相同的字节帧格式和波特率进行通信。其中字节帧格式规定了起始位、数据位、寄偶效验位、停止位。起始位是字节帧的开始。使数据线处于逻辑0状态 ,用于向接收端表明开始发送数据帧,起到使发送和接收设备实现同步。停止位是字节帧的终止,使数据线处于逻辑1状态。用于向接收端表明数据帧发送完毕。波特率采用标准速度9600bit/s 。

单片机串口通讯实验报告

实验十单片机串行口与PC机通讯实验报告 ㈠实验目的 1.掌握串行口工作方式的程序设计,掌握单片机通讯的编制; 2.了解实现串行通讯的硬环境,数据格式的协议,数据交换的协议; 3.了解PC机通讯的基本要求。 ㈡实验器材 1.G6W仿真器一台 2.MCS—51实验板一台 3.PC机一台 ㈢实验内容及要求 利用8051单片机串行口,实现与PC机通讯。 本实验实现以下功能,将从实验板键盘上键入的字符或数字显示到PC 机显示器上,再将PC机所接收的字符发送回单片机,并在实验板的LED上显示出来。 ㈣实验步骤 1.编写单片机发送和接收程序,并进行汇编调试。 2.运行PC机通讯软件“commtest.exe”,将单片机和PC机的波特率均设定 为1200。 3.运行单片机发送程序,按下不同按键(每个按键都定义成不同的字符), 检查PC机所接收的字符是否与发送的字符相同。 4.将PC机所接收的字符发送给单片机,与此同时运行单片机接受程序,检 查实验板LED数码管所显示的字符是否与PC机发送的字符相同。

㈤ 实验框图

源程序代码: ORG 0000H AJMP START ORG 0023H AJMP SERVE ORG 0050H START: MOV 41H,#0H ;对几个存放地址进行初始化 MOV 42H,#0H MOV 43H,#0H MOV 44H,#0H MOV SCON,#00H ;初始化串行口控制寄存器,设置其为方式0 LCALL DISPLAY ;初始化显示 MOV TMOD,#20H ;设置为定时器0,模式选用2 MOV TL1, #0E6H ;设置1200的波特率 MOV TH1, #0E6H SETB TR1 ;开定时器 MOV SCON,#50H ;选用方式1,允许接收控制 SETB ES SETB EA ;开中断 LOOP: ACALL SOUT ;键盘扫描并发送,等待中断 SJMP LOOP SERVE JNB RI,SEND ;判断是发送中断还是接收中断,若为发送中 断则调用 ACALL S IN ;发送子程序,否则调用接收子程序 RETI SEND: CLR TI ;发送子程序 RETI SIN: CLR RI ;接受子程序 MOV SCON, #00H MOV A, SBUF ;接收数据 LCALL XS ;调用显示子程序 RETI 子程序: SOUT: CLR TI ;清发送中断标志位 LCALL KEY ;调用判断按键是否按下子程序 MOV A,R0 ;将按键对应的数字存入A MOV SBUF,A ;输出按键数字给锁存 RET KEY: MOV P1,#0FFH ;将P1设置为输入口 MOV A, P1 CPL A ;将A内值取反

FPGA的UART完整设计

第三章UART设计 3、1 UART得帧格式 在UART 中,数据位就是以字符为传送单位,数据得前、后要有起始位、停止位,另外可以在停止位得前面加上一个比特(bit)得校验位。其帧格式如图所示。 文章通过分析UART得功能,利用有限状态机来描述UART核心控制逻辑得方法,将其核心功能集成,从而使整个设计更加稳定、可靠。基本得UART通信只需要两条信号线就可以完成数据得相互通信。UART得功能模块如图3_2所示。

3、2 UART模块 在大规模电路得设计中,广泛采用层次化,结构化得设计方法。它将一个完整得硬件设计任务从系统级开始,划分为若干个可操作得模块,编制出相应得模型并进行仿真验证,最后在系统级上进行组合。这样在提高设计效率得同时又提高了设计质量,就是目前复杂数字系统实现得主要手段,也就是本文设计思想得基础。其系统模块可划分为4个部分,如波特发生器,控制器,接收器,发送器,如图3-3所示: 3 Data_in:并行输入data_out:并行输出 Cs:通知cpu接收数据位ks:通知cpu发送准备位 Reset:重启输入state:uart状态输入 Clk:48M时钟输入

3、2、2UART主体程序 `timescale 1ns/1ns module gs_opt( input wire read, input wire clk, input wire reset, input wire state, input wire [7:0] dat_in, output wire send, output wire cs, output wire ks, output wire [7:0] dat_out ); wire send_enable; wire read_enable; wire clk_enable3; wire clk_enable4; wire clear3 ; wire clear4 ; wire clk_enable; wire [7:0] counters; wire clear ; wire t1; /* read,send,cs,ks,reset,state,clk,dat_in,dat_out); //module uart(read,send,cs,ks,reset,state,clk,dat_in,dat_out); input read,clk,reset,state; //read为串行输入,clk为时钟输入50MHZ,reset为重启键input[7:0] dat_in;//并行数据输入 output send,cs,ks; //send为串行输出,cs为通知cpu接收数据位,ks为发送准备位output[7:0] dat_out;//并行数据输出 wire clear,clk_enable,read_enable,clear3,send_enable,clear4,t1; wire[7:0] counters,dat_in;*/

dsp实验-UART串口通信实验

实验八、UART串口通信实验 一、实验目的 1. 了解RS232通信接口的基本原理; 2. 熟悉通信接口芯片(TL16C550C)在DSP I/O空间寄存器的地址映射 及工作原理; 3.了解异步通信中串口模式选择、设置数据传输格式、设置波特率、建立连接、传输数据和断开连接等功能。 二、实验设备 1. 集成开发环境CCS 2. 实验开发板TMS320VC5402DSK、RS232接口电缆线及附件 3.程序“串口调试程序v2.2.exe” 三、实验内容及步骤 实验操作流程参照前面实验。 1 在汇编环境调试Uart:(实现字符或文件的发送和回发功能) a. 实验代码main.s54、uartasm.cmd和uart_init.s54、dsp_init.s54 以及uartasm.h54,c5402_dsk.gel(说明同前)。 b. 串口调试程序“串口调试程序v2.2.exe” , 汇编调试中Build option设置情况与CODEC实验中的汇编调试设置及出错情况相同。 c. 程序文件介绍: 1)“uart.h54”定义了一些寄存器的地址以及函数类型。 2)“dsp_init.s54”与dsp工作有关的寄存器ST1、PMST、IMR、IFR和SWWSR,并且清除INTM位以及设定时钟模式。 3)“uart_init.s54”先检测UART模块是否工作正常,然后设定UART模块的寄存器,如CNTL1、CNTL2、LCR、MSB&LSB(设定波特率)、FCR、IER 等。 4)“main.s54”主程序查看标志位,检测是否UART存在有效接收数据。若有,则执行一定的处理,包括亮LED以及将接收的数据从UART回发。 d. 执行程序时,只要发送数据时,可在串口调试程序的接收窗口立即看到回发的数据。 e. 程序中UART工作参数设置如下: 1)波特率9600(或更低)、无数据校验、字符长度8比特、停止位1、

最新串行通信实验报告整理

串行通信实验报告 班级姓名学号日期 一、实验目的: 1、掌握单片机串行口工作方式的程序设计,及简易三线式通讯的方法。 2、了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。 3、学习串口通讯的程序编写方法。 二、实验要求 1.单机自发自收实验:实现自发自收。编写相应程序,通过发光二极管观察 收发状态。 2.利用单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,另一侧为接收方。 三、实验说明 通讯双方的RXD、TXD信号本应经过电平转换后再行交叉连接,本实验中为 减少连线可将电平转换电路略去,而将双方的RXD、TXD直接交叉连接。也可以将本机的TXD接到RXD上。 连线方法:在第一个实验中将一台实验箱的RXD和TXD相连,用P1.0连接发光二极管。波特率定为600,SMOD=0。 在第二个实验中,将两台实验箱的RXD和TXD交叉相连。编写收发程序,一台实验箱作为发送方,另一台作为接收方,编写程序,从内部数据存储器 20H~3FH单元中共32个数据,采用方式1串行发送出去,波特率设为600。通过运行程序观察存储单元内数值的变化。 四、程序 甲方发送程序如下: ORG 0000H LJMP MAIN ORG 0023H LJMP COM_INT ORG 1000H MAIN: MOV SP,#53H MOV 78H,#20H

MOV 77H,00H MOV 76H,20H MOV 75H,40H ACALL TRANS HERE: SJMP HERE TRANS: MOV TMOD,#20H MOV TH1,#0F3H MOV TL1,#0F3H MOV PCON,#80H SETB TR1 MOV SCON,#40H MOV IE,#00H CLR F0 MOV SBUF,78H WAIT1: JNB TI,WAIT1 CLR TI MOV SBUF,77H WAIT2: JNB TI,WAIT2 CLR TI MOV SBUF,76H WAIT3: JNB TI,WAIT3 CLR TI

(3)UART 发送与接收

实验报告3 1.实验名称:UART 发送与接收 2.实验原理:以UART方式设置串口,当有数据发送时触发中断,进入中断程序。 3.实验结果: 实现CC2530通过串口向PC机串口发送字符串“What is your name?”,电脑向CC2530发送名字,名字以#号结束,CC2530向串口发送字符串”HELLO”+名字。 4.实验改进需求: 输出0V和1V 5.代码: 原始代码: #include #include #define led1 P1_0 #define led2 P1_1 #define uint unsigned int #define uchar unsigned char void initUARTO(void); void InitialAD(void); void UartTX_Send_String(uchar *Data,int len); uchar str1[20]="What is your name?"; uchar str2[7]="HELLO"; uchar Recdata[20]; uchar RXTXflag=1; uchar temp; uint datanumber=0; uint stringlen;

//初始化串口0函数 void initUARTO(void) { CLKCONCMD &=~0x40; while(CLKCONSTA & 0x40); CLKCONCMD &=~0x47; PERCFG=0x00; P0SEL=0x3c; P2DIR&=~0xc0; U0CSR|=0x80; U0GCR|=9; U0BAUD|=59; UTX0IF=1; U0CSR|=0x40; IEN0|=0x84; } //串口发送字符串函数 void UartTX_Send_String(uchar *Data,int len) { uint j; for(j=0;j

UART串行口简介

UART异步串行口 UART异步串行口简介 数据通信的基本方式可分为并行通信与串行通信两种: 并行通信:是指利用多条数据传输线将一个资料的各位同时传送。它的特点是传输速度快,适用于短距离通信,但要求通讯速率较高的应用场合。 串行通信:是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。 UART 异步串行口的传输格式 异步通信以一个字符为传输单位,通信中两个字符间的时间间隔是不固定的,然 而在同一个字符中的两个相邻位代码间的时间间隔是固定的。 通信协议(通信规程):是指通信双方约定的一些规则。在使用异步串口传送一个 字符的信息时,对资料格式有如下约定:规定有空闲位、起始位、资料位、奇偶校验位、停止位。通讯时序图如下: 开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为 起始位,然后出现在通信线上的是字符的二进制编码数据。 每个字符的数据位长可以约定为5 位、6 位、7 位或8 位,一般采用ASCII 编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇 数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。 最后是表示停止位的“1”信号,这个停止位可以约定持续1 位、1.5 位或2 位 的时间宽度。 至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起始位。 每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特 率为110,150,300,600,1200,2400,4800,9600 ,19200,38400,115200等。 S3C2410的异步串行口 1

SPI、I2C、UART三种串行总线的原理、区别及应用

简单描述: SPI 和I2C这两种通信方式都是短距离的,芯片和芯片之间或者其他元器件如传感器和芯片之间的通信。SPI和IIC是板上通信,IIC有时也会做板间通信,不过距离甚短,不过超过一米,例如一些触摸屏,手机液晶屏那些很薄膜排线很多用IIC,I2C能用于替代标准的并行总线,能连接的各种集成电路和功能模块。I2C 是多主控总线,所以任何一个设备都能像主控器一样工作,并控制总线。总线上每一个设备都有一个独一无二的地址,根据设备它们自己的能力,它们可以作为发射器或接收器工作。多路微控制器能在同一个I2C总线上共存这两种线属于低速传输; 而UART是应用于两个设备之间的通信,如用单片机做好的设备和计算机的通信。这样的通信可以做长距离的。UART和,UART就是我们指的串口,速度比上面三者快,最高达100K左右,用与计算机与设备或者计算机和计算之间通信,但有效范围不会很长,约10米左右,UART优点是支持面广,程序设计结构很简单,随着USB的发展,UART也逐渐走向下坡; SmBus有点类似于USB设备跟计算机那样的短距离通信。 简单的狭义的说SPI和I2C是做在电路板上的。而UART和SMBUS是在机器外面连接两个机器的。 详细描述: 1、UART(TX,RX)就是两线,一根发送一根接收,可以全双工通信,线数也比较少。数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快。在多机通信上面用的最多。 2、SPI(CLK,I/O,O,CS)接口和上面UART相比,多了一条同步时钟线,上面UART 的缺点也就是它的优点了,对通信双方的时序要求不严格不同设备之间可以很容易结合,而且通信速度非常快。一般用在产品内部元件之间的高速数据通信上面,如大容量存储器等。 3、I2C(SCL,SDA)接口也是两线接口,它是两根线之间通过复杂的逻辑关系传输数据的,通信速度不高,程序写起来也比较复杂。一般单片机系统里主要用来和24C02等小容易存储器连接。 SPI:高速同步串行口。3~4线接口,收发独立、可同步进行 UART:通用异步串行口。按照标准波特率完成双向通讯,速度慢 SPI:一种串行传输方式,三线制,网上可找到其通信协议和用法的 3根线实现数据双向传输 串行外围接口 Serial peripheral interface UART:通用异步收发器 UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了

UART收发器设计实例

11.5U A R T收发器设计实例 U A R T(U n i v e r s a l A s y n c h r o n o u s R e c e i v e r T r a n s m i t t e r,通用异步收发器)是广泛使用的异步串行数据通信协议。下面首先介绍U A R T硬件接口及电平转换电路,分析U A R T的传输时序并利用V e r i l o g H D L语言进行建模与仿真,最后通过开发板与P C相连进行R S-232通信来测试U A R T收发器的正确性。 1.5.111.5.1U A R T界面介绍 本节所介绍的U A R T即美国电子工业协会定义的R S-232C,简称R S-232。R S-232的接口一般有9针的D B9和25针的D B25,这里以9针为例,它的各个引脚的定义如表11-8所示。 表11-8D B9的引脚定义 引脚功能缩写 1资料载波检测D C D 2接收数据R X D 3发送数据T X D 4数据终端准备就绪D T R 5信号地G N D 6数据准备就绪D S R 7发送请求R T S 8清除发送C T S 9振铃提示R I 由于R S-232的电气特性与F P G A引脚不相同,因此它们之间不能直接相连,对于R S-232的数据线,当为逻辑“1”时,对应电平是-15V~-3V;当为逻辑“0”时,对应电平是15V~3V。因此,与F P G A相连之前必须进行电平转换,转换原理图如图11-39所示。

图11-39R S-232电平转换原理图 1.5.211.5.2U A R T传输时序 U A R T传输时序如图11-40所示。 图11-40U A R T传输时序 发送数据过程:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为高电位),一帧资料发送结束。 接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存。 由于U A R T是异步传输,没有传输同步时钟。为了能保证数据传输的正确性, U A R T采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中

单片机实验报告串行口

单片机实验报告 实验名称:串行通信实验 姓名:魏冶 学号:090402105 班级:光电一班 实验时间:2011-11-29 南京理工大学紫金学院电光系

一、实验目的 1、理解单片机串行口的工作原理; 2、学习使用单片机的TXD、RXD口; 3、了解MAX232芯片的使用。 二、实验原理 MCS-51单片机内部集成有一个UART,用于全双工方式的串行通信,可以发送、接收数据。它有两个相互独立的接收、发送缓冲器,这两个缓冲器同名(SBUF),共用一个地址号(99H),发送缓冲器只能写入,不能读出,接收缓冲器只能读出,不能写入。 要发送的字节数据直接写入发送缓冲器,SBUF=a;当UART接收到数据后,CPU从接收缓冲器中读取数据,a=SBUF;串行接口内部有两个移位寄存器,一个用于串行发送,一个用于串行接收。定时器T1作为波特率发生器,波特率发生器的溢出信号做接收或发送移位寄存器的移位时钟。TI和RI分别发送完数据和接收完数据的中断标志,用来向CPU发中断请求。 三、实验内容 1、学会DPFlash软件的操作与使用,以及内部内嵌的一个串口调试软件的使用。 2、用串口连接PC机和DP-51PROC单片机综合仿真实验仪。 3、编写一个程序,利用单片机的串行口发送0x55,波特率为9600。 程序设计流程图

4、程序下载运行后,可在PC机上的串口调试软件上(内嵌在DPFlash软件的串口调 试器,设置通信口为COM1口,波特率为9600,数据位8,停止位1)看到接收到“UUUUUU……”,出现这样的结果就基本达到要求。 (1)代码: #include void main() { long int i; SCON=0x40; PCON=0; TMOD=0x20; TH1=0xfd; TL1=0xfd; TI=1; TR1=1; star:for(i=0;i<5000;i++); SBUF=0x55; goto star; } (2)电路图; 5、在单片机接收到0x55时返回一个0x41,在PC机一端,以接收到0x41完成,波特率2400。

实验四 UART串口通信实验报告

实验四UART串口通信 一、实验目的及要求 设计一个UART串口通信协议,实现“串<-->并”转换功能的电路,也就是“通用异步收发器”。 二、实验原理 UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。 UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。 其中各位的意义如下: 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。 资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。 停止位:它是一个字符数据的结束标志。可以是1位、1.5

位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。 三、实现程序 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity uart is port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号 rs232_rx: in std_logic; --RS232接收

UART原理及接收模块设计原理

UART 原理 2.1 UART 的通信原理 UART 即通用异步收发器,是一种串行通信方式。数据在传输过程中是通过一位一位地进行传输来实现通信的,串行通信方式具有传输线少,成本底等优点,缺点是速度慢。串行通信分为两种类型:同步通信方式和异步通信方式。但一般多用异步通信方式,主要因为接受和发送的时钟是可以独立的这样有利于增加发送与接收的灵活性。异步通信是一个字符接着一个字符传输,一个字符的信息由起始位、数据位、奇偶校验位和停止位组成。每一个字符的传输靠起始位来同步,字符的前面一位是起始位,用下降沿通知收方开始传输,紧接着起始位之后的是数据位,传输时低位在前高位在后,字符本身由5~8位数据位组成。数据位后面是奇偶校验位,最后是停止位,停止位是用高电平来标记一个字符的结束,并为下一个字符的传输做准备。停止位后面是不同长度的空闲位。停止位和空闲位都规定为高电平,这样可以保证起始位有一个下降沿。UART 的帧格式如图2.1所示。 图2.1 UART 的帧格式 Figure 2.1 The frame format of UART UART 的帧格式包括线路空闲状态(idle ,高电平)、起始位(start bit ,低电平)、5~8位数据位(data bits)、校验位(parity bit ,可选)和停止位(stop bit ,位数可为1、1.5、2位)。 在串口的异步通信中,数据以字节为单位的字节帧进行传送。发送端和接收端必须按照相同的字节帧格式和波特率进行通信。其中字节帧格式规定了起始位、数据位、寄偶效验位、停止位。起始位是字节帧的开始。使数据线处于逻辑0状态 ,用于向接收端表明开始发送数据帧,起到使发送和接收设备实现同步。停止位是字节帧的终止,使数据线处于逻辑1状态。用于向接收端表明数据帧发送完毕。波特率采用标准速度9600bit/s 。

相关文档