常见协议解析:IIC、SPI、UART和One-Wire详解

IIC协议

1.简介

IIC两线式串行总线,由数据线SDA和时钟线SCL构成,由于数据在同一条线上传输,因此IIC通信是半双工通信方式;

IIC使用多主从架构,每个器件都有唯一的识别地址,都可以作为一个发送器或接收器,这里的主从并没有绝对的概念,基本上谁控制时钟线谁就是主设备,此时从设备用于IIC的地址检测和停止位检测。

IIC传输速度:

        标准模式:100kbit/s

        快速模式:400kbit/s

        高速模式:3.4Mbit/s

术语 描述
主机 初始化发送、产生时钟信号和终止发送的器件
从机 被主机寻址的器件
多主机 同时有多于一个主机尝试控制总线,但不破坏报文
仲裁 是一个在有多主机同时尝试控制总线,但只允许其中一个控制总线并使报文不破坏的过程
同步 两个或多个器件同步时钟信号的过程

2.通信流程 

 1)主机发送一个1bit起始信号start;

2)发出一个7bit的地址,因为IIC可以有多个从设备,每个从设备出厂时有一个固定的设备地址,所以发出确定的地址来选择从设备;(既然有7位地址,那么理论上来说IIC总线可以接2^7个从设备,但实际上并不是,它差不多接5-6个设备,再接的话会由于电流等干扰造成不稳定)

3)发送1bit读写位,告诉从设备我是读取从设备的数据,还是写数据给从设备;

4)从设备回应,发送端每发送一个数据后,会在下一个时钟周期释放数据线接收对方的应答,当SDA是低电平时为有效应答(ACK),表示对方接收成功,当SDA是高电平时为无效应答(NACK),表示没有接收成功;

5)收到确认后开始发送一字节(8位)数据;

6)从机发送1bit确认位;

7)IIC的停止信号由主设备终止。

3.时序图解析 

3.1起始信号

 SCL信号为高电平阶段,SDA由高电平跳变到低电平,表示一个起始信号.

3.2 停止信号

 SCL为高电平阶段,SDA由低电平跳变到高电平,表示停止信号.

3.3 数据的有效性

IIC总线在进行数据传送时,在SCL的每个时钟周期传送一个数据为,为了保证传送数据的稳定性,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定,所以只有在时钟信号线SCL为低电平期间,数据线SDA的高低电平状态才允许变化;而根据上面的起始信号和停止信号的规定,SCL为高电平阶段,SDA的变化表示控制命令,即控制开始和结束信号;

 3.4 时序图案例

ACK应答信号 :在时钟信号SCL为低电平时,把数据线SDA设置为低电平,在时钟信号为高电平阶段保持不变;

ACK非应答:在时钟信号SCL为低电平时,把数据线SDA设置为高电平,在时钟信号为高电平阶段保持不变;

 4.注意点

4.1 延时

可以如下图所示时序图比上面多了4.7us的延时。

 4.2 IIC的高阻态

在上面的IIC总线拓扑图当中,可以看到SCL和SDA都需要接上拉电阻,用于保证数据的稳定性,减少干扰,大小由速度和容性负载决定,一般在3.3K到10K之间。

为了避免总线信号的混乱,IIC的空闲状态只能有外部上拉,此时空闲设备被拉到高阻态,相当于断路,整个IIC总线只有开启了的设备才会正常进行通信,而不会干扰到其它设备;要求各设备连接到总线的输出端必须是漏极开路(OD)输出或集电极开路(OC)输出;

漏极开路(Open Drain)即高阻状态,适用于输入/输出,可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻。

4.3 IIC空闲状态 

在主机传输完一个字节之后,应该要释放总线(协议规定,当SDA和SCL同时为时,表示空闲状态),因为这里要让出总线,使从机能发送一个应答信号,此时SDA数据线连接的IO口从输出模式转换成输入模式,这样才能拿到SDA数据线上的应答信号。

四线SPI协议

1.简介

SPI是一种同步串行接口技术,采用全双工同步通信,数据可以在两个方向同时进行收发操作。

与IIC类似,SPI也是采用主从方式工作(一主多从),主机通常为FPGA、MCU、或DSP等可编程控制器,从机通常为EPROM、Flash、AD/DA、音视频处理芯片等设备;

SPI是一个同步的数据总线,采用单独的数据线和单独的时钟信号来保证发送端和接收端的完美同步;

2.四线结构

SPI的四线结构分别是SS/CS、SC(L)K、MISO、MOSI。

SC(L)K:Serial Clock(Output from master);

MOSI:Master Output Slave Input(Outpt from Master);

MISO:Master Input Slave Output(Output from Slave);

CS:Slave Select(Active low,Output from Master);

 3. SPI四种工作模式

SPI有四种操作模式:模式0、模式1、模式2、模式3。

这几个模式之间的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(即时钟信号无效时是高还是低)。每种模式由两个参数描述,称为时钟极性CKP/CPOL(clock polarity)与时钟期CKE/CPHA(clock phase)。Mode = Bit[CPOL]Bit[CPHA]

CKP/CPOL=0表示 SCLK在空闲状态时为0;

CKP/CPOL=1表示 SCLK在空闲状态时为1;

CPHA=0表示 在SCLK第一个边沿时输入输出数据有效;

CPHA=1表示 在SCLK第二个边沿时输入输出数据有效;

 这样就组成如下四种时钟配置组合,其中黑色线为采样数据的时刻,蓝色线为SCLK时钟信号:

这四种时钟配置组合即组成四种模式:

SPI模式(Mode) 时钟极性 (CKP/CPOL) 时钟相位(CKE/CPHA)
0[00] 0 0
1[01] 0 1
2[10] 1 0
3[11] 1 1

3.1 时钟极性 CKP/Clock Polarity 

SPI主设备需要配置时钟极性,时钟极性和相位共同决定读取数据的方式,CKP可以配置为1或0,这意味着您可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。

根据硬件制造商命名规则不同,时钟极性通常写为CKP或CPOL。

3.2 时钟相位 CKE/Clock Phase(Edge)

SPI除了配置串行时钟速率和极性外,还要配置时钟相位(或边沿),也就是采集数据时是在时钟信号的具体相位或边沿。

根据硬件制造商命名规则不同,时钟极性通常写为CKE或CPHA。

3.3 命名规范

根据不同制造商的命名规则,

MISO也可以是SIMO、DOUT、DO、SDO、或SO(在主机端);

MOSI也可以是SOMI、DIN、DI、SDI或SI(在主机端);

CS也可以是NSS、SS、NSS、CE、SSEL;

SCLK也可以是SCK;

3.4 SPI四种模式时序具体解析

这四种模式中,应用最广泛的是Mode0[00]和Mode3[11],大多数SPI器件都同时支持这两种工作模式,但是具体采用什么模式,要看器件手册。

当CPOL=0时,串行时钟空闲状态为低电平;CPOL=1时,串行时钟空闲状态为高电平,此时通过配置时钟相位(CPHA)来选择具体的传输协议;当CPHA=0时,串行时钟的第一个跳变沿采集数据;当CPHA=1时,串行时钟的第二个跳变沿采集数据。

 

具体看一下模式0和3: 

 

模式1和2: 

4. SPI工作流程简介 

SPI主设备和从设备都有一个串行移位寄存器,主设备通过向它的SPI串行寄存器写入一个字节来发起一次传输。

 

CS为低电平时,表示对应的从机设备被使能,在每个SCLK时钟周期可以传输1bit数据,采样时刻取决于mode,需要注意在CS下降沿和SCLK第一个边沿,或CS上升沿和SCLK最后一个边沿留有一定的延时,一般是0.5个SCLK时钟周期。

具体通信流程:

主设备发起信号,将CS/SS拉低,启动通信;

主设备通过发送时钟信号来告诉从设备进行写数据或读数据(采集信号时机根据mode),然后立即读取数据线上的信号,得到一位数据;

主机将要发送的数据写到发送数据缓存区(Memory),缓存区经过移位寄存器,串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区;

从机也将自己的串行移位寄存器中的内容通过MISO信号线返回给主机,同时通过MOSI信号线接收主机发送的数据,这样两个移位寄存器中的内容就被交换;

注意:SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。若只进行写操作,主机只需忽略接收到的字节(虚拟数据);反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。 

5.SPI优缺点

优点

无起始位和停止位,因此数据位可以连续传输而不会被中断;

没有像I2C这样复杂的从设备寻址系统;

数据传输速率比I2C更高(几乎快两倍);

分离的MISO和MOSI信号线,因此可以同时发送和接收数据;

极其灵活的数据传输,不限于8位,它可以是任意大小的字;

非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

缺点

使用四根信号线(I2C和UART使用两根信号线);

无法确认是否已成功接收数据(I2C拥有此功能);

没有任何形式的错误检查,如UART中的奇偶校验位;

只允许一个主设备;

没有硬件从机应答信号(主机可能在不知情的情况下无处发送);

没有定义硬件级别的错误检查协议;

与RS-232和CAN总线相比,只能支持非常短的距离;

 6.多从机模式

6.1 多NSS

通常,每个从机都需要一条单独的SS线。

如果要和特定的从机进行通讯,可以将相应的NSS信号线拉低,并保持其他NSS信号线的状态为高电平;如果同时将两个NSS信号线拉低,则可能会出现乱码,因为从机可能都试图在同一条MISO线上传输数据,最终导致接收数据乱码。具体连接方式如下图所示:

6.2 菊花链

 在数字通信世界中,在设备信号(总线信号或中断信号)以串行的方式从一 个设备依次传到下一个设备,不断循环直到数据到达目标设备的方式被称为菊花链

菊花链模式充分使用了SPI其移位寄存器的功能,整个链充当通信移位寄存器,每个从机在下一个时钟周期将输入数据复制到输出。

菊花链的最大缺点是因为信号串行传输,所以一旦数据链路中的某设备发生故障的时候,它下面优先级较低的设备就不可能得到服务了;

另一方面,距离主机越远的从机,获得服务的优先级越低,所以需要安排好从机的优先级,并且设置总线检测器,如果某个从机超时,则对该从机进行短路,防止单个从机损坏造成整个链路崩溃的情况;具体的连接如下图所示:(其中红线加粗为数据的流向)

 

Uart协议 

1.简介

 UART全称:异步收发传输器;可以实现全双工传输和接收;

UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;因此通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(TX和RX)就可以完成通信过程,因此也被称为异步串行通信

我们日常所使用到的RS232、RS485等总线,其内部使用的基本都是UART协议。

2.UART数据包封装

2.1 uart数据传输格式

 

2.2 空闲位

空闲状态时为高电平1,设备之间不传输数据时以持续的高电平表示空闲

2.3 起始位

Uart没有控制线,数据传输中只有一根线,所以需要有起始位作为数据发送的起始标志。

UART接收端会一直检测信号线上的电平变化,开始传输数据时,发送端在一个时钟周期内将信号线从高电平拉到低电平结束空闲状态,并保持一个bit位的时长,接收器检测到高低电平转换时开始以波特率的频率读取数据位中的每一位数据。

2.4 数据位

默认无传输数据时,为高电平;

数据位包含传输的实际数据,如果使用了奇偶校验,那么数据位长为5~8 bits,就是可以传输这么多个值为0或者1的bit位;如果没有使用奇偶校验,则位长为5~9 bits。

在一般情况下,数据位为 8 bits,数据首先从最低有效位开始发送,高位在后。例如:发送数据为0x55(01010101),则发送的数据为(10101010)

 

2.5 校验位

校验位可以用来提高传输的可靠性。采用奇偶校验方式,但可以设置存在或不存在。

2.6 停止位

它是一个字符数据的结束标志,停止位表示一帧数据的结束,实际信号是一段时间的高电平,可以是1位、1.5位、2位的高电平。因为UART是一个异步协议,每一帧的开头可以用跳变沿来同步,但是停止位只能通过波特率来计算相对位置,如果在停止位的位置识别到一个低电平,则会产生帧错误。在通讯过程中,为了减少波特率的误差导致的问题,可以设置不同的停止位长度来适配。

由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容错性越好,但是数据传输率同时也越慢。

3.UART通信步骤

1)数据从数据总线到发送器;

2)发送UART 将起始位、奇偶校验位和停止位添加到数据帧;

3)从起始位到结束位,整个数据包以串行方式从发送器至接收器,接收UART,以预配置的波特率对数据线进行采样;

 

4)接收器丢弃数据帧中的起始位、奇偶校验位和停止位;

5)接收器将串行数据转换回并行数据,并将其传输到接收端的数据总线;

3.1 发送数据过程 

发送数据过程:空闲状态,线路处于高电平;当收到发送指令后,拉低线路的一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送完成。

3.2 数据接收过程

数据接收过程:空闲状态,线路处于高电平;当检测到线路的下降沿(高电平变为低电平)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备接收数据或存入缓冲。

3.3 数据接收时序

由于UART是异步传输,没有传输同步时钟,为了保证数据的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。

 UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这是计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第一位数据,依次类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,数据接收完成。

4.UART优缺点

优点:

有奇偶校验位,方便通信的差错检查;

无需时钟信号;

通信只需两条数据线(TX和RX),结构简单;

缺点:

数据帧最大支持9位数据;

不支持多主机或多从机的主从系统;

串口使用TTL电平(高低电平用0和1表示),抗干扰能力差,从而导致通信距离短;

参考:

最详细的 UART协议 分析在这里!_梦源科技的博客-CSDN博客(使用逻辑分析仪,顶)

UART协议_甘山流水的博客-CSDN博客(对RS422/232/485以及TTL讲的多)

UART协议讲解_Polaris!的博客-CSDN博客(其中UART的TTL电平标准讲的可)

One-wire协议

1.简介

与SPI、I²C串行数据通信方式不同,它采用单根信号线传输。 这种协议由一个总线主节点、或多个从节点组成系统,通过根信号线对从芯片进行数据的读取。每一个符合OneWire协议的从芯片都有一个唯一的地址,包括48位的序列号、8位的家族代码和8位的CRC代码。

主芯片根据64位寻址对各个芯片进行双向通信,因此其协议对时序的要求较严格,初始化、写bit或读bit都有严格的时序要求,但是位于位之间没有严格要求

1-Wire数据传输的次序为从最低位到最高位,与I2C不同

OneWire是美信(Maxim)开发的一种单总线通信接口,一根双向数据线,还有一根共同电压参考地线。
低速(15kbps),串行半双工通信
可以支持100米长距离通信
单主多从总线结构,最多支持63个从机挂接在同一个总线上。
总是由主机发起通信过程,从机是被动参与通信。
每个字节数据传输时,位按照LSB顺序
每个OneWire从机都有一个出厂就设定好的,固化在ROM中的不可更改的64位器件唯一ID。

1.1 传输速度

单总线的数据传输速率一般为16.3Kbit/s,最大可达142 Kbit/s,通常情况下采用100Kbit/s以下的速率传输数据。主设备I/O口可直接驱动200m范围内的从设备,经过扩展后可达1km范围

1.2 单总线应用

目前,单总线器件主要有数字温度传感器(如DS18B20)、A/D转换器(如DS2450)、门标、身份识别器(如DS1990A)、单总线控制器(如DS1WM)等。

1.3 硬件构成

单总线系统只有一条信号线,因此每一个总线上的器件必须是漏极开路或者三态输出0、1、高阻态

1-Wire线端口为漏极开路构或三态门的端口,因此一般需要加上拉电阻Rp,通常选用5K~10KΩ(典型值为4.7K),因此总线空闲时为高电平。总线使用“线与”逻辑,只要一个设备拉低了总线,总线将变为低电平。

 

复习一下模电—-MOS管

 

 漏极开漏电路如下

 

 这是一个集成了二极管的MOS管,源极连接二极管

当二极管导通时,MOS管漏极接地

此时若MOS管导通,则输出口被拉至低电平0,当MOS管断开,输出口被上拉电阻拉至高电平1

当二极管断开时,MOS管漏极不接,此时输出口不受输入电路控制,呈现高阻态

OneWire电路


 单总线的空闲状态为高电平,总线如果需要暂停某一执行过程时,如果想要恢复执行,总线必须停留在空闲状态,单总线处在高电平下时间可以无线长,但当总线停留在低电平超过480us时,总线上所有的器件都将被复位.

 2.总线上的基本信号与时隙

主流发送reset信号,接收从机响应的presence信号

主机发送逻辑0和逻辑1到总线

主机从总线读取逻辑0和逻辑1

2.1初始化时序 

主机发送复位信号并接收存在信号:
为了开启一次通信事物,主机必须先发送总线复位信号(reset signal),第一个目的是为了唤醒并通知所有从机,另一个目的是为了检查总线上是否有从机存在。当从机收到复位信号后,他们将同步进行响应一个存在信号(presence signal),主机收到存在信号才知道总线上有从机存在,可以开始选中某个从机进行通信。

总线上的所有通讯均从初始化序列开始,主机持续输出低电平使总线保持低电平在(480us-960us),这样可以产生一个复位脉冲

之后主机释放总线,总线被拉高置高电平15-60us以进入接收模式接收应答;

从机拉低总线60-240us以产生低电平应答脉冲;

 

 2.2 写时序

写时序时总线被主机拉低15us左右然后释放总线,总线被拉至高电平

写时序有写1和写0,写时序至少要60us,相邻的两次写时序直接要间隔2us的恢复时间

两种写时序均起始于主机拉低低电平

在发出写时序15us后,主机发送要传输的数据,从机会在总线上进行采样

写间隙有两种,包括写0的时间隙和写1的时间隙
当数据线拉低后,在15 ~ 60 us的时间窗口内对数据线进行采样。如果数据线为低电平,就是写0,如果数据线为高电平,就是写1。
主机要产生一个写1时间隙,就必须把数据线拉低,在写时间隙开始后的15 us内允许数据线拉高(即在0~15us内释放总线)。主机要产生一个写0时间隙,就必须把数据线拉低并保持60 us。

 主机写逻辑0时隙:

写“0”时隙的起始信号是主机将总线拉低,且至少维持60us(这个时间是为了保证从设备能来得及采样总线上的信号)。然后主机释放总线,等待总线在上拉电阻作用下恢复高电平状态,然后才能进行下一个bit的传输。等待总线恢复高电平的时间用TREC表示,最低为1us,最长为无穷大。

 

主机写逻辑1时隙:

写“1”时隙的起始信号是主机将总线拉低,且至少维持1us,然后主机释放总线,总线在上拉电阻作用下恢复高电平状态,从拉低到恢复高电平要在15us内完成。然后等待从设备采样,等待时间最低持续15us,最长持续45us。当然,如果主机愿意,它可以等待更长的时间。

 

 2.3 读时序

主机读逻辑0和读逻辑1时隙
每个读时隙至少持续60us并附加一个至少1us的TREC时间。

起始信号同样是主机先将总线拉低至少1us,然后主机释放总线。接下来准备读取从设备发送到总线上的信号。从设备在检测到下降沿后,便开始将信号输出到总线上并维持15us的时间。因此主机从拉低总线然后读取数据要在15us内完成。如果主机读取到总线是低电平,则读取到了逻辑0;如果主机读取到总线是高电平,则读取到了逻辑1。

 

所有读时序最少60us,当主机把数据线从高电平拉到低电平时产生读时序

读时序产生后主机要保持1us后释放总线,此时从机通过控制数据线高低来输出0&1

主机在读时序后的15us内采样总线状态

当传输逻辑0结束后(45us后),总线将被释放,通过上拉电阻产生一个上升沿脉冲

单总线器件要在主机发出了读时序以后才能传输数据,因此在主机发出读数据命令时要再产生读时序才能命令从机传输数据

3.One-wire优缺点

优点:

单总线既传输时钟又传输数据,而且数据传输是双向的,具有节省I/O口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点。

支持多个设备共享同一条总线;

 支持热插拔;

支持长距离传输;

支持数据加密等。

缺点: 

通信速度较慢;

不支持多主机

4.参考文章 

文章1:爆改串口实现OneWire驱动DS18B20_onewire协议_哈士奇上蔚的博客-CSDN博客

文章2:基于OneWire通讯协议驱动DS18B20温度传感器笔记-CSDN博客

文章3:【通信协议】1-Wire 单总线_单总线通信_淹死的大白鲨的博客-CSDN博客

物联沃分享整理
物联沃-IOTWORD物联网 » 常见协议解析:IIC、SPI、UART和One-Wire详解

发表评论