1、电子通信的基本概念
1.1、同步通信和异步通信
1.同步通信:通信双方有统一的工作节拍,一般需要发送方给接收方发送信息的同时发送时钟信号,接收方根据发送方给它的时钟信号来安排自己的工作节奏。同步通信用在通信双方信息交换频率固定,或者通信频率比较高的场景。
2.异步通信:又叫异步通知,简单来说就是发送方不必考虑接收方,想发信息就发信息,没有固定的工作节拍。但是需要遵循一定的通信协议,比如发送方发送信息时,需要先发起始位通知接收方,然后发送数据,数据发送完成要发结束位表示一帧数据发送完成。
区别:
(1)同步通信有统一工作节拍,异步通信没有统一工作节拍。一般来说,同步通信的连接线里有一根是时钟信号线。
(2)同步通信适合通信频率固定或者通信频率较高的场景;异步通信适合通信频率不固定或者通信频率较低的场景。
1.2、电平信号和差分信号
1.电平信号:电平信号有一根是参考电平线,信号线的信号值有信号线和参考电平线之间的电压差决定;
2.差分信号:差分信号没有参考电平线,传输一路数据需要两根信号线,信号线的信号值由两根信号线的电压差决定。
区别:
(1)信号值的表示不同:电平信号的信号值是信号线和参考电平线的电压差决定;差分信号的信息值是由两条信号线的电压差决定;
(2)传输相同路数的信号,电平信号用的数据线根数比差分信号少。比如传输3路信号,电平信号需要1根参考电平+3根数据线;而差分信号需要2x3=6根数据线;
(3)现在通信大部分是差分信号,因为差分信号的抗干扰性更强,可以在更短的周期传输一个数据。
1.3、并行接口和串行接口
并行接口:一次可以发送过个bit位数据。
串行接口:一次只能发送一个bit位数据。
区别:
(1)并行接口和串行接口一次发送的bit位不相同,串行一次只能发一个bit数据,并行接口可以一次发多位bit数据;
(2)并行接口的抗干扰性比串行接口差,虽然并行接口一次发送的数据位比串行接口多,但是因为抗干扰性差的原因,并行接口的发送频率不能很高,串行接口的通信速率是可能比并行接口更快的;
(3)串行接口比并行接口更省信号线;
1.4、单工通信、双工通信、半双共通信
单工通信:只能单向发送消息,只能A向B发消息,B不能向A发消息;
双工通信:A和B可以互相发消息,并且互不排斥,可以同时给对方发消息;
半双工通信:A和B可以互相发消息,但是同一时间只能一方发消息,另一方收消息,算是单工通信和双工通信的结合体;
2、串口通信介绍
2.1、串口通信的特点
串口通信:异步、电平信号、串行、双工。
异步:串口的接收方和发送方没有统一的时钟信号;
电平信号:串口通信出现比较早,传输的距离比较近,所有用的电平信号。后期出现的通信协议,都改成了差分信号;
串行:每次只能传输一个二进制位;
双工:通信双方可以同时接收和发送信号。
2.2、波特率
指的就是串口的通信速率,也就是串口每秒能传输多少个二进制位。比如常用的波特率115200,也就是指串口每秒发送115200个二进制位。接收和发送必须使用相同的波特率,不然会通信紊乱,导致不能正常收发数据。
2.3、起始位、数据位、奇偶校验位、停止位
(1)起始位:接收方收到该数据位就表示发送方马上要发送数据了;
(2)数据位:本次传输周期里要传输的有效数据,可配置;
(3)奇偶校验位:防止数据出错的,可配置;
(4)停止位:表示本次传输周期结束,可配置;
总结:串口通信时,是以周期为单位进行收发数据的,既然是周期性的收发数据,那就要规定好周期的开启和结束,也就是要提前商量好通信协议,上面的位定义就是通信
协议,在建立串口通信时要收发双方配置一致;
2.4、通信线:Rx、Tx、GND
(1)Rx、Tx、GND是串口的通信线,Rx是接收数据的信号线,Tx是发送数据的信号线,GND是参考电平线,串口是全双工通信;
(2)通信线的解法:发送方Rx–接收方Tx、发送方Tx–接收方Rx、发送方GND–接收方GND。
2.5、DB9接口、USB转串口、4脚接口
(1)DB9接口:串口通信早期比较常用的规范化接口,有9根线,其中就包括Rx、Tx、GND,其余的6根线和流控有关。现在的串口通信一般都没有
用流控,所以这6根线基本没用,现在笔记本电脑上已经没有DB9接口;
(2)4脚接口:现在的嵌入式设备上大多也没有DB9接口,但是会引出来一个4脚的串口来输出信息,方便调试。4脚串口就是在原来Rx、Tx、GND的基础上,多了一根电源正极线。4脚的串口通常会会通过一个电路板来转成DB9接口来对外通信;
(3)USB转串口:现在的电脑可能没有DB9接口,所以要使用USB转串口线来连接开发板;
2.6、自动流控(AFC:Auto flow control)
自动流控和串口安全通信有关的,因为串口在早期是作为设备间数据交互的通路,必须确保通信数据的正确性。但是在现在串口大多作为打印信息输出,并且通信速度也不快,就取消了自动流控。自动流控的细节就不讲了,反正现在也用不上,在建立串口通信时记得把自动流控取消掉,就是不要勾选RTS/CTS。
3、串口工作原理框图
(1)时钟总线:串口属于低速外设,挂载在PCLK_PSYS(Peripheral BUS)时钟线上;
(2)组成:控制单元(control unit)、波特率发生器(Buad-rate Generator)、发送缓冲寄存器(Transmit Buffer Register)、发送移位器(Transmit Shifter)、
接收缓冲寄存器(Receive Buffer Register)、接收移位器(Receive Register);
(3)控制单元:控制整个串口的通信过程,什么时候发数据,什么时候收数据;
(4)波特率发生器:产生串口通信需要的波特率,和时钟频率有关,需要配置;
(5)发送缓冲寄存器:把要发送的数据写到发送缓冲寄存器;
(6)发送移位器:把发送缓冲寄存器里的数据一位一位的发送到数据线上,这是硬件自动的;
(7)接收缓冲寄存器:保存接收到的数据;
(8)接收移位器:把数据线上接收到的数据一位一位的写到接收缓冲寄存器里;
4、串行通信模式
4.1、FIFO模式
普通模式下串口只有一个发送缓冲寄存器和一个接收缓冲寄存器,CPU要不断切换上下文去处理串口通信,这会导致效率低下,浪费CPU的性能。FIFO模式就是扩大缓冲寄存器的数量,从一个寄存器扩大到64个寄存器。这样以前要一个字节处理一次串口通信变成64个字节才处理一次串口通信,
降低了CPU处理串口通信的频率。这只是在一定程度上解决,当有大量数据要发送时FIFO模式还是不能满足需求,于是就有了DMA模式。(每个串口的FIFO模式扩充的缓冲寄存器数量可能是不同的,有256、64、16,具体看数据手册说明)
补充:
(1)FIFO(First In First Out)其实是一种数据结构的名字,数据按照先进先出的原则进行处理。叫FIFO模式是因为扩大的缓冲区类似FIFO这种数据结构,也是先进先出;
(2)FIFO模式在策略上就不能解决大量数据通信,因为不能无限的扩大缓冲寄存器的数量,在CPU中寄存器是有限且珍贵的;
4.2、DMA模式
DMA(direct memory access)模式是为了解决串口大量数据传输的,DMA模式下缓冲区不再是寄存器,而是划定一块内存用作缓冲区,这样CPU就不用再频繁去处理串口通信。
4.3、IrDA模式
(1)IrDA(Infrared)就是红外线通信,电视机、空调的遥控器就是红外线通信。红外通信是发送方固定间隔向接收方发送红外信号,这和串口通信是类似的,所以可以用串口通信来实现红外通信;
(2)不是每个串口都支持IrDA模式,具体要查数据手册;并且需要外部硬件支持,至少你得有一个红外线的发送、模块吧。
5、串行通信工作模式:轮询模式、中断模式
(1)轮询方式::CPU不断去查询串口控制器的状态位,当缓冲区空/满时就去填充/获取数据。这样比较耗费CPU性能,但是程序简单。
(2)中断模式:当缓冲区空/满时串口控制器会发出中断信号,通知CPU去处理串口缓冲区的数据。这样会降低CPU处理串口的频率,但是需要用到终端,程序要复杂些。
总结:两种方式各有优劣,串口通信是异步的,更契合中断模式,但是轮询方式胜在简单。在uboot阶段的串口通信时,我所接触到的就是使用的轮询模式,因为当uboot
进入到shell界面时,uboot就等着接受指令,CPU也不着急做其他的事情,浪费CPU性能也无所谓。
6、串行控制器的时钟框图
右边虚线框里是UART的时钟框图,主要包括Clock_Selection、UCLK_Generator、Clock_Selection:可以通过UCON寄存器的10bit位选择时钟来源;UCLK_Generator:对上一步的时钟源进行分频,产生合适的波特率;分频系数需要根据时钟频率和波特率进行计算,将计算好的分频系数填到UBDIV和UDIVSLOT寄存器中。
7、串行通信的配置寄存器
7.1、ULCONn
配置校验位、数据位、停止位、决定是否用IrDA模式。
7.2、UCONn寄存器
选择是轮询模式还是中断模式、选择时钟来源
7.3、UMCONn寄存器
禁止modem、afc
7.4、UFCONn寄存器
FIFO模式的相关配置
7.5、UBRDIVn寄存器
UBRDIV寄存器的bit0-bit15保存的是串口时钟的分频系数整数部分;
7.6、UDIVSLOTn寄存器
UDIVSLOT寄存器的bit0-bit15保存的分频系数的小数部分,但不是直接将小数部分写入,而是要查表来确认写入的值。
7.7、UTXHn寄存器
将要发送的数据写到该寄存器;
7.8、URXHn寄存器
接收到的数据会保存到该寄存器;
8.1、波特率计算
(1) 分频系数的计算公式:DIV_VAL = (PCLK / (bps x 16)) -1;
(2) 串口的时钟来源是PCLOCK_PSYS=66MHZ,如果要将波特率设置成115200,根据上面的公式可得,DIV_VAL=(66000000/(115200x16)-1)=34.8;
(3) 于是UBRDIVn的值是34,小数部分是0.8,要根据小数来计算UDIVSLOTn的值;
8.2、UDIVSLOTn值计算
(1)UDIVSLOTn中的值满足关系:UDIVSLOTn中1的个数除以16等于上面计算出的DIV_VAL的小数部分值。
(2)上面计算得小数部分是0.8,于是UDIVSLOTn中1的个数为0.8*16=12(向下取整),查表可知UDIVSLOTn应该填0XDDDD;
(3)按照上面的计算公式,只要知道UBRDIVn中有几个1,UBRDIVn的值在满足条件的情况下是任意的,但是实际却是固定的,需要查表来转换。这是因为这里计算分频系数不是纯数学计算,是要依赖具体的物理器件,物理器件有自己的物理特性,芯片开发工程师很了解,在表格里给了建议值,我们查表即可。
上一篇:ARM芯片开发(S5PV210芯片)——定时器、看门狗、RTC
下一篇:ARM芯片开发(S5PV210芯片)——SD卡启动
推荐阅读最新更新时间:2024-11-10 04:08