为鼓励大家动手动脑,早日成为技术大牛。电路城论坛现在推出#每日一练#栏目,由版块版主出题及提供答案,内容涉及电源,射频,单片机等各种技术话题。我们会在周一至周五的早上10:30更新问题和前天问题的解题思路及答案。欢迎大家参与。
本期内容来源于:
Casper.T,电子与通信工程专业,在读硕士,对模拟通信,智能电子设计以及FPGA图像处理和加速器有丰富的设计经验。现主要从事电子信息技术运营方面的工作。 |
所谓串口,顾名思义就是串行接口。串口的设计,实际上就是设计串口的通信协议,而常用的串口通信协议有RS-232、RS-422、RS-485。在这里,笔者以RS-232为例,设计实现一个串口发送模块。至于其他两种协议,感兴趣的同学可以自行学习一下,网上能查到很多资料。好了,废话不多说,我们直奔主题,下面直接给出串口通信的协议:
可以看到,在空闲状态下,发送总线为高电平1,而当有数据需要发送时,发送总线首先拉低,产生一个起始位,紧接着,依次发送数据的第0位到第7位,当8位数据发送结束,如果需要进行数据校验,则产生校验位,若不需要,则发送总线直接拉高,产生停止位,8位数据发送结束。
整个过程很简单,我们只需要在特定的时间让总线产生特定的信号便可。好了,串口发送的时序就介绍到这里,下面说说具体怎么实现。
首先,我们要发送数据,就一定要考虑到数据发送的速度,总不能一会快一会慢对不对,当然也不能连你这个设计者都不知道发送完8位数据需要多少时间。说到速度问题,这里引入一个波特率的概念,常用的波特率有:9600、19200、38400、115200等。在此文中,笔者将使用9600的波特率,来设计一个串口发送模块。
9600的波特率,说白了就是9600Hz/S,是数据发送的速度。举个栗子,比如这里采用9600的波特率,那么发送一位数据需要的时间便是9600分之1秒,这么说大家明白了吗?简单理解为波特率就是发送数据的速度就可以了。那么这个时候有人问了,你说了半天波特率,我还是不知道波特率是什么怎么办?对于这个,我只能说非常抱歉,同学你还是去查查百度吧,笔者没有说清楚的,百度搜索一定能为你解答。
好了,波特率已经交代了,我们知道它实际上就是一个频率,一个发送数据的频率,也就是发送数据的速度。那么,如何来产生这个频率呢?要知道,这个频率可不是凭空就有的。
想必说到频率,一定有同学已经想到了,没错,就是分频计数而已。不就是要得到9600Hz的时钟频率么,一个简单的计数器就能搞定!
既然要用到计数器,那么这个计数器,究竟要计数多少次呢?这里,给出一个简单的计算方法。
由于笔者手中开发板的时钟频率是50MHz,这里就以50MHz的时钟频率为栗:
解释一下,就是用系统时钟的频率,除以我们需要的频率(这里我们需要9600Hz),得到的结果,就是我们分频计数器需要计数的次数,每计满5208次,产生一个高电平,就能最终产生9600Hz的频率。这里,由于系统时钟频率的单位是MHz,而9600波特率的单位是Hz,所以需要先统一单位,因为应该是50_000_000/9600。自己算过的同学肯定发现了,50_000_000/9600的结果分明是5208.333333......无数个3啊,你这么写行吗?对于这种能自己动手计算的同学,笔者首先恭喜你,在学习FPGA的路上,你已经超过了很多人。不要看这个简单,我们学习技术,就是要多动手自己做,才能发现问题,解决问题,在解决问题中成长,才能进步的更快......咳咳好像偏题了,好了我告诉你同学,小数点后面这些3,你尽管让他们见鬼去吧!不会有问题的!
好了,波特率我们也有了,现在,我们来具体分析一下串口发送模块,究竟该怎么实现。这里,笔者先上一张模块信号图如下:
问:端口等定义好了,此时不码代码,还要等到什么时候,你敢码出来让我长长眼吗,我后码为敬?
答:
|