一、协议的分类
根据通信方向划分
单工: 一根信号线单向发送或者接收
要么收,要么发,只能作为接受或者发送设备。 比如:收音机
半双工:一根信号线,可以双向进行,但是不能同时。
可以收,可以发,但是不能同时进行。 比如:对讲机。
全双工: 两根信号线,可以在同一时刻收发信息。比如: 手机,电脑。
根据通信方式划分
串行通信:指的是同一时刻只能收或发一个bit位信息,因此只用1根信号线即可
串行传输:数据一位一位串起来,逐个传输,数据按位顺序传输
优点:占用的引脚资源少
缺点:传输速度慢
并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行
并行传输:使用多根线同时传输一个字的多个位,如 8 根线一次传输 8 个位。
优点:传输速度快
缺点:占用引脚多
根据时钟信号划分
同步通信:通信双方根据同步信号通信,比如双方有一个共同的时钟信号(SPI全双工 I2C半双工)
异步通信:通信双方有自己独立的系统时钟,大家约定好通信的速度。
异步通信不需要同步信号,但是并不是说通信的过程不同步(UART)
三、常见硬件通信协议
1. SPI协议
1)协议介绍
SPI接口是Motorola首先提出的全双工三线/四线同步串行外围接口,采用主从模式架构。
SPI是串行外设接口的缩写。SPI是一种高速的、全双工、同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,如今主流的微控制器都集成有SPI接口,如stm32家族。
2)原理
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。
产生时钟的一侧称为主机,另一侧称为从机。总是只有一个主机(一般来说可以是微控制器/MCU),但是可以有多个从机(后面详细介绍);
数据的采集时机可能是时钟信号的上升沿(从低到高)或下降沿(从高到低)。
SPI总共有4根总线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。
SPI总线包括4条逻辑线,定义如下:
- MISO:
Master input slave output
主机输入,从机输出(数据来自从机); - MOSI:
Master output slave input
主机输出,从机输入(数据来自主机); - SCLK :
Serial Clock
串行时钟信号,由主机产生发送给从机; - CS:
Chip Select
片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号
其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(通常为低电平有效),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。
整体的传输大概可以分为以下几个过程:
- 主机先将
CS
信号拉低,这样保证开始接收数据; - 当接收端检测到时钟的边沿信号时,它将立即读取数据线上的信号,这样就得到了一位数据(1
bit
); - 主机发送到从机时:主机产生相应的时钟信号,然后数据一位一位地将从
MOSI
信号线上进行发送到从机; - 主机接收从机数据:如果从机需要将数据发送回主机,则主机将继续生成预定数量的时钟信号,并且从机会将数据通过
MISO
信号线发送。
3)SPI模式
a. 时钟极性:CKP/Clock Polarity 或 CPOL
除了配置串行时钟速率(频率)外,SPI主设备还需要配置时钟极性。
时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据;
CKP可以配置为1或0。可以根据需要将时钟的默认状态(IDLE)设置为高或低。
CKP = 0
:时钟空闲IDLE
为低电平0
;
CKP = 1
:时钟空闲IDLE
为高电平1
。
b. 时钟相位:CKE /Clock Phase (Edge) 或 CPHA
除配置串行时钟速率和极性外,SPI主设备还应配置时钟相位(或边沿)。
顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;
CKE = 0
:在时钟信号SCK
的第一个跳变沿采样;CKE = 1
:在时钟信号SCK
的第二个跳变沿采样。
c. 模式编号
当CPHA = 0时,时钟线的奇数边沿会被采样。
CPOL = 0,SCK在空闲状态时保持低电平。
CPOL = 1,SCK在空闲状态时保持高电平。
当CPHA = 1时,时钟线的偶数边沿会被采样。
CPOL = 0,SCK在空闲状态时保持低电平。
CPOL = 1,SCK在空闲状态时保持高电平。
4)多从机模式
a. 多NSS
- 通常,每个从机都需要一条单独的SS线。
- 如果要和特定的从机进行通讯,可以将相应的
NSS
信号线拉低,并保持其他NSS
信号线的状态为高电平;如果同时将两个NSS
信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO
线上传输数据,最终导致接收数据乱码。
b. 菊花链
在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链。
- 菊花链的最大缺点是因为是信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;
- 另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;
菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。
5)优缺点
a. 优点
- 全双工串行通信;
- 高速数据传输速率;
- 简单的软件配置;
- 极其灵活的数据传输,不限于8位,可以是任意大小的字;
- 非常简单的硬件结构。从机不需要唯一地址(与I2C不同);从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同);不需要收发器(与CAN不同)。
b. 缺点
- 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
- 通常仅支持一个主设备;
- 需要4根引脚(与I2C不同);
- 没有定义硬件级别的错误检查协议;
- 与RS-232和CAN总线相比,传输距离非常短;
2. IIC协议
1)协议介绍
I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于(一主多从 一个主设备(Master),多个从设备(Slave))的总线结构,总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备。
物理I2C接口有两根双向线,串行时钟线(SCL)和串行数据线(SDA)组成,可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输。
IIC极低的工作电流,降低了系统的功耗,完善的应答机制大大增强通讯的可靠性。
a. IIC的5种传输速率
I2C协议可以工作在以下5种速率模式下,不同的器件可能支持不同的速率。
- 标准模式(Standard):100kbps
- 快速模式(Fast):400kbps
- 快速模式+(Fast-Plus):1Mbps
- 高速模式(High-speed):3.4Mbps
- 超快模式(Ultra-Fast):5Mbps(单向传输)
其中超快模式是单向数据传输,通常用于LED、LCD等不需要应答的器件,和正常的I2C操作时序类似,但是只进行写数据,不需要考虑ACK应答信号。
b. 4种信号
I2C协议最基础的几种信号:起始、停止、应答和非应答信号。
(a)起始信号
A HIGH to LOW transition on the SDA line while SCL is HIGH defines a START condition.
(b)停止信号
A LOW to HIGH transition on the SDA line while SCL is HIGH defines a STOP condition.
过程如下:
I2C协议对数据的采样发生在SCL高电平期间,除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,在SCL低电平时才可以进行变化。
(c)应答信号
I2C最大的一个特点就是有完善的应答机制,从机接收到主机的数据时,会回复一个应答信号来通知主机表示“我收到了”。
应答信号出现在1个字节传输完成之后,即第9个SCL时钟周期内,此时主机需要释放SDA总线,把总线控制权交给从机,由于上拉电阻的作用,此时总线为高电平,如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应。
使用MCU、FPGA等控制器实现时,需要在第9个SCL时钟周期把SDA设置为高阻输入状态,如果读取到SDA为低电平,则表示数据被成功接收到,可以进行下一步操作。
(d)非应答信号
当第9个SCL时钟周期时,SDA保持高电平,表示非应答信号。
(e)数据有效性
I2C协议对数据的采样发生在SCL高电平期间,除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,在SCL低电平时才可以进行变化。
c. 读写时序
向指定寄存器地址写入指定数据操作时序:
从指定寄存器地址读取数据操作时序:
读数据时有两次起始信号:S和Sr。
d. 为什么IIC要加上拉电阻?
I2C协议中规定I2C的SCL和SDA都是开漏(OD)输出,开漏输出只能输出低电平不能输出高电平。根据I2C总线规范,总线空闲时两根线都必须为高,故需要上拉电阻来使其能够稳定地输出高电平。
总结:
- 给I/O确定的电平,不易受外界干扰;
- 接上拉的开漏输出结构可以作为外部的输入I/O。
e. IIC上拉电阻该如何选择?
(这部分先偷个懒,后面再写
3. CAN协议
1)协议介绍
控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他自动化和工业应用。CAN协议的特性包括完整性的串行数据通讯、提供实时支持、传输速率高达1Mb/s、同时具有11位的寻址以及检错能力。
2)通信原理
CAN总线使用串行数据传输方式,可以1Mb/s的速率在40m的双绞线上运行,也可以使用光缆连接,而且在这种总线上总线协议支持多主控制器。CAN与I2C总线的许多细节很类似,但也有一些明显的区别。当CAN总线上的一个节点(站)发送数据时,它以报文形式广播给网络中所有节点。对每个节点来说,无论数据是否是发给自己的,都对其进行接收。每组报文开头的11位字符为标识符,定义了报文的优先级,这种报文格式称为面向内容的编址方案。在同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文。当几个站同时竞争总线读取时,这种配置十分重要。
当一个站要向其它站发送数据时,该站的CPU将要发送的数据和自己的标识符传送给本站的CAN芯片,并处于准备状态;当它收到总线分配时,转为发送报文状态。CAN芯片将数据根据协议组织成一定的报文格式发出,这时网上的其它站处于接收状态。每个处于接收状态的站对接收到的报文进行检测,判断这些报文是否是发给自己的,以确定是否接收它。由于CAN总线是一种面向内容的编址方案,因此很容易建立高水准的控制系统并灵活地进行配置。我们可以很容易地在CAN总线中加进一些新站而无需在硬件或软件上进行修改。当所提供的新站是纯数据接收设备时,数据传输协议不要求独立的部分有物理目的地址。它允许分布过程同步化,即总线上控制器需要测量数据时,可由网上获得,而无须每个控制器都有自己独立的传感器。
4. UART协议
1)协议介绍
通用异步收发传输器,通常称作UART,是一种异步收发传输器,是电脑硬件的一部分。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。
具体实物表现为独立的模块化芯片,或作为集成于微处理器中的周边设备。一般是RS-232C规格的,与类似Maxim的MAX232之类的标准信号幅度变换芯片进行搭配,作为连接外部设备的接口。在UART上追加同步方式的序列信号变换电路的产品,被称为USART(Universal Synchronous Asynchronous Receiver Transmitter)。
2)通信原理
UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。
其中各位的意义如下:
- 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
- 数据位:紧接着起始位之后,通常采用ASCII码。从最低位开始传送,靠时钟定位。
- 奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
- 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
- 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
- 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是。
5. USB协议
1)协议简介
通用串行总线(Universal Serial Bus,USB)是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等其它相关领域。
a. 通信接口
b. 编码方式
这种编码方式也称为反向不归零编码(NRZI)。
位填充:在数据进行NRZI
编码前,每6个连续的1
信号之后都会插入1个0
信号,以避免长时间电平保持不变带来的同步漂移。
2)标准USB接口
下图为标准USB A型连接器(左)及B型连接器(右)。
标准USB接口的信号使用分别标记为和的双绞线传输,它们各自使用半双工的差分信号并协同工作,以抵消长导线的电磁干扰。
3)USB Type-C接口
USB Type-C,又称USB-C,是一种通用串行总线(USB)的硬件接口形式,外观上最大特点在于其上下端完全一致,与USB Type-A相比不再区分USB正反面。
a)引脚说明
母头,内凸:
公头,内凹避免线路外露: