目录
基础概述:
一、UART(为串口通信方式)
二、RS232协议
三、RS485协议
四、I2C总线协议
五、SPI总线
六、I2C和SPI的区别
总线的本质就是一根导线,传递的是电信号,0和1;用于在不同的通信设备之间,如外部设备和单片机之间,进行通信的一种方式。
串行通信:指的是通信双方按位进行通信,每一次的数据传输都被“排队”,一个个从低位到高位,如UART,或者从高位到低位,如I2C,开始通信,即遵循时序的一种通信方式。
并行通信:指的是一组数据不用“排队”,一组数据的各数据位在多条线上同时被传输的通信方式。
异步通信:指的是数据的接收方和发送方具有不同的时钟。
同步通信:指的是数据的接收方和发送方具有相同的时钟。
对于串行通信和并行通信来说,串行通信只有一条总线,并行通信有多条总线并可以同时进行数据传输。从通信速度上来看,并行通信的速度比串行通信快得多;从占用的总线资源上来看,串行通信只占用了一条,要比并行通信占用的总线资源少得多;从布线布局来看,并行通信的要比串行通信的复杂。
UART是一种通用的串行、异步通信的总线,为通用异步收发器。含有两条数据线,一条用于发送、一条用于接收,可以实现全双工发送和接收。
在串口同通信的时候要先发送低位(即最右边的位),然后发送高位。
其中UART的帧格式如下图所示。值得注意的是在校验位中使用的是奇偶校验,空闲位和起始位分别固定为1和0,停止位也固定为1。校验位是可有可无的选项。
在数据传输的过程中要与波特率联系起来,例如确定发送的是10还是1100的话就要靠波特率来确定,因为波特率表示的是每秒钟所发送的比特的数量。如2秒内收到的全是0,则前两位表示的就是00;如第一秒收到一个0,第二秒收到一个1,则表示前两秒发送的是10;以此来区分重叠的数据序列。
为了更好的理解波特率,贴上牛客网上的一道波特率的计算题进行理解:
题目:串口的数据传送速率用波特率来表示,即每秒钟传送的二进制位数。设置串口的工作模式为1个起始位,7个数据位,1个校验位,1个结束位,串口波特率设置为9600。那么每秒钟传送的字符个数为()
解析:
波特率 = 每秒传送的字符数*字符位数;其中8位二进制数等于一个字符。由上述给出的条件可得:
每秒传送的字符数为:9600/10 = 960.
拓展:
值得注意的是双工通信可分为半双工和全双工,UART实现的是全双工通信。全双工通信是双向的,半双工通信相比于全双工通信多了一个约束条件:即发送器和接收器不能同时发送和接收,在发送的时候只能单方面从发送器到接收器,在另一边的发送器给接收器的时候不能工作;单工通信是单向的,只能由发送器发送数据或信息给接收器,接收器不能反向发送。
波特率:用于描述UART通信时的通信速度,其单位为bps,即每秒钟传送的bit的数量。
注意在串口通信中,每次发送的数据量最多只能为一个字节,即8个bit。这样的做法是为了防止由于时间延迟等造成的累计误差。
在UART的使用当中,只需要理解的UART的数据传送和接收的原理,在代码编写的时候不用管;但需要声明波特率。因为在soc中,如果使用UART进行通信的话,作为人为控制的是UART控制器,而UART(串口)控制器对应着的是控制着发送和接收的寄存器。
由于UART(即串口)存在抗干扰能力差(因为直接使用的是TTL电平),电气接口不统一(UART通信时都是直接使用处理器的电平,而不同的处理器之间的电平有差异),通信距离很短(一般只适用于同一块电路板上不同芯片之间的通信)等问题,因此在工程中一般不直接使用串口进行通信。
针对UART存在的问题,有很多生产厂家共同制定了用于串行通信的标准,即RS232(下称232)。
同时在该标准中规定采用一个标准的连接器,也对连接器的每个引脚的作用作了规定,还对信号的电平也加以规定。下图所示为RS232接口示意图,图片来源Microsoft bing images。
其中,现在的232接口有9根线,在工业控制中一般只使用到 RXD/TXD/GND。
其中,使用232在单片机之间的通信可如下图所示:
RS232协议也是全双工通信。
跟232类似,485同样是基于串口通信的。但相比于232协议,其传输距离能达到1500米,而232最高只有15米;且 232是点对点通信的,即都只有一个发送器和接收器。
232和485最大的区别在于232的总线上来两边的处理器上只能各自有一个232,但485总线上可以有多个485设备(可以根据I2C总线的主机和从机原理进行理解),即具有多站能力,从而能够构成一个局域网。
值得注意的是:485总线采用的是差分信号进行数据传输,即两线同时传输逻辑电平1或0;而232只采用一根线传输逻辑0或1.在485差分信号之间,两线间的电压差为+2v到+6v表示逻辑“1”,-2到-6表示逻辑电平“0”。
但也正是因为485使用的两线制,数据的接收和发送都要使用这对差分信号线,因此通信方式只能使用半双工方式,即发送的时候不能接收,接收的时候不能发送。但该总线方式的通信距离长,且抗干扰性强,通信速度加快,以及可实现多节点组网。
其中,在I2C总线上的设备或者器件都能作为主机或从机,但在同一个时间点上只能有一个主机。主机有权发起和结束一次通信,但从机只能被等待主机呼叫。
I2C的通信过程:
1,确定主机后,主机发送起始信号启用总线。
2,主机发送一个字节的数据指明从机地址和后续字节的传送方向。即:由于连接到I2C的器件都有一个唯一的7bit的地址,这是发送的高7位,其中第0位为指明后续字节的传送方向。因为I2C协议是全双工通信,因此I2C规定了当最低位为0时,表示主机向从机通信,即主机发送数据;当最低位为1时,表示从机向主机通信,即从机发送数据。
3,被寻址的从机发送应答信号回应主机。同时反馈一个应答信号给主机确定是否收到信号。
4,发送器发送一个字节数据。其中第一步发送器必然是主机,接收器必然是从机。后续的发送器和接收器根据第2步的后续字节传送方向确定是主机向从机发送数据还是被寻址的从机向主机传送数据。
5,接收器发送应答信号回应发送器。(其中应答信号ACK可由master或者slave发出)。
........(循环执行步骤4和5)
n,通信完成后主机发送停止信号释放总线。
注意:
在I2C通信中,起始信号和停止信号表示完成了一次I2C通信过程,在其通信过程中,可以发送任意多个字节。
I2C总线在通信时每个字节为8位,且I2C是串行通信方式(即只有一根线),先传送最高位、再传送最低位。这与UART通信方式先发低位再发高位是相反的。且发送器再发送完一个字节数据后接收器必须发送1位应答信号给发送器,即一帧中总共有9位。
I2C的寻址方式如下图所示:
I2C时钟信号的作用:
注意:当时钟线SCL为0时,数据线SDA此时的数据允许被写入;当SCL为1时,数据线SDA的数据要保持稳定,此时接收器要从数据线上读取前面时钟线SCL为0时写入的数据。其中,当SCL和SDA空闲的时候两者为高电平。
1,定义:SPI是一种高速的、全双工、同步的串行通信总线。
SPI总线采用主从方式工作,一般有一个主设备和一个从设备或多个从设备;SPI至少需要四根线,分别为MISO(主设备输入从设备输出)、MOSI(主设备输出从设备输入)、SCLK(时钟)、CS(片选)。
2,寻址方式
在寻址方式中,主机主要是通过利用片选信号CS(即chip slave)来决定选择哪个从机进行通信。其中图中的CS1和CS2为主机发出的片选信号,CS为从设备接收片选信号的引脚。图中没有小圆圈的画法表示片选信号高电平有效。
3,通信过程
4,极性和相位
SPI总线在工作过程中有四种不同的工作模式,其取决于极性(CPOL)和相位(CPHL)两个因素。
其中,注意的是区分第一次到来的是上升沿还是下降沿,这取决于极性。如果极性为0,则第一次到来的是上升沿;如果极性为1,则第一次到来的是下降沿。对于相位而:如果相位为0,表示上升沿发送数据,下降沿读取数据;如果相位为1,表示下降沿发送数据,上升沿读取数据。
3,I2C通过向总线广播从机地址来寻址,SPI通过向对应的片选信号进行寻址。
4,I2C的时钟极性和时钟相位是固定的,SPI的时钟极性和时钟相位可调。
1.QSPI协议是什么?
QSPI协议实际是SPI协议的其中一种扩展,SPI协议包括了standard SPI 、dual SPI与queued SPI。而QSPI指的就是最后一种queued SPI。
由queued这个英文单词可知,QSPI和队列有关系。QSPI总线协议增强了队列传输机制,在其基础上增加了IO2/IO3两个外设接口。
2.QSPI 的传输模式
在QSPI接口命令中,QSPI通过命令与flash通讯,命令包括了:指令,地址,交替字节,空周期以及数据五个阶段,其中命令的传输模式可以设置为单线传输、双线传输以及四线传输。同时在上述命令的五个阶段中,每一个阶段均可跳过,但必须至少要包含指令、地址、交替字节或数据阶段之一。
其中想要更加了解QSPI四线传输模式的可参考以下链接:
http://第24章 QSPI—读写串行FLASH_xqhrs232的博客-CSDN博客_qspi读写 https://blog.csdn.net/xqhrs232/article/details/111629407?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165370780316782184654320%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165370780316782184654320&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-3-111629407-null-null.142^v11^pc_search_result_control_group,157^v12^control&utm_term=QSPI&spm=1018.2226.3001.4187
以及
http://QSPI协议详解(一)_Alfred.HOO的博客-CSDN博客_qspi https://blog.csdn.net/Michael177/article/details/121779374?ops_request_misc=&request_id=&biz_id=102&utm_term=QSPI&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-121779374.142^v11^pc_search_result_control_group,157^v12^control&spm=1018.2226.3001.4187
3.QSPI的功能框图
如上图所示:在QSPI中,相比于SPI其信号线有6根,分别是四根数据线 BK1_IO0~BK1_IO3,是时钟输出CLK,片选输出BK1_nCS。
3.在QSPI中,禁止使用双闪存模式。其工作模式主要有以下三种:
在间接模式下,主要通过写入QUADSPI寄存器来触发命令,并通过读写数据寄存器来传输数据,就像跟其他通信外设进行数据传输一样
若FMODE = 00,则 QUADSPI 处于间接写入模式,字节在数据阶段中发送到 Flash。
若 FMODE = 01,则 QUADSPI 处于间接读取模式,在数据阶段中从 Flash 接收字节。
在间接写入模式下,固件写入数据 时,将在 FIFO 中增加数据。
在间接读出模式下,固件写入数据 时,将在 FIFO 中移除数据。
其中,FIFO 的本质是RAM。
参考视频:
SPI、UART、RS232、RS485、IIC 5种嵌入式经典通信总线协议精讲「附赠课件资料&项目源码」_哔哩哔哩_bilibili