一、通信协议概述
1.串行通信与并行通信
- 串行通信(serial communication):数据通过单根数据线一位一位地传输;成本低但速度慢;适用于远距离传输,用于计算机与外设之间,如UART、\(I^2C\)、SPI
- 并行通信(parallel communication):通过多根数据线同时将数据的所有位一次传输完成;成本高但传送速度快、效率高;适用于近距离传输,用于计算机内部,如CPU数据总线、存储器译码电路
2.同步通信和异步通信
- 同步通信:发送方发送数据后,需要等待收到接收方发回的响应后再发送下一个数据包。同步通信是阻塞模式;
- 异步通信:发送方发送数据后,不需要等待接收方发回的相应就可以发送下一个数据包。异步通信是非阻塞模式
3.数据流传输模式
- 单工通信:只支持信号在一个方向上传输(正向或反向),任何时候不能改变信号的传输方向。此种方式适用于数据收集系统,例如计算机和打印机之间的通信是单工模式,因为只有计算机向打印机传输数据,而没有相反方向的数据传输。
- 半双工通信:半双工通信允许信号在两个方向上传输,但某一时刻只允许信号在一个信道上单向传输,因此,半双工通信实际上是一种可切换方向的单工通信,传统的对讲机使用的就是半双工通信方式,由于对讲机传送及接受使用相同的频率,不允许同时进行,通信双方需要通过一定的协议或者机制来协调通信方向
- 全双工通信:允许数据同时在两个方向上传输,即有两个信道,因此允许同时进行双向传输,全双工通信是两个单工通信方式的结合,要求收发双方都有独立的接受和发送能力。全双工通信效率高,控制简单,但造价高。计算机之间的通信是全双工方式,一般的电话、手机也是全双工的系统,因为在讲话时可以听到对方的声音。
4.通信的基本组成
- 发出起始信号;
- 寻址;
- 数据传输;
- 发出终止信号
5.不同通信协议的特点
二、UART串口通信
1.概念
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART):将数据由串行通信与并行通信之间做传输转换的异步全双工串行接口,作为并行输入转为串行输出的芯片,通常集成于其他通讯接口的连接上,其工作原理是将数据一位接一位地进行传输;异步:没有共同的时钟。
2.数据组成
- 起始位:先发出一个逻辑 “0” 的信号,表示传输字符的开始。
- 数据位:紧随起始位之后,数据位的个数可以是5、6、7、8等,构成一个字符,通常采用ASCII码,从最低位开始传送,靠时钟定位
- 奇偶校验位:数据为加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来检验数据传输的正确性
- 停止位:是一个字符数据的结束标志,可以是1位、1.5位、2位的高电平,由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步,因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。停止位的位数越多,不同始终同步的容忍程度越大,但是数据传输率同时也越慢。
- 空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送
3.工作原理
- 发送数据过程:空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间T,接着数据按低位到高位(小端传输)依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送结束;
Q:UART通信中,接收方如何识别数据位还是奇偶校验位?
A:在UART通信中,数据帧中数据为的长度是预先设置好的,这个长度在通信开始之前需要由发送方和接收方共同约定好。选择合适的数据位长度可以提高通信效率。例如,在只需传输ASCII字符的情况下,选择7位数据位可以节省带宽;而在需要传输复杂数据的情况下,选择8位数据位可以提供更大的数据传输能力
- 接收数据过程:空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接受数据,数据接受完毕后,开始接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存
Q:如何区分1->0和11->00?
A:UART波特率发生器:波特率是衡量数据传输速率的指标,表示每秒传送数据的字符数,单位是bps,UART的接收和发送是按照相同的波特率进行收发的,发送方与接收方之间的波特率只能相差约10%Q:发送方和接收方没有共同的时钟,如何保证数据传输的正确性?
A:波特率发生器产生的时钟频率不是波特率时钟频率,而是波特率时钟频率的16倍,即每个数据帧有16个时钟采样,取中间的采样值。
以传输8位数据为例,当检测到数据的下降沿时,表明线路上有数据进行传输,这时计数器CNT开始计数,当计数器为24=16(起始位)+8(第0位数据中间采样值)时,采样的值为第0位数据;当计数器的值为40时,采样的值为第1位数据,依此类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶校验位;当计数器的值为168时,采样的值为“1”表示停止位,一帧数据接收完成。Q:为什么UART无需寻址?
A:UART是一种简单的点对点通信协议,通常用于两个设备之间的直接通信,在这种通信模式下,发送端和接收端是固定的,不需要识别多个设备或节点
三、\(I^2C\)串口通信
1.概念
\(I^2C\)(Inter-Integrated Circuit)总线是PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准,他是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。
2.\(I^2C\)总线
\(I^2C\)总线是一种多主机总线,连接在IIC总线上的器件分为主机和从机:主机有权发起和结束一次通信,而从及只能被主机呼叫;
当总线上有多个主机同时启用总线时,IIC也具备冲突检测和仲裁的功能来防止错误产生;
每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作
IIC总线在通信时总线上发送数据的器件为发送器,接受数据的器件为接收器;
\(I^2C\)总线只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL
IIC总线通过上拉电阻接正电源,当总线空闲时,两根线均为高电平,连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA以及SCL都是线“与”关系
线与关系:多个输出端连接到同一条线上。如果任何一个输出端被拉低,那么整条线的电压就会被拉低。只有当所有连接到这条线上的输出端都保持高电平时,整条线才会是高电平。
3.通信过程
- 主机发送起始信号启用总线
- 主机发送从机地址进行寻址
- 被寻址的从机发送应答信号回应总机
- 发送器发送一个字节数据
- 接收器发送应答信号回应发送器
- ......(循环步骤4、5)
- 通信完成后主机发送停止信号释放总线
4.通信原理
4.1 起始信号/终止信号
- SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号
- SCL线为高电平器件,SDA线由低电平向高电平的变化表述终止信号
起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态
4.2 寻址方式
- IIC总线上传送的数据是广义的,既包括地址,又包括真正的数据
- IIC总线通信时每个字节为8位长度,该数据的高7位是从机地址,最低位表示后续字节的传送方向:0表示主机发送数据,1表示主机接收数据
4.3 数据传输与应答
- 数据发送:数据传送时,先传送最高位,后传送低位
- 从机应答:
- 发送器发送完一个字节数据后,每个从机将主机发送的地址与其子集的地址进行比较
- 如果地址匹配,则从机通过将SDA线拉低一位返回一个ACK位;
- 如果主机的地址与从机的的地址不匹配,则从机将SDA线拉高
- 若由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平(高电平表示不应答主机的请求),而由主机产生一个终止信号以结束总线的数据传送
- 接收器件收到一个完整的数据字节后,有可能需要完成一些其他工作,如处理内部中断服务等,这时接收器件可以将SCL线拉成低电平,从而使主机处于等待状态。直到接收器件准备好接收下一个字节时,再释放SCL线使之成为高电平,从而使数据传送可以继续进行
- 如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送
- 当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号,这个信号是由对从机的“非应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。
- 传输完每个数据帧之后,接收设备将另一个ACK位返回给发送方,已确认已经成功接收到该数据帧;随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送终止信号
- 发送器发送完一个字节数据后,每个从机将主机发送的地址与其子集的地址进行比较
- 主机向从机发送数据,数据传送方向在整个传送过程中不变
主机在第一个字节后,立即从从机读取数据
在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好相反
4.4 信号同步
IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平才允许变化
四、SPI串口通信
1.概念
串行外围设备接口(Serial Peripheral interface,SPI)是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。主要应用在EEPROM,FLASH,实时时钟,AD转换器还有数字信号处理器和数字信号解码器之间
SPI分为主、从两种模式,一个SPI通讯系统有且只有一个主设备,以及一个或多个从设备,提供时钟的为主设备(Master),接收时钟的为从设备(Slave)。在实际应用中,MCU一般作为主SPI设备,带SPI接口的外围器件作为从设备
2.SPI信号线
- MOSI:SPI总线主机输出/从机输入(SPI Bus Master Output/Slave Input)该引脚在从模式下发送数据,在主模式下接收数据
- MISO:SPI总线主机输入/从机输出(SPI Bus Master Input/Slave Output)该引脚在主模式下发送数据,在从模式下接收数据
- SCLK:时钟信号,由主设备产生
- SS/CS:从设备片选信号,由主设备控制,它的功能是用来作为”片选引脚“,也就是选择指定的从设备,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突
3.数据传输
SPI主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。
- 首先拉低对应SS信号线,表示与该设备进行通信
- 主机通过发送SCLK时钟信号,来告诉从机写数据或者读数据
- 主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(0~7),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。
- 从机(Slave)也将自己的串行移位寄存器(0~7)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。
一个从设备要想能够接收到主设备发过来的控制信号,必须在此之前能够被主设备进行访问。所以主设备必须首先通过SS/CS pin对从设备进行片选,把想要访问的从设备选上
4.SPI的4种模式
依据时钟极性和时钟相位可以分为四类
- 时钟极性(CPOL)配置SCLK的电平处于什么状态时是空闲态
- CPOL=0:空闲态时为低电平(上升沿触发工作状态)
- CPOL=1:空闲态时为高电平(下降沿时触发工作状态)
- 时钟相位(CPHA)配置数据采样是在第几个边沿
- CPHA=0:在第一个边沿采样数据,第二个边沿交换数据
- CPHA=1:在第一个边沿交换数据,第二个边沿采样数据