数码之家

 找回密码
 立即注册
搜索
查看: 2433|回复: 21

学习一下常用的串行通信协议(UART/IIC/SPI)

[复制链接]
发表于 2022-9-1 21:15:55 | 显示全部楼层 |阅读模式
本帖最后由 jf201006 于 2022-9-1 21:22 编辑

神兽归笼,有时间整理一下学习心得。
通信协议(communications protocol)是指双方实体完成通信或服务所必须遵循的规则和约定。协议定义了数据单元使用的格式,连接方式,信息发送和接收的时序,从而确保数据顺利地传送到确定的地方。
“通信协议”是一个很宽泛的概念,拿OSI(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层)来说,每一层都有对应的协议,我们所说的串口、Modbus、CAN等对应在不同的层次。很多人觉得很高深、很复杂。其实可以这样理解:设备之间不同的通信协议相当于人类之间不同的交流语言。通信协议是指通信各方事前约定的通信规则,可以简单地理解为各通信设备之间进行相互会话所使用的共同语言。两设备在互相进行通信时,必须使用的通信协议。就好比广东人说粤语、内蒙人说蒙语,要想要直接交流显然是不行的,大家必须使用普通话才能进行交流。
通信协议主要由以下三个要素组成:
语法:即如何通信,包括数据的格式、编码和信号等级(电平的高低)等。
语义:即通信内容,包括数据内容、含义以及控制信息等。
时序:即何时通信,明确通信的顺序、速率匹配和排序。
在单片机中常见的通信协议有UART/USART协议、IIC(也可写作I2C)通信协议、SPI通信协议、CAN通信协议等。
下面分三个部分简单讲解并用逻辑分析仪观察一个时序

第一部分:UART串口通信
第二部分:IIC总线通信
第三部分:SPI通信
******************************************************
第一部分UART串口通信
UART (Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,通常称作UART,是一种通用的串行异步全双工数据收发传输器(总线)。作用是把“要传输的数据”在串行通信与并行通信之间转换。UART作为一种通用串行数据总线,多用于异步通信。UART管脚定义:TX、RX、GND,在TX脚上进行发送数据,在RX脚上进行收取数据,所以该总线是双向通信,可以实现全双工收发。在嵌入式领域,作为把并行信号转成串行信号的硬件设备,UART通常被集成于MCU内部。相对于异步还有通用同步收发传输器USART(UniversalSynchronous Asynchronous Receiver and Transmitter),从名字上可以看出,USART在UART基础上增加了同步功能,即USART是UART的增强型。其实当我们使用USART在异步通信的时候,它与UART没有什么区别,但是用在同步通信的时候,区别就很明显了。大家都知道同步通信需要时钟来触发数据传输,也就是说USART相对UART的区别之一就是能提供主动时钟。USART管脚定义:TX、RX、GND、SCLK。一、UART通信协议UART作为异步串口通信协议的一种,工作原理是利用一条传输线将将传输数据的每一个字符一位(bit)一位地传输。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。先看一个1个起始位,7个数据位,1个校验位,1个结束位的传输情况:
1、波特率(BaudRate)每秒传送的字节数,单位“字节每秒” bps(Byte Per Second)。此参数容易和比特率混淆,其实他们是由区别的。具体可以问度娘。个人认为在UART中的波特率就是比特率(Bit Rate),即每秒传输的位数(bit),单位为“位每秒”( bits/s, b/s)。当写作bps(bit Per Second)时,“b” 应该小写,以避免与“字节每秒”(Bytes/s, B/s)混淆。一般选波特率都会有9600,19200,115200等选项。其实意思就是每秒传输这么多个比特位数(bit)。默认为9600.看一下逻辑分析仪采用9600波特率采集的数据
图中,1bit的脉宽为0.104ms,1秒可以传送(1000/0.104=)约9615个bits。2、起始位:先发出一个逻辑“0”的信号,表示传输字符开始。3、数据位:紧接着起始位之后。数据位的个数可以是4、5、6、7、8等,表示一帧可以传输这么多个值为0或者1的bit位,从而构成一个字符。通常采用ASCII码。一般是从。4、奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以次来校验数据传送的正确性。以传输“A”(01000001)为例。(1)、当为奇数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数(奇校验)。(2)、当为偶数校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数(偶校验)。(3)、此位还可以去除,即不需要奇偶校验位。5、停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高(空闲)电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也就越慢。6、空闲位:没有数据传输时线路上的电平状态。为逻辑“1”状态,表示当前线路上没有数据传输。7、传输方向:即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。比如传输“A”如果是MSB那么就是01000001,如果是LSB那么就是10000010。默认为LSB。8、uart传输数据顺序:刚开始传输一个起始位,接着传输数据位,接着传输校验位(可不需要此位),最后传输停止位。这样一帧的数据就传输完了。接下来接着像这样一直传送。在这里还要说一个参数。9、帧间隔:即传送数据的帧与帧之间的间隔大小,可以以位为计量也可以用时间(知道波特率那么位数和时间可以换算)。注:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)
下面用逻辑分析仪感性认识一个标准的10位异步串行通信协议(1个起始位、1个停止位和8个数据位)收发时序:
二、用逻辑分析仪观察
逻辑分析仪有不同的品牌,但基本设定都是差不多的。逻辑分析仪的两个基本指标:采样率和采样深度1、采样深度:对被测信号一次采集的样点总数。它直接决定了一次采样所能采集到的数据量的多少,显然深度越大,一次采集的数据量越大。2、采样率:也叫采样速率,对被测信号进行采样的频率,也就是每秒所采集的样点数。它直接决定了一次采样结果的时间精度,采样率越高,时间精度越高。一次采样结果的时间精度就等于“1/采样率”,即一个采样周期。一次采样过程所持续的时间为“采样深度÷采样率”,那么在进行采样之前,就要对被测信号有一个大概的评估:最高频率是多少、需要采集多长时间的数据等,然后由被测信号最高频率来选择采样率,原则是“采样率至少达到被测信号最高频率的10倍以上”,倍数越高采样的时间精度就越高。但采样率也不是越高越好,因为在同样采样深度下,采样率越高一次采样所能采集的时间就越短,所以还要综合考虑所需要的采样时间,在同时满足二者最低需要的情况下留有适当的余量即可。这个在软件上有设置的
在软件中,添加异步串行协议
随后就会进行协议的设置
触发开始采样的条件有四种
设置好后,等待信号进来
简单使用串口调试精灵来发送数据
采样中
采样后的情况
当然也可以先进行采样,后添加协议进行解码
解码可以以十六进制、十进制、二进制、ASCII码显示
还可以用十六进制和ASCII码同时显示
再来两个ASCII码显示的
比较两个不同波特率(9600和38400)的传输速度同样的6个字符,9600波特率需要6ms
38400波特率需要1.5ms
接下来看下同一个COM口收到数据后再转发出去的情况
不同的逻辑分析仪功能设置差不多,好一点的可使用的协议会多一些
这是另外一种逻辑分析仪观察的情况
附上ASCII码表

******************************************************
第二部分IIC总线通信
一、IIC通信原理I2C 总线在物理连接上非常简单,由一条数据线(SDA)、一条时钟线(SCL)和上拉电阻组成。设备分主从,主设备提供时钟,并发起操作。
通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。
I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信。
二、IIC通信特征
I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址,主从设备之间就通过这个地址来确定与哪个器件进行通信,一般情况下,我们把MCU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。主设备与从设备之间以字节(8位)为单位进行双向的数据传输。
I2C数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
逻辑分析仪观察到的,每秒可传输444个bit
三、IIC总线协议先看一下逻辑分析仪的解码设置
一桢数据如下
IIC协议解释:
1、起始(S):数据的传输必须以一个起始信号作为开始条件,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;2、停止(P):数据传输完成后以一个结束信号作为传输的停止条件,当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。起始和结束信号总是由主设备产生。
3、空闲状态:SCL和SDA都保持着高电平。一旦起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。4、传输顺序:MSB,从高位到低位的顺序传输。
5、应答(ACK):主设备在在SDA线上数据传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位,此时才认为一个字节真正的被传输完成。当然,并不是所有的字节传输都必须有一个应答位,比如:当从设备不能再接收主设备发送的数据时,从设备将回传一个否定应答位(NAK)。下图可以表示出应答信号是从设备发出的:
6、数据传输方向:总线上地址的最后1位(bit)确定,1为读;0为写。主设备在传输有效数据之前要先指定从设备的地址,地址指定的过程和上面数据传输的过程一样,只不过大多数从设备的地址是7位的,然后根据协议,再从设备地址添加一个最低位,用来表示接下来数据传输的方向,1表示主设备读取设备的读数据;0表示主设备写数据到从设备。
向指定设备发送数据的格式如图所示:(每一最个小包数据由9bit组成:8bit数据+1bit的ACK;如果是地址数据,则8bit数据中包含最后1bit方向)
下图中灰色表示主设备占用SDA线;白色表示从设备占用SDA线
下图是一次I2C数据:
逻辑分析仪观察到的一个数据包,同时推断出设备地址是3F,写入两个字节:0x80和0xAF。
四、总线操作以主机向从机写数据为例,其基本结构如下图所示,依次为:起始信号—>从机地址—>读写信号—>数据位—>应答位—>… … —>停止位

******************************************************
第三部分:接口通信
SPI(Serial Peripheral Interface)串行外围设备接口,是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。SPI是一种高速的、全双工、同步通信总线,标准的SPI使用4个引脚,常用于单片机和EEPROM、FLASH、实时时钟、数字信号处理器等器件的通信。一、SPI通信硬件的组成SPI通信原理比I2C要简单,它主要是主从方式通信。这种模式通常只有一个主机和一个或者多个从机,标准的SPI是4根逻辑线,分别是MISO、MOSI、SCLK和SS。定义如下:MISO:Master input slave output 主机输入,从机输出(数据来自从机);MOSI:Master output slave input 主机输出,从机输入(数据来自主机);SCLK :Serial Clock 串行时钟信号,由主机产生发送给从机;SS:Slave Select 片选信号,由主机发送,以控制与哪个从机通信,通常是低电平有效信号。
不同制造商可能会遵循其他命名规则,但都指的是相同的含义。以下是一些常用术语:
MISO也可以是SIMO,DOUT,DO,SDO或SO(在主机端);
MOSI也可以是SOMI,DIN,DI,SDI或SI(在主机端);
SS也可以是NSS,CE,CS或SSEL;
SCLK也可以是SCK。
在某些情况下,也可以用3根线或2根线的SPI进行通信。比如主机只给从机发送命令,从机不需要回复数据的时候,那么MISO就可以不要;而在主机只读取从机的数据,不需要给从机发送指令的时候,那MOSI就可以不要。
当一个主机一个从机的时候,从机的片选有时可以固定为有效电平而一直处于使能状态,那么SSEL就可以不要;此时如果再加上主机只给从机发送数据,那么SS和MISO都可以不要;如果主机只读取从机送来的数据,SS和MOSI都可以不要。但是当我们提及SPI的时候,一般都是指标准SPI,4根线的这种形式。
下图是LCD(ST7565)使用3线通信的片断
二、SPI中数据的传输
两个 SPI 设备之间通信必须由主设备来控制从设备。主机会根据将要交换的数据来产生相应的时钟信号(Clock),时钟信号通过时钟极性(CPOL,Clock Polarity)和时钟相位(CPHA,Clock Phase)控制着两个SPI设备间何时数据交换以及何时对接收到的数据进行采样,来保证数据在两个设备之间是同步传输的。
SPI 设备间的数据传输之所以又被称为数据交换,是因为 SPI 协议规定一个 SPI 设备不能在数据通信过程中仅仅只充当一个“发送者(Transmitter)”或者“接收者(Receiver)”。在每个时钟周期内,SPI 设备都会发送并接收1bit的数据,相当于该设备有1bit的数据在主机与从机之间交换了。
从时序上看,有时钟时,MISO线和MOS线都是有数据的。
举个栗子:假设主机和从机初始化就绪,时钟上升沿发送数据,并且主机移位寄存器里的数据是0xaa,从机的移位寄存器里的数据是0x55,下图中可见 8个时钟周期后,主从机的移位寄存器里数据进行了交换。
SPI通信中只有主模式和从模式之分,没有读和写的说法,主机对外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输(实际上是需要主机发出时钟信号)。也就是说,主机发一个数据必然会收到一个数据;而主机要收一个数据必须也要先发一个(虚拟)数据。三、SPI通信的四种模式SPI的四种模式,简单地讲就是设置时钟信号线SCLK的有效状态。SPI通信有4种不同的操作模式,不同的从机可能在出厂是就是配置为某种模式,这是不能改变的;通信的双方必须是工作在同一模式下,所以我们可以查阅从机的手册来确定芯片使用了什么模式,从而对主机的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主机的通信模式,具体如下:时钟极性(CPOL)定义了时钟空闲状态电平:CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时时钟相位(CPHA)定义数据的采集时间。CPHA=0,在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。,在第2个边沿发送数据CPHA=1,在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。,在第1个边沿发送数据
每个模式的时序如下
以上SPI总线通信协议的主要内容。没有规定最大传输速率,没有地址方案,也没规定通信应答机制,没有规定流控制的规则。只要四根信号线连接正确,SPI模式相同,将SS信号线拉低,即可以直接通信,一次一个字节的传输,读写数据同时操作,这就是SPI一些通信控制都得通过SPI设备自行实现,SPI并不关心物理接口的电气特性,例如信号的标准电压。四、使用逻辑分析仪观察几个信号先配置逻辑分析仪的协议
上图的配置将使用模式0采样
观察到一桢(8bit)数据
下面使用SPI读取一个FLASH数据时捕获的数据片断
下面是读取Atmega328熔丝位时捕获的数据片断

以上粗浅认识,大咖勿喷
谢谢观赏!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 12家元 +230 收起 理由
IlovePLC + 30 優秀文章
wikiqian + 20 非常好的入门知识
bobowu + 20
jevenli + 20 優秀文章
玛德陛下 + 20 謝謝分享
xz_zsz + 20 謝謝分享
qrut + 10 m没的好快只剩10m了
亲爱的混蛋 + 20
kkdkj + 10 好贴好贴!
stdzlqz + 20 優秀文章

查看全部打赏

发表于 2022-9-1 21:56:55 | 显示全部楼层
我是来学习的

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-1 21:57:38 | 显示全部楼层
知识帖,这个看起来很不错。

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-1 22:06:51 | 显示全部楼层
8路逻辑分析仪吗?

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享 是的

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-1 23:27:00 | 显示全部楼层
知识帖,楼主用心了。

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-2 11:19:45 | 显示全部楼层
好贴好帖可以加精了

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-2 18:10:36 | 显示全部楼层
帖子很详细啊,n年前用51软件模拟i2c也是一点儿一点儿看协议手册去调~

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2022-9-3 09:48:57 | 显示全部楼层
这个有点专业看不明白啊

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-3 09:58:36 | 显示全部楼层
楼主总结的很全面!学习!

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-4 14:29:04 来自手机浏览器 | 显示全部楼层
我也是来学习的

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-8 18:24:17 | 显示全部楼层
谢谢分享,很好的学习贴。

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-9 03:08:23 来自手机浏览器 | 显示全部楼层
虽然看不懂,但是那些通讯电源的CAN通讯用蓝牙连接调试估计就是这样破解的通讯协议

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-16 17:28:14 | 显示全部楼层
满满的硬货,深入浅出,图文并茂的介绍了几种常用的通信方式。

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-17 16:08:20 | 显示全部楼层
系统,详尽,谢过。

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-18 10:34:51 | 显示全部楼层
谢谢分享,很好的学习贴。

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-18 14:24:12 | 显示全部楼层
学习一下,谢谢分享。。。

打赏

参与人数 1家元 +6 收起 理由
jf201006 + 6 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2022-9-27 13:00:54 | 显示全部楼层
感谢师傅分析
回复 支持 反对

使用道具 举报

发表于 2022-10-16 11:15:57 | 显示全部楼层
虽然一时学不透,收藏备用,遇到时可以细细学。
回复 支持 反对

使用道具 举报

发表于 2022-10-22 22:12:27 | 显示全部楼层
IIC有什么方案转usb接口?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-25 07:54 , Processed in 0.639601 second(s), 31 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表