精华内容
下载资源
问答
  • RS232
    千次阅读
    2019-09-27 12:17:20

    RS232是一种常见的串行通讯接口,一种常见的RS232通信接口是9针的接口(DB-9),如下图所示:1479998-20190626154505188-1998854214.jpg

    在RS232的针脚上,一般使用-3V~-15V(有些文档说明中为-5V~-15V)之间的任意电平表示逻辑1,而使用+3V~+15V(有些文档说明中为5V~15V)之间的任意电平表示逻辑0。图中对管脚的标号做了标注,其中pin 2是RXD,pin 3是TxD,pin 5是GND。只需要这三个端口就能完整的实现RS232的数据传输功能。稍后我们将在Vivado环境进行一个简单实现。

    RS232的其余特性包括:

    • 允许采用双向全双工的通信方式(PC机可以在发射数据的同时通过该接口接收数据);
    • 可以最高以10KByte/s的速度进行数据通信。

    在开始之前,首先定义清楚RS232信号线上的时序。在RS232关键的三根信号线当中并没有时钟线,相邻两个字符(一个字,一般假定为1个byte,8bits)之间需要开始和终值位进行标定,所以相邻字符的间隔完全可以是任意的,因而也可以认为这是一种异步通信方式。一般认为单个字符在进行传输的时候首先传输低位,我们进行以下约定。

    • 发射模块idle状态的时候TXD ='1';
    • 发射模块发送开始位start bit的时候TXD = '0';
    • 发射模块发送终止位stop bit的时候TXD = '1';

    如果发送0x55的话发送数据线上的时序信号如下(注意发送'1'的时候信号线为低电平):

    1479998-20190626154512855-90581348.gif

    我们实现的传送速度为115200bauds,bauds(波特率)本身表示传送符号的速率,但是这里是异步通信方式,我们认为1个bit就是一个符号,包含所有数据位和起始终止符号位。传输速率为115200bauds的情况下,每个bits的持续时间为(1/115200=)8.7us。

    1.波特率产生

    在数字系统当中,时钟与数据速率紧密相关,时钟驱动着时序电路的数据流动,数据传输的速度与数字电路的时钟是紧密相关。在不考虑数据有效位的情况下,时钟速率与数据传输速率(bit/s)应该是相等的。前文提到,RS232的9根线当中并没有定义时钟线,那么115200 bauds的数据应该如何驱动呢。事实上,驱动时钟在数据发送端和接收端。假设接口全速运行,数据传送都是连续的,那么需要的最小时钟就是115.2kHz。如果有25MHz的启动时钟(\(clk\_freq\))的话如何产生115.2kHz的驱动时钟(\(BaudTick\))呢。

    在200MHz的时钟驱动下每间隔217.014(25MHz/115.2kHz)个时钟周期就输出一个高电平(可以说是间隔217个数或218个数输出一个高电平,但是大多是间隔217个数),那么就能得到\(BaudTick\)。如果采用计数规则的话,就必须用到取模运算。为了充分利用二进制运算本身的特性,设计如下代码:

    parameter ClkFrequency = 25000000; // 25MHz
    parameter Baud = 115200;//115200 bauds,32bits数据精度
    parameter BaudGeneratorAccWidth = 16;
    parameter BaudGeneratorInc = ((Baud<<(BaudGeneratorAccWidth-4))+(ClkFrequency>>5))/(ClkFrequency>>4);//由于该parameter运算数字位整数,所以其输出一定为整数
    reg [BaudGeneratorAccWidth:0] BaudGeneratorAcc;
    always @(posedge clk)
        BaudGeneratorAcc <= BaudGeneratorAcc[BaudGeneratorAccWidth-1:0] + BaudGeneratorInc;//注意累加的时候不取最高位。
    
    wire BaudTick = BaudGeneratorAcc[BaudGeneratorAccWidth];//最高位输出表示到达累加数字。

    2.发射端

    RS232发射端框图可以表达为

    1479998-20190626154528273-1560619666.gif

    所以我们要完成的工作实际上就是并串的转换。另外,

    • 该模块要能够自动添加串行的起始终止位;
    • 该模块要能够响应TxD_start以开始数据传输(数据到来应该晚于Tx_start一个baudtick周期);
    • 在传输数据的时候,busy输出逻辑'1';

    由于同时要处理数据位和数据起始和终止位,所以可以使用状态机构造该结构。

    reg [3:0] state;
    
    // the state machine starts when "TxD_start" is asserted, but advances when "BaudTick" is asserted (115200 times a second)
    always @(posedge clk)
    case(state)
        4'b0000: if(TxD_start) state <= 4'b0100;//idle
      4'b0100: if(BaudTick) state <= 4'b1000; // start
      4'b1000: if(BaudTick) state <= 4'b1001; // bit 0
      4'b1001: if(BaudTick) state <= 4'b1010; // bit 1
      4'b1010: if(BaudTick) state <= 4'b1011; // bit 2
      4'b1011: if(BaudTick) state <= 4'b1100; // bit 3
      4'b1100: if(BaudTick) state <= 4'b1101; // bit 4
      4'b1101: if(BaudTick) state <= 4'b1110; // bit 5
      4'b1110: if(BaudTick) state <= 4'b1111; // bit 6
      4'b1111: if(BaudTick) state <= 4'b0001; // bit 7
      4'b0001: if(BaudTick) state <= 4'b0010; // stop1
      4'b0010: if(BaudTick) state <= 4'b0000; // stop2
        default: if(BaudTick) state <= 4'b0000;//idle
    endcase

    数据输出端口表示为:

    reg muxbit;
    
    always @(state[2:0])
    case(state[2:0])
      0: muxbit <= TxD_data[0];
      1: muxbit <= TxD_data[1];
      2: muxbit <= TxD_data[2];
      3: muxbit <= TxD_data[3];
      4: muxbit <= TxD_data[4];
      5: muxbit <= TxD_data[5];
      6: muxbit <= TxD_data[6];
      7: muxbit <= TxD_data[7];
    endcase
    
    // combine start, data, and stop bits together
    //原始代码为(原始代码start状态有问题)
    //assign TxD = (state<4) | (state[3] & muxbit);
    assign TxD = (state<=4) | (state[3] & muxbit);

    3.接收端

    数据接收端的框图如下所示:
    1479998-20190626154537450-1933294251.gif

    该模块要完成的功能是:

    • 串并转换,并且能够根据同步起始和终止位进行数据同步;
    • 在串并转换完成之后data_ready输出一个时钟周期(baudtick)逻辑'1',表明数据已经准备好;

    由于在RS232的标准当中没有时钟线,所以采样的相位基本不可能保持一致。想象,如果采样的边沿时钟在数据跳变的边沿,这就总是会导致采样数据与发送数据不一致。因而,在接收系统当中一般都会采用过采样的机制来保证数据的可靠性。这里我们采用8倍过采样的时钟对数据进行数据采样。

    另一点,数据在传输的时候可能会产生一些尖峰,直接进行采样是有一些不妥的。为了保持数据结果的可靠性,在8个过采样周期,连续的4个数据都一致,我们才输出这比较可靠的数据输出。为了不产生数据延时,我们使用两个寄存器来接收数据

    reg [1:0] RxD_sync;
    always @(posedge clk) if(Baud8Tick) RxD_sync <= {RxD_sync[0], RxD};

    再使用一个2位的计数器实现计数功能呢:

    reg [1:0] RxD_cnt;
    reg RxD_bit;
    
    always @(posedge clk)
    if(Baud8Tick)
    begin
      if(RxD_sync[1] && RxD_cnt!=2'b11) RxD_cnt <= RxD_cnt + 1;
      else 
      if(~RxD_sync[1] && RxD_cnt!=2'b00) RxD_cnt <= RxD_cnt - 1;
    
      if(RxD_cnt==2'b00) RxD_bit <= 0;
      else
      if(RxD_cnt==2'b11) RxD_bit <= 1;
    end

    使用状态机有一个优势就是自动串行化

    reg [3:0] state;
    
    always @(posedge clk)
    if(Baud8Tick)
    case(state)
      4'b0000: if(~RxD_bit) state <= 4'b1000; // start bit found?
      4'b1000: if(next_bit) state <= 4'b1001; // bit 0
      4'b1001: if(next_bit) state <= 4'b1010; // bit 1
      4'b1010: if(next_bit) state <= 4'b1011; // bit 2
      4'b1011: if(next_bit) state <= 4'b1100; // bit 3
      4'b1100: if(next_bit) state <= 4'b1101; // bit 4
      4'b1101: if(next_bit) state <= 4'b1110; // bit 5
      4'b1110: if(next_bit) state <= 4'b1111; // bit 6
      4'b1111: if(next_bit) state <= 4'b0001; // bit 7
      4'b0001: if(next_bit) state <= 4'b0000; // stop bit
      default: state <= 4'b0000;
    endcase

    next_bit实际上标定了一种数据速率的关系,如下所示:

    reg [2:0] bit_spacing;
    
    always @(posedge clk)
    if(state==0)
      bit_spacing <= 0;
    else
    if(Baud8Tick)
      bit_spacing <= bit_spacing + 1;
    
    wire next_bit = (bit_spacing==7);

    最后使用移位寄存机对数据进行暂存,然后定期置位data_ready信号即可

    reg [7:0] RxD_data;
    always @(posedge clk) if(Baud8Tick && next_bit && state[3]) RxD_data <= {RxD_bit, RxD_data[7:1]};

    最后对输入输出进行封装

    module serialGPIO(
        input clk,
        input RxD,
        input TxD_data_ready,
        output TxD,
        output RxD_data_ready,
        output reg [7:0] GPout,  // general purpose outputs
        input [7:0] GPin  // general purpose inputs
    );
    
    //wire RxD_data_ready;
    wire [7:0] RxD_data;
    async_receiver RX(.clk(clk), .RxD(RxD), .RxD_data_ready(RxD_data_ready), .RxD_data(RxD_data));
    always @(posedge clk) if(RxD_data_ready) GPout <= RxD_data;
    
        async_transmitter TX(.clk(clk), .TxD(TxD), .TxD_start(TxD_data_ready), .TxD_data(GPin));
    endmodule
    posted on 2019-06-26 15:46  luckfyzh 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/lafiizh/p/11090290.html

    更多相关内容
  • 利用matlabGUI设计制作的GUI,可实现FLUKE万用表与单片机MCU之间的同步数据采样,并利用matlab自带工具cftool进行拟合,经测试,具有一定的数据排错能力,存在一些可以容忍的bug,同步采样速率与MCU性能有关。...
  • DSP之RS232通信笔记

    2022-04-10 10:32:41
    单工,半双工,全双工; 同步通信,异步通信; 串行通信,并行通信;

    1. 通信基本概念

    按照数据传送方式:分为串行通信和并行通信

    按照通信的数据同步方式:分为同步通信和异步通信;

    按照数据传输方向:分为单工,半双工,全双工通信;

    (1) 串行通信与并行通信

    (a) 串行通信:使用一条数据线,将数据一位一位的依次传输,没一位数据占据一个固定的时间长度;

    优点 :传输线少,长距离传送成本低;

    缺点:数据传送控制协议比并行通信复杂;

    (b) 并行通信:将数据字节的各位用多条数据线同时传送,通常是8bit,16bit,32bit等数据一起传输;

    优点:控制简单,传输快;

    缺点:传输线多,长距离传输成本高且接收方同时接收存在困难;抗干扰能力差; 

     (2) 异步通信与同步通信

    (a) 异步通信:通信双方使用各自的时钟控制数据的发送和接收过程;

    为了使双发收发协调,要求双方的时钟尽可能一致;

    异步通信是以字符(帧)为单位进行传输,字符与字符间的间隙是任意的;但每个字符中的各位是以固定的时间传送的;

    特点:不要求收发双发时钟严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起始位,各帧之间还有间隔,所以传输效率不高; 

    (b) 同步通信:发送方直接控制时钟,达到双方时钟完全同步;

    字符间间隔一致,位间间隔一致;

    (3) 单工,半双工,全双工通信

    (a)单工通信:数据传输仅能沿一个方向,不能实现反向传输;

    (b)半双工通信:数据传输可以沿两个方向,但需要分时进行;

    (c)全双工通信: 数据可以同时进行双向传输;

    rs232既可以是半双工也可是全双;常用异步全双工通信; 

    rs485既可以是半双工也可是全双工,常用半双工通信; 点击

    2. SCI介绍

    SCI:串口通信(Serial Communication Interface)

    (a) 单片机使用TTL电平,在与pc通信时,需要使用芯片转换为rs232使用的rs232电平;

    (b) 常用的rs232有DB9和DB25;都仅仅需要3线即可实现串口通信,即TXD,RXD,SGND;

    (c) r232通常遵循96-N-8-1格式;

    其中:

    96表示通信波特率为9600;常用还有115200,4800等;

    N表示无校验位;由于串口通信易受外部干扰导致数据出现偏差;故传输过程中可加上校验位来解决这问题;校验方法有:基校验,偶校验,0校验,1校验;

    8表示数据的位数为8位,其数据格式还可以是5,6,7位长度;

    1表示1位停止位;还可以是0.5,1,1.5或2个逻辑1的数据位表示;

    SCI与CPU连接图

    注: (a) SCITXD是SCI数据发送引脚,SCIRXD是SCI数据接收引脚;默认管脚作用为gpio,使用时需要管脚复用;

          (b) 可编程通信速率;

     (1) 可以使用SCI通信控制器(SCICCR)配置SCI通信采用的数据格式;

      (2) 接收器使用帧同步,外部发送和接收不需要使用串行同步时钟,时钟由器件本身提供;

    3. 软件部分

    /*
        SCI波特率计算公式:
        BRR = LSPCLK/(SCI异步波特率*8)-1;
    */
    void UARTa_Init(Uint32 baud)
    {
    	unsigned char scihbaud=0;
    	unsigned char scilbaud=0;
    	Uint16 scibaud=0;
    
        //SCI外设工作频率(37.5MHZ);
    	scibaud=37500000/(8*baud)-1;
    	scihbaud=scibaud>>8;
    	scilbaud=scibaud&0xff;
    
    
    	EALLOW;
    	SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A
    	EDIS;
    
    	InitSciaGpio();
    
    	//Initalize the SCI FIFO
    	//bit15:SCI FIFO能继续发送或接收;
    	//bit14:SCI FIFO功能使能
    	//bit13:重新使能发送FIFO
    	//bit4:清除TXFFINT标志位;
    	SciaRegs.SCIFFTX.all=0xE040;//SCI发送FIFO寄存器
    
    	//bit13:重新使能接收FIFO
    	//bit6:清除RXFFINT标志位
    	//bit0~3:接收FIFO深度设置;
    	SciaRegs.SCIFFRX.all=0x204f;//SCI接收FIFO寄存器
    
    	SciaRegs.SCIFFCT.all=0x0;
    
    	// Note: Clocks were turned on to the SCIA peripheral
    	// in the InitSysCtrl() function
    	//bit7: 两位停止位
    	SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback
    								   // No parity,8 char bits,
    								   // async mode, idle-line protocol
    
    	//SCI发送和接收使能
    	SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
    								   // Disable RX ERR, SLEEP, TXWAKE
    	//SCITXBUF寄存器中断使能;
    	//接收缓冲或发送移位中断使能;
    	SciaRegs.SCICTL2.all =0x0003;
    
    	//使能TXRDY中断; SCITXBUF寄存器中断使能;
    	SciaRegs.SCICTL2.bit.TXINTENA =1;
    
    	//接收缓冲/抑制中断使能
    	SciaRegs.SCICTL2.bit.RXBKINTENA =1;
    
    	//波特率设置寄存器高字节
    	SciaRegs.SCIHBAUD    =scihbaud;  // 9600 baud @LSPCLK = 37.5MHz.
    
    	//波特率设置寄存器低字节
    	SciaRegs.SCILBAUD    =scilbaud;
    
    	//自测模式使能
    //	SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
    
    
    	SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
    }
    void UARTa_SendByte(int a)
    {
    	while (SciaRegs.SCIFFTX.bit.TXFFST != 0);//一直等待发送完;
    	SciaRegs.SCITXBUF=a;
    }
    
    void UARTa_SendString(char * msg)
    {
    	int i=0;
    
    	while(msg[i] != '\0')
    	{
    		UARTa_SendByte(msg[i]);
    		i++;
    	}
    }

    展开全文
  • 区分SCI、UART与RS232

    2018-01-10 15:20:00
    通常,大部分人把SCI、UART与RS232混为一谈,其实他们有...另外,SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
  • rs232串口通信

    2014-07-20 17:53:23
    rs232串口通信 目 次 1. RS-232-C 详解 ………………………………………………………2 2. 串口通信基本接线方法 ………………………………………………12 3. 串口通讯的概念及接口电路 …………………………...
  • 文章简单介绍了RS232 9针接口管教与25针接口定义
  • RS232串口通信详解

    千次阅读 2021-01-21 17:29:46
    差动工作是同速率条件下传输距离远的根本原因,这正是二者与RS232的根本区别,因为RS232是单端输入输出,双工工作时至少需要数字地线发送线和接受线三条线(异步传输),还可以加其它控制线完成同步等功能。...

    串口是计算机上一种非常通用的设备通信协议。

    ---------------------------------

    串口的引脚定义DB9:

    9芯 信号方向来自 缩写 描述 1 调制解调器 CD 载波检测 2 调制解调器 RXD 接收数据 3 PC TXD 发送数据 4 PC DTR 数据终端准备好 5

    GND 信号地 6 调制解调器 DSR 通讯设备准备好 7 PC RTS 请求发送 8 调制解调器 CTS 允许发送 9 调制解调器 RI 响铃指示器 两个串口连接时,接收数据针脚与发送数据针脚相连,彼此交叉,信号地对应相接即可。

    ---------------------------------

    串口的电气特性:

    1)RS-232串口通信最远距离是50英尺

    2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps

    3)RS-232C上传送的数字量采用负逻辑,且与地对称

    逻辑1:-3 ~-15V

    逻辑0:+3~+15V

    所以与单片机连接时常常需要加入电平转换芯片:

    ---------------------------------

    串口通信参数:

    a)波特率:RS-232-C标准规定的数据传输速率为每秒50、75、 100、150、300、600、1200、2400、4800、9600、19200波特。

    b)数据位:标准的值是5、7和8位,如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位);扩展的ASCII码是0~255(8位)。

    c)停止位:用于表示单个包的最后一位,典型的值为1,1.5和2位。由于数是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。

    d)奇偶校验位:在串口通信中一种简单的检错方式。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。

    ---------------------------------

    串口通信的传输格式:

    串行通信中,线路空闲时,线路的TTL电平总是高,经反向RS232的电平总是低。一个数据的开始RS232线路为高电平,结束时Rs232为低电平。数据总是从低位向高位一位一位的传输。示波器读数时,左边是数据的高位。

    例如,对于16进制数据55aaH,当采用8位数据位、1位停止位传输时,它在信号线上的波形如图1(TTL电平)和图2(RS-232电平)所示。

    55H=01010101B,取反后10101010B,加入一个起始位1,一个停止位0,55H的数据格式为1010101010B;

    aaH=10101010B,取反后01010101B,加入一个起始位1,一个停止位0,55H的数据格式为1101010100B;

    ---------------------------------

    串口通信的接收过程:

    (异步通信:接收器和发送器有各自的时钟;同步通信:发送器和接收器由同一个时钟源控制。RS232是异步通信)

    (1)开始通信时,信号线为空闲(逻辑1),当检测到由1到0的跳变时,开始对“接收时钟”计数。

    (2)当计到8个时钟时,对输入信号进行检测,若仍为低电平,则确认这是“起始位”,而不是干扰信号。

    (3)接收端检测到起始位后,隔16个接收时钟,对输入信号检测一次,把对应的值作为D0位数据。若为逻辑1, 作为数据位1;若为逻辑0,作为数据位0。

    (4)再隔16个接收时钟,对输入信号检测一次,把对应的值作为D1位数据。….,直到全部数据位都输入。

    (5)检测校验位P(如果有的话)。

    (6)接收到规定的数据位个数和校验位后,通信接口电路希望收到停止位S(逻辑1),若此时未收到逻辑1,说明出现了错误,在状态寄存器中置“帧错误”标志。若没有错误,对全部数据位进行奇偶校验,无校验错时,把数据位从移位寄存器中送数据输入寄存器。若校验错,在状态寄存器中置奇偶错标志。

    (7)本幀信息全部接收完,把线路上出现的高电平作为空闲位。

    (8)当信号再次变为低时,开始进入下一幀的检测。

    ---------------------------------

    单片机常用11.0592M的的晶振,这个奇怪数字是有来历的:

    波特率为9600BPS每位位宽t1=1/9600s

    晶振周期t2=1/11.0592/1000000S

    单片机机器周期t3=12*t2

    t1/t3=96

    即对于9600BPS的串口,单片机对其以96倍的速率进行采样

    如果单片机晶振用的不正确,会对串口接受产生误码。

    ---------------------------------

    RS485和RS422

    RS485总线,在要求通信距离为几十米到上千米时,广泛采用RS-485 串行总线标准。RS485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。RS485采用半双工工作方式,任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。RS485用于多点互连时非常方便,可以省掉许多信号线。应用RS485可以联网构成分布式系统,其允许最多并联32台驱动器和32台接收器。

    RS422总线,RS485和RS422电路原理基本相同,都是以差动方式发送和接受,不需要数字地线。差动工作是同速率条件下传输距离远的根本原因,这正是二者与RS232的根本区别,因为RS232是单端输入输出,双工工作时至少需要数字地线发送线和接受线三条线(异步传输),还可以加其它控制线完成同步等功能。RS422通过两对双绞线可以全双工工作收发互不影响,而RS485只能半双工工作,发收不能同时进行,但它只需要一对双绞线。RS422和RS485在19kpbs下能传输1200米。用新型收发器线路上可连接台设备。

    展开全文
  • Rs232cai-7884串口通信编程合集 pdf,串口通信编程大全。内容: 1. RS-232-C 详解 2. 串口通信基本接线方法 3. 串口通讯的概念及接口电路 4. 有关RS232和RS485接口的问答 5. 同步通信方式 6. 通信协议 7. ...
  • 串口RS232

    2021-11-22 10:19:27
    FPGA中rs232的verilog代码编写

    概念

    全双工通信

    缺点:传输距离近和传输速度慢

    优点:都有com口,方便使用

    波特率:每秒钟传输码元的个数 baus Bps 码元:一个二进制位 常用:4800 9600 115200

    比特率:每秒钟传输bit数  比特率=波特率*单个调制状态对应二进制数 bps

    数据格式

    共10bit的数据,其中起始位1bit,8bit的数据位,停止位1bit 

    注意事项 

    数据接受模块需要进行寄存器打拍,因为数据与时钟不同步,会出现亚稳态

    亚稳态:信号在进入寄存器时的建立时间和保持时间不满足条件(信号 是必须稳定的才满足)导致的

    危害:亚稳态会一直向下传播,组合逻辑是无法消除的

    解决:多级寄存器,因为寄存器会减缓亚稳态 一般两级打拍

     Tco:寄存器延迟 Tmet:决断时间

    总体结构图 

    代码verilog 

    module AX301_rs232(
        input clk,
    	 input rst_n,
    	 input rx,
    	 
    	 output tx
    );	 
    wire [7:0] po_data;
    wire po_flag;
    
    rs232_rx
    #(
      .uart_Bps   ('d9600),
      .clk_fre    ('d50_000_000)
    )
    rs232_rx_inst
    (
       .clk   (clk),
    	.rst_n (rst_n),
    	.rx           (rx),
    	
    	.po_data      (po_data),
    	.po_flag      (po_flag)
    );
    
    rs232_tx
    #(
      .uart_Bps   ('d9600),
      .clk_fre    ('d50_000_000)
    )
    rs232_tx_inst
    (
       .clk   (clk),
    	.rst_n (rst_n),
    	.po_data      (po_data),
    	.po_flag      (po_flag ),     
    	
    	.tx      (tx)
    );
    endmodule

    接收模块 

    结构图 

     波形图

    代码 verilog

    module rs232_rx
    #(
       parameter uart_Bps = 'd9600,
    	parameter clk_fre = 'd50_000_000
    )
    (
       input clk,
    	input rst_n,
    	input rx,
    	
    	output reg po_flag,
    	output reg [7:0] po_data
    );
    parameter max_cnt = clk_fre / uart_Bps;
    reg rx_reg1,rx_reg2,rx_reg3;
    reg work_en;
    reg [15:0] bps_cnt;
    reg bit_flag;
    reg [3:0] bit_cnt;
    reg [7:0] rx_data;
    reg rx_flag;
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
          rx_reg1 <= 1'b1;
    	else 
    	   rx_reg1 <= rx;
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
          rx_reg2 <= 1'b1;
    	else 
    	   rx_reg2 <= rx_reg1;
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
          rx_reg3 <= 1'b1;
    	else 
    	   rx_reg3 <= rx_reg2;
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	   work_en <= 1'b0;
       else if(rx_reg2 == 1'b0 && rx_reg3 == 1'b1)
    	   work_en <= 1'b1;
       else if(bit_cnt ==4'd8 && bit_flag ==1'b1)
    	   work_en <=1'b0;
    	else 
    	   work_en <= work_en;
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  bps_cnt <= 16'd0;
    	else if(work_en == 1'b0 || bps_cnt == max_cnt - 1)
    	  bps_cnt <= 16'd0;
    	else 
    	  bps_cnt <= bps_cnt + 16'd1;
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  bit_flag <= 1'b0;
    	else if(bps_cnt == max_cnt/2 - 1)
    	  bit_flag <= 1'b1;
    	else 
    	  bit_flag <= 1'b0;
    end		
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  bit_cnt <= 4'd0;
    	else if(bit_cnt ==4'd8 && bit_flag ==1'b1)
    	  bit_cnt <= 4'd0;
    	else if(bit_flag ==1'b1)
         bit_cnt <= bit_cnt + 4'd1;
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  rx_data <= 8'b0;
    	else if(bit_cnt >= 4'd1 && bit_cnt <=4'd8 && bit_flag == 1'b1)
    	  rx_data <= {rx_reg3,rx_data[7:1]};
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  rx_flag <= 1'b0;
    	else if(bit_cnt ==4'd8 && bit_flag == 1'b1)
    	  rx_flag <= 1'b1;
    	else 
    	  rx_flag <= 1'b0;
    end 
    
    always @(posedge clk or negedge rst_n)
    begin
    	if(!rst_n)
    	  po_data<=8'b0;
    	else if(rx_flag==1'b1)
    	  po_data<=rx_data;
    end
    
    always @(posedge clk or negedge rst_n)
    begin
    	if(!rst_n)
    	  po_flag<=1'b0;
    	else 
    	  po_flag<=rx_flag;
    end
    endmodule

    发送模块 

    结构图

     波形图

    代码 verilog

    module rs232_tx
    #(
       parameter uart_Bps = 'd9600,
    	parameter clk_fre = 'd50_000_000
    )
    (
       input clk,
    	input rst_n,
    	input [7:0] po_data,
    	input po_flag,
    	
    	output reg tx
    );
    
    parameter max_cnt = clk_fre / uart_Bps;
    reg work_en;
    reg [15:0] bps_cnt;
    reg bit_flag;
    reg [3:0] bit_cnt;
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  work_en <= 1'b0;
    	else if(po_flag == 1'b1)
    	  work_en<=1'b1;
    	else if(bit_cnt == 4'd9 &&bit_flag == 1'b1)
    	  work_en <= 1'b0;
    	else 
    	  work_en <= work_en;
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  bps_cnt <= 16'd0;
    	else if(work_en == 1'b0 || bps_cnt == max_cnt - 1)
    	  bps_cnt <= 16'd0;
    	else 
    	  bps_cnt <= bps_cnt + 16'd1;
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  bit_flag <= 1'b0;
    	else if(bps_cnt == 16'd1)
    	  bit_flag <= 1'b1;
    	else 
    	  bit_flag <= 1'b0;
    end	
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  bit_cnt <= 4'd0;
    	else if(bit_cnt ==4'd9 && bit_flag ==1'b1)
    	  bit_cnt <= 4'd0;
    	else if(bit_flag ==1'b1)
         bit_cnt <= bit_cnt + 4'd1;
    end
    
    always@(posedge clk or negedge rst_n)begin
       if(!rst_n)
    	  tx <=1'b1;
    	else if(bit_flag == 1'b1)
    	  case(bit_cnt)
    	     0: tx<=1'b0;
    		  1: tx<=po_data[0];
    		  2: tx<=po_data[1];
    		  3: tx<=po_data[2];
    		  4: tx<=po_data[3];
    		  5: tx<=po_data[4];
    		  6: tx<=po_data[5];
    		  7: tx<=po_data[6];
    		  8: tx<=po_data[7];
    		  9: tx<=1'b1;
    		  default: tx<=1'b1;
        endcase
    end
    endmodule

    展开全文
  • RS232异步通信实例

    千次阅读 2018-06-04 21:33:04
    最近这几天在研究RS232串口通信,看了很多网上的资料,解释RS232引脚或者同步异步的文字描述很多,案例很少,而且感觉很乱,所以就自己弄出来,然后发出来一起学习,这个案例主要是异步通信的设置上,下一篇等我把...
  • 因为AVR的编程器不属于RS232接口通信,弄起来麻烦。为了兼容性,我把程序的名称定义为和AVR里的名称一样,而且使用回调方式,让应用程序能够知道单片机现在发生了什么。编译器:Keil程序如下:/********************...
  • 本文将从通信原理的角度,解析RS232串口通信过程中的每个环节,包括硬件和软件,在信源和信宿之间,实现离散的字符串的传送。 目录: 一. 什么是RS232通信 二. RS232实现离散字符串通信的基本需求框架 三. RS232...
  • RS-232-C是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口...发送线和接受线三条线(异步传输),还可以加其它控制线完成同步等功能。本文档描述了RS232与RS485口、RS422口的区别。
  • 一共有两种同步方法,同步信号方法(1)和异步信号方法(2),他们也就分别对应了同步通信和异步通信: 同步信号方法会利用一根额外的信号线,其实也就就是时钟信号线,它往往是发送设备提供的时钟信号,发送设备和...
  • RS232串口协议详解

    2021-06-05 05:18:13
    2.2.RS232和UART之间的对比其实RS232和UART不是一个东西,是有区别的。下面就来解释RS232和UART的关系。只不过在多数情况下,都把UART和RS232混在一起说,此时都是指的是串口的意思UART==Universal Asynchronous ...
  • RS232接口

    2021-07-24 00:42:41
    RS-232接口符合美国电子工业联盟(EIA)制定的串行数据通信的接口标准,原始编号全称是EIA-RS-232(简称232,RS232)。它被广泛用于计算机串行接口外设连接。连接电缆和机械、电气特性、信号功能及传送过程。中文名RS-...
  • 什么是rs232

    千次阅读 2021-03-08 19:15:26
    什么是RS232协议?  RS232协议是一种流行的串行接口,...它以恒定速率执行异步传输,该速率与起始脉冲信号的电平同步。最长20米的距离是使用RS232接口进行可靠数据传输的极限。 RS232代表什么?  数据传输标准是由电子
  • 同步时钟 异步串行通讯,诸如RS232、RS485等以简单实用而众所周知。同步串行通讯以异步不可比拟的高速度而应用在许多速度要求较高的通讯网络。同步通信无需开始位和停止位,直接由同步时钟对数据采样,数据传输率...
  • 一直在用的一个久经考验的串口类实现 SIO, serial IO, rs232 接口, 串口类 有同步模式和重叠模式两种
  • ◆ 采用CDMA时间源(不用手机卡) ◆ 天线可内置,波特率为9600bps,N.8.1 ◆ 输出数据格式为:$VZTIM,HH/MM/SS,DD/MM/YY ◆ 通过计算机软件设置校时时间间隔,软件可在...◆ 与北京时间同步精度为:10ms (经中
  • RS232和串口通信,用于串口设备的数据采集软件,包括仪表、天平、秤或任何RS232仪器。WinWedge直接将数据捕获到Excel、Access或任何Windows应用程序或网页。它甚至可以从COM端口发送命令,因此您可以通过热键,按钮...
  • 该标准于1991年7月获得批准,它是一套规范,适用于数据终端设备(DTE)和数据电路终端设备(DCE)之间的数据传输。 它定义了接口电路功能及其相应... 支持全双工或半双工操作,以高达20K bps的速度进行同步或异步传输。
  • 针对一类多节点网络的数据实时采集问题,提出了基于主控同步的CAN总线多点实时数据采集技术,将RS485总线主控思想应用于CAN总线的数据通信中,通过对各节点发送数据时间的同步,有效地避免了节点间数据冲突问题。...
  • PLC各型主机均内建2个通信接口的标准配置,即一个RS232和一个RS485通信接口,其RS232接口主要用于上下载程序或用来与上位机、触摸屏通信,而RS485接口主要用于组建使用RS485协议的网络,实现通信控制。1.RS232接口...
  • 原标题:检测仪器设备常见的两种通信串口:RS232与RS485在串行通信中,数据通常是在两个站之间传送,按照数据在通信线路上的传送方向可分为3种基本的传送方式:单工、半双工和全双工,如下图所示。 单工、半双工和全...
  • RS232接收模块下面是我们想要实现的模块: 我们的设计目的是这样的: 1.当RxD线上有数据时,接收模块负责识别RxD线上的数据 2.当收到一个字节的数据时,锁存接收到的数据到"data"总线,并使"data_ready"有效一个周期...
  • RS232通信协议详解

    千次阅读 2020-10-17 13:21:44
    约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程,它属于ISO’S OSI七层参考模型中的数据链...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,320
精华内容 2,528
关键字:

同步rs232