嵌入式开发的通信协议

嵌入式开发的通信协议

串行通信

将数据字节分成一位一位的形式在一条传输线上逐位地发送。
嵌入式开发的通信协议
优点:成本低,控制复杂

异步通信

异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。 异步通信的两个关键:
第一,数据单元——帧,它是双方约定好的数据格式;
第二,波特率,它决定了‘帧’里每一位的时间长度。
嵌入式开发的通信协议
异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。
注:波特率表示每秒传送的字符数,是UART协议中的一个关键数据,即发送数据的速度;
发送器和接受器的波特率应该匹配,通常,我们将波特率定为9600或115200。

同步通信

在数据传输过程中,需要一根时钟线同步,如 IIC总线,SPI总线 。

UART

定义

UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。

UART通信方式

1.起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
2.数据位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。
3.奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
4.停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
5.空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。

UART与COM口的区别

【1】UART,COM指的物理接口形式(硬件), 而TTL、RS-232是指的电平标准(电信号).
【2】UART有4个pin(VCC, GND, RX, TX), 用的TTL电平, 低电平为0(0V),高电平为1(3.3V或以上)。
嵌入式开发的通信协议
COM口是我们台式机上面常用的口(下图),9个pin, 用的RS232电平, 它是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平
嵌入式开发的通信协议
【3】接设备的时候,一般只接GND RX TX。不会接Vcc或者+3.3v的电源线,避免与目标设备上的供电冲突。
【4】我们常用UART口进行调试,但是UART的数据要传到电脑上分析就要匹配电脑的接口,通常我们电脑使用接口有COM口和USB口(最终在电脑上是一个虚拟的COM口),但是要想连上这两种接口都要需要进行硬件接口转换和电平转换。
(1) 如果连接电脑COM口, 需要一个类似下图的转换小板, 它实现了TTL电平和RS232电平互转, 我之前使用过, 但是现在很少用了。
嵌入式开发的通信协议
如果要连接USB接口, 需要类似下面的小板, 它实现了TTL电平和USB电平的转换, 这种使用的较多。
嵌入式开发的通信协议

SPI

定义

SPI是一种高速的,全双工,同步的通信总线;
全双工:可以同时接收和发送数据。
同步:接收端和发送端必须在同一时刻接收和发送。
简单的主从SPI连接图
嵌入式开发的通信协议

接口

SCLK:串行时钟,用来同步数据传输,由主机输出
MISO:主机输入从机输出(Master In Slave Out)
MOSI:主机输出从机输入(Master Out Slave In)
CS:片选线,低电平有效,由主机输出
在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机。这就要求从机的MISO口具有三态特性,使得该口线在器件未被选通时表现为高阻抗。

SPI的相位和极性

在SPI操作中,最重要的两项设置就是时钟极性(CPOL)和时钟相位(CPHA)。
时钟极性设置时钟空闲时的电平,时钟相位设置读取数据和发送数据的时钟沿。
主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的。所以为了保证主从机正确通信,应使得它们的SPI具有相同的时钟极性和时钟相位。
CPOL极性:
当CPOL为0时,SCLK在空闲时为低电平,有效时即为高电平即active-high;当CPOL为1时,SCLK空闲时为高电平,有效时为低电平即active-low。
SCLK时钟的空闲时刻指的是当SCLK在发送8个bit比特数据之前和之后的状态,
与此对应的,SCLK在发送数据的时候,就是正常的工作的时候即有效active的时刻。
CPHA相位:
当CPHA为0时,在SCLK的前一边沿采样,后一边沿输出。当CPHA为1时,在SCLK的前一边沿输出,后一边沿采样。
CPOL=0时
【1】CPHA=0时,第一个边沿就是从低变到高,所以是上升沿;
【2】CPHA=1时,第二个边沿就是从高变到低,所以是下降沿;
CPOL=1时
【1】CPHA=0时,第一个边沿就是从高变到低,所以是下降沿;
【2】CPHA=1时,第二个边沿就是从低变到高,所以是上升沿;
嵌入式开发的通信协议

如何看懂和记忆CPHA和CPOL

首先看时序图,如果时钟SCLK的起始电平是0,那么CPOL=0,如果是1,那么CPOL=1。
然后看数据采样时刻,即时序图数据线上的数据矩形区域的中间所对应的位置,对应到上面SCLK时钟的位置,对应着是第一个边沿或是第二个边沿,即CPHA是0或1。(对应的是上升沿还是下降沿,要根据对应的CPOL的值,才能确定)。
嵌入式开发的通信协议

软件中如何设置SPI的极性和相位

【1】固定的,设备硬件决定
SPI从设备,具体是什么模式,相关的datasheet中会有描述,需要自己去datasheet中找到相关的描述,即:
关于SPI从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL是0还是1;
然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了CPOL的值的前提下,对应着可以推算出CPHA是0还是1了。如AD7928(自我认为)
【2】可配置的,由软件自己设定

数据传输

在一个SPI时钟周期内,会完成如下操作:
1) 主机通过MOSI线发送1位数据,从机通过该线读取这1位数据;
2) 从机通过MISO线发送1位数据,主机通过该线读取这1位数据。
这是通过移位寄存器来实现的。如图2所示,主机和从机各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。
嵌入式开发的通信协议

SPI优缺点

优点:1) 支持全双工操作;2) 操作简单;3) 数据传输速率较高
缺点:1) 需要占用主机较多的口线(每个从机都需要一根片选线);2) 只支持单个主机。

I2C

有关I2C的一些问题

【1】我了解的I2C
I2C总线是飞利浦(PHLIPS)公司推出的一种串行总线,用于连接微控制器及其外围设备, I2C串行总线有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。 它仅通过两根信号线就可以完成对所有挂载在I2C总线上的从器件进行操作。这样的好处是可以大大的节省我们微处理器的IO口资源。
【2】I2C可以挂载多少个器件
IIC协议规定,在启动总线后第1字节的高7位是从节点的寻址地址,其中高四位为器件类型识别符,接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作,所以具体挂载多少个器件由I2C地址决定,7位寻址地址减去1个广播地址0x00不用,所以有2^7=128 - 1 = 127,那就是127个地址, 所以理论上可以挂127个从器件。
【3】I2C如何同时挂载多个同一种器件(地址相同的器件)?
理论上是不会这样设计的,如果一定要这样做的话,可以通过硬件上设计,控制器件是否挂载总线来实现(方法可用一个开关电路切断器件SDA或者SCL是否接入总线来实现)
【4】I2C总线的主机与从机之间是如何通信的呢?
I2C总线的主机与从机之间的通信主要和I2C的时序有关。在通信开始的时候SCL与SDA都置为高电平,此时为总线空闲时间。当SCL为高电平期间SDA的电平被拉低,标志这总线的启动。当SCL为高电平期间SDA的电平被拉高,标志这总线的终止。在进行数据传送时,SCL为高电平期间,SDA上的数据必须保持稳定,只有在SCL的信号为低电平时,SDA上的高电平才允许变化。所以只要我们根据芯片手册正确的写好IIC的时序,按时序发送器件地址(不同的器件的地址不同)以及数据,就可以使主机与从机之间通信。
【5】介绍一下I2C总线上的仲裁
总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况,这种情况叫做总线竞争。I2C总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。由于是利用I2C总线上的信息进行仲裁,因此不会造成信息的丢失。

基本过程

1.主机发出开始信号
2.主机接着发出一字节的从机地址信息,其中最低位为读写控制码(1为读、0为写), 高七位为从机器件地址
3.从机发出应答信号
4.主机开始发送信号,每发完一字节后,从机发出应答信号给主机
5.主机发出停止信号
嵌入式开发的通信协议
注解:
【1】 开始信号:在时钟线为高电平期间,数据线由高变低,将产生一个开始信号
【2】 停止信号:在时钟线为高电平期间,数据线由低变高,将产生一个停止信号
【3】 应答信号:主机写从机时,每写完一个字节,如果正确从机将在下一个时钟周期将数据线拉低,以告诉主机操作有效。在主机读从机的时候,正确读完一个字节后,主机在下一个时钟周期同样也要将数据线拉低,发出应答信号,告诉从机所发数据已经收妥(注:读从机时主机在最后一个字节数据接收完后,不发应答,直接发停止信号)
注意:任何在时钟线为高电平期间的数据线上的电平改变都被认为是起始和停止信号,所以数据改变必须要在时钟为低电平时改变。

I2C总线的注意事项

【1】进行数据传送时,在SCL为高电平期间,SDA线上电平必须保持稳定,只有SCL为低时,才允许SDA线上电平改变状态。并且每个字节传送时都是高位在前。
【2】对于应答信号,ACK=0时为有效应答位,说明从机已经成功接收到该字节,若为1则说明接受不成功。
【3】如果从机需要延迟下一个数据字节开始传送的时间,可以通过把SCL电平拉低并保持来强制主机进入等待状态。
【4】主机完成一次通信后还想继续占用总线在进行一次通信,而又不释放总线,就要利用重启动信号Sr。它既作为前一次数据传输的结束,又作为后一次传输的开始。
【5】总线冲突时,按“低电平优先”的仲裁原则,把总线判给在数据线上先发送低电平的主器件。
【6】在特殊情况下,若需禁止所有发生在I2C总线上的通信,可采用*或关闭总线,具体操作为在总线上的任一器件将SCL锁定在低电平即可。
【7】SDA仲裁和SCL时钟同步处理过程没有先后关系,而是同时进行的。
【8】I2C时钟信号(SCL)的同步问题
在I2C总线上传送信息时的时钟同步信号是由挂接在SCL线上的所有器件的逻辑“与”完成的。SCL线上由高电平到低电平的跳变将影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟由低至高的跳变并不能影响SCL线的状态,于是这些器件将进入高电平等待的状态。当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的器件又将SCL线拉成低电平。这样就在SCL线上产生一个同步时钟。可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定。