详解串行通信协议及其FPGA实现,5000字先马后看

详解串行通信协议及其FPGA实现,5000字先马后看

ee5914ae397e49b30789116c6eedbe40.png

\\\插播一条:

自己在今年整理一套单片机单片机相关论文800余篇

论文制作思维导图

原理图+源代码+开题报告+正文+外文资料

想要的同学私信找我。

3fbed6fd023fc71bb42fb222f52edda1.png

前言

好久没更新博客了,这篇文章写写停停,用了近一周的时间,终于写完了。本篇文章介绍,串口协议数据帧格式、串行通信的工作方式、电平标准、编码方式及Verilog实现串口发送一个字节数据和接收一个字节数据。

对于MCU串口的发送接收,可能就是1行代码就能实现串口的发送和接收:

STM32的串口接收和发送

//STM32发送1个字节USART_SendData(USART1,'A');while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_TXE)==RESET);

//STM32接收1个字节:uint8_tRes;while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);Res=USART_ReceiveData(USART1);

51单片机的发送和接收

//51单片机发送1个字节SBUF='A;while(!TI);TI=0;

//51单片机接收1个字节:charRes;if(RI){

Res=SBUF;

RI=0;}

更方便一点的,通过重写C库fput函数和fgetc函数,还可以实现printf直接重定向到串口,用来输出一些调试信息再方便不过了。

STM32实现输入输出重定向到串口发送接收

//可重定向printf函数intfputc(intch,FILE*f){

USART_SendData(DEBUG_USARTx,(uint8_t)ch);

while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_TXE)==RESET);

return(ch);}//可重定向scanf函数intfgetc(FILE*f){

while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_RXNE)==RESET);

return(int)USART_ReceiveData(DEBUG_USARTx);}

而MCU上的串口是半导体厂商预先设计好的,几乎是MCU的标配,高度集成,使用起来十分方便,但是串口的引脚基本上是固定的,不可以更改。对于硬件橡皮泥——FPGA来说,需要使用HDL从底层串口数据帧来实现,可以直接在任意一个引脚实现串口功能。为了用Verilog HDL实现标准的串口通讯协议,我们有必要先来详细了解一下串口通讯协议。

串口数据帧格式

波特率

波特率,即比特率(Baud rate),即通信双方“沟通的语言”,通信双方要设置为一样的波特率才可以正常通信。表示每秒发送的二进制位数,即传输1位的时间是:1/波特率秒,如,波特率9600bps,即每秒传输9600bit,那么每一位的时间为:1/9600 s = 104.1666us,常用的波特率有:4800/9600/115200/12800等等,也可以根据需要自定义波特率大小,如1M或者3M,但是有的PC或者USB-TTL模块不支持太高速度的波特率,常用的USB-TTL芯片有:CH340,CP2102,PL2103,FT232等,其中FT232HL芯片最大支持12M的波特率,当然价格也比其他芯片高一些。

起始位和停止位

数据帧从起始位开始,到停止位结束。起始信号用逻辑0表示,而停止位是用逻辑1表示,一般有0.5位、1位、1.5位或2位停止位,常用的一般是1位停止位,只要通信双方约定一致即可。

数据位

起始位之后,紧跟着的是数据位,低位(LSB)在前,高位(MSB)在后,一般有5位、6位、7位和8位数据位,常用的是8位数据位,因为一个字节正好是8位。

校验位

校验位一般用来判断接收的数据位有无错误,校验方法有:奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)及无校验(noparity)。奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个8位长的有效数据为:01101001,此时共有4个“1”,为达到奇数个"1"的效果,校验位为“1”,让“1”的个数变成5个(奇数)。偶校验刚好相反,要求有效数据和校验位的“1”数量为偶数,则此时为达到偶校验效果,校验位为“0”。而0校验,即校验位总是为“0”,1校验校验位总是为“1”。奇偶校验逻辑相反,01校验逻辑相反。一般是奇偶校验或者是无校验位。

奇偶校验的Verilog实现

在Verilog中奇偶校验的计算非常简单,根据奇偶校验的原理,偶校验为数据位各位异或,奇校验是偶校验取反,通过使用单目运算符的缩减功能,可以非常简单的计算奇偶校验位:

input[7:0]data_in,//需要发送的8位数据wireeven_bit;//偶校验位 =各位异或wireodd_bit;//奇校验位 = ~偶校验位assigneven_bit=^data_in;//一元约简运算符,等效于data_in[0] ^ data_in[1] ^ .....assignodd_bit=~even_bit;

wirePOLARITY_BIT=even_bit;//偶校验

关于波特率允许的误差

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值