比特说串口编程

    科技2022-07-10  166

    要说一种植物,从种子发芽开始.要说计算机,从源头开始.

     

    在1.X系列的文章中,我们从最开始的灯泡的例子开始,一步步深入,知道了CPU是怎么工作的,配合内存可以自动工作。

     

    前面的内容基本上是CPU工作原理的完整轮廓了。

     

    我们知道现在使用的各种形态的计算机除了CPU还有很多别的设备,这些所有的设备都不在CPU里面,都是外部设备,简称:外设。常见外设有:键盘,鼠标,屏幕,或者触摸屏......这些都是按照功能划分的。

     

    我们关注的是计算机的工作原理,对外设的分类当然按照工作原理划分为:串口设备,USB设备,PCIE设备,网络设备等等。这些设备都是在一种通信设备的基础上实现不同的功能,这样外设和CPU就能联合工作了,我们看到鼠标和键盘都可以是USB设备,通过USB传送鼠标的移动和点击、键盘的按下按键。如果我们知道知道了一种通信方式,那不同设备,我们看起来就没那么多差别了,都是和CPU传输数据而已。

     

    这就好比,马路上跑着各种汽车,这汽车,那汽车,看得人眼花缭乱。但是如果拆掉装饰和外壳,就能看清它们真实的汽车本质。都是在汽车(发动机+轮子)的基础上实现的不同功能。

     

    所有的学习都要看清本质,化繁为简。(敲黑板,这是比特第二定律!还记得比特第一定律是什么?)

     

    那让我们就从CPU和外设通信最基础最常用的串口开始吧。

     

    要说串口就不得不提通信。

     

     

     

    通信

     

    通信是什么?

     

    字面意思很好理解:就是可以把信从一个地方A送到另外的地方B,A和B送信的路是通的。通信的本意就是这样。

     

    只不过随着技术发展,电报,电话,QQ,微信等替换了写信,人们还延续之前的叫法,其实人们并不关心用那种形式把信息从A传递到B,关心的是信息的内容。

     

    计算机中的通信也是一样的,把信息从A传送到B(CPU到外设,或者外设到CPU,等等),并且也有很多种传送形式。

     

    简单说说2种最基本的通信形式:并行和串行通信。

     

     

     

     

    并行

     

    你看这个名字取的那叫个形象阿。

     

    并行是什么意思?并排行走。就是说从A到B要送8封信,就有8个邮递员每人拿1封信,并排行走在马路上,从A走到B。(思维敏捷的你是不是想说:那为什么不让一个邮递员拿8封信?不行,有很多理由:珍贵的易碎品必须专人护护送;信太重,一个人拿不动2封;从A到B要过一座桥,拿2个危险......总之就是不能,一人只能拿一封信)

     

    这个并行送信有什么问题呢?很显然,8个人并排走比较占地方,需要路修的比较宽,修得窄就没法这样送。

     

    并行通信在计算机中是这样:

    CPU端有个寄存器,外设端也有个寄存器,并行通信就是两边的寄存器每一位都有导线连接,数据可以从CPU传送到外设,也可以从外设传送回来。

     

     

     

    串行

     

    再一次夸一下名字取的好。(很多时候我们可以通过名字理解一个事物的本质)

     

    串行:排成一串行走。有了上面并行送信的例子,你应该已经知道什么是串行送信了。就是送信的邮递员走成一串(哈哈哈,好像走路叫一串,不太礼貌,意思到就好哈),这样就能解决并行送信需要很宽的路的问题。突然理解了当年上幼儿园的时候老师为什么让我们走成一串了,原来是因为校门太窄了阿(机智.gif)。

     

    串行通信在计算机中是这样:

    只用一根导线连接CPU端和外设端就可以让两边通信。

     

    为什么画了一条斜线?这是为了便于理解:你可以把斜线想象成一条管道,数据通过管道流动,CPU端最下面的0最先进入管道,后面紧跟着1。流过管道,0最先出管道,掉到了外设端寄存器的最下面,接着1紧跟在后面。串行通信外设端接收到的数据和CPU端发送的数据是一样的。

     

    不同于并行通信每个bit都有连线,串行通信只有一条连线,所有的数据要依次通过这条连线,顺序不能乱。

     

     

     

     

    能双向传输吗?

     

    能不能双向传输,这个问题同时存在于并行通信和串行通信,我们这里只讨论串行通信,并行通信原理是类似的。

     

    我们先看看上图中的串行通信可以双向传输吗?如果把那一条连线看作管道,那水可以从CPU端流到外设端,也可以从外设端流到CPU端。这说明了可以双向传输。

     

    那双向能同时传输吗?看起来不能,如果水往一边流就不能同时往另一边流。只能一边传送完了再从另一边传送,这种2端能互相传输数据,但是不能同时工作的通信有一个专有的名字:半双工通信(个人觉得这个名字取的不是很利于初学者理解)。

     

    如果想让两边可以同时传输,那该怎么办?

     

    计算机中用到的理论很多其实是很朴素的,就是生活中人们常用的处理方式。

     

    我们认为通信的连线是管道,或者马路,看看管道和马路是怎样解决同时双向工作的?对了,马路是改成双向车道,增加了马路宽度;管道是增加一个反向传输的管道。

     

    那么对于串行通信,也只要增加一条通路就可以了。一条通路从CPU端传输数据到外设端,另一条通路从设备端传输数据到CPU端。这种可以双向工作的通信也有一个专用的名字:全双工通信。

    这就能同时双向传输数据了,两端都有专门用来发送数据的寄存器和专门用来接受数据的寄存器(图中箭头的方向从发送端指向接收端)

     

    注意:CPU端发送寄存器连接外设端接收寄存器,CPU端接收寄存器连接外设端发送寄存器,是交叉的。

     

     

    为了方便,我们给寄存器取个名字,发送寄存器叫:TX寄存器,接收寄存器叫:RX寄存器。

     

     

     

    串口编程

     

    要想利用编程控制串口发送或接收数据,我们只需要关心CPU端就好。

     

    首先,回忆一下之前我们是如何编程的。

     

    我们用不同的指令操作CPU内部寄存器,内存地址,或者直接操作数字。如何操作串口寄存器呢?

     

    我们知道内存其实和寄存器的工作原理是差不多的,那串口寄存器的操作可否与内存用同样的方式操作?答案是肯定的,只要把串口寄存器加入内存地址编号,那就可以和访问内存一样访问串口寄存器了。

     

    但是要注意的是,串口寄存器其实和内存是不一样的。对于串口寄存器TX,CPU只能将要发送的数据写入寄存器,数据就会被发送出去,不能读这个寄存器;对于RX寄存器,CPU只能读取该寄存器以获取外设传来的数据,不能写该寄存器。而内存的每个地址都可以写入和读取。这要在编程中注意。

     

    我们简化一下CPU端的编程模型:

    假设TX寄存器在内存地址24,RX寄存器在内存地址25。

    如果我们要读取外设传来的数据,只要读取RX就可以了。用汇编语言编程:

      LDR R0 [25];

    这样就把RX寄存器(地址25)中的数据读到R0了。

     

    如何发送数据呢?

    额,我们好像还没有写内存地址的指令,好吧,现在需要加一条写内存地址的指令STR。

     

    有了STR指令,我们可以很轻松的把接收到R0的数据再通过TX寄存器(地址24)转发出去:

      STR R0 [24];

     

    对外设的操作也是读写内存地址!

    现在看起来操作CPU也不是很困难,就是操作寄存器和内存地址。

     

    好了,串口的原理和编程就到这里。

    ----------我是比特,一个想把问题搞清楚的青年才俊----------

     

    Processed: 0.029, SQL: 8