一、SPI通信
SPI是一种高速,全双工,同步的串行通信总线。
何为同步? 答:通信双方需要同一个时钟信号进行时序上的同步;
何为全双工? 答:A向B传输同时,B也可以向A传输; 何为串行?
答:每个时刻传输一位
工作方式: SPI采用主从工作方式,一个主机对应一个或者多个从机。
在物理层上SPI的主机至少需要四根线:
MISO:主设备输入从设备输出
MOSI:主设备输出从设备输入
SCLK:时钟
CS:片选,用于寻址
1、寻址方式
当主设备要和某个从设备进行通信时,主设备会向该从设备的片选线上发送一个使能信号(高电平或者低电平,根据从机而定)表示选中该设备。
IIC通信时,在发送数据前会先向总线上发送一个字节的数据,该数据就是某个从机的地址
2、通信过程
SPI通信时,数据传输与常见的UART的低位优先不同,SPI采用的是同IIC一样的高位优先。
就比如10,换算成二进制为1010,高位优先就是按1010的顺序传输,低位优先则是按0101的顺序传输。
SPI传输数据无应答信号,即发送方发送完一个字节紧接着可以发送下一个字节数据。
SPI采用同步通信机制,当时钟信号产生上升沿或者下降沿时,发送方就会往数据线上发送一位数据,当时钟信号再次产生下降沿或者上升沿时,接收方就会从数据线上接收一位数据,从而完成一位数据的传输。一个字节的传输需要八个时钟周期。
3、相位和极性
SPI有四种工作模式,取决于相位(CPHL)和极性(CPOL)两个因素。
CPOL表示时钟线在空闲时候的状态
CPOL=0:SCLK在空闲时属于低电平状态
CPOL=1:SCLK在空闲时属于高电平状态
CPHA表示采样时刻
CPHA=0:表示每个周期的第一个时钟沿采样
CPHA=1:表示每个周期的第二个时钟沿采样
优点:相比于IIC而言,传输速率快,且数据传输灵活,拥有独立的数据线,双方可以同时收发数据。
缺点:需要占用更多的硬件资源,没有应答信号,不能对传输的数据做检查。
黑线为采样时刻,蓝线为时钟信号SCLK
二、IIC通信
前面我们知道SPI是一种高速,全双工,同步的串行通信总线,下面介绍跟他一样常见的通信方式IIC通信。
与SPI不同,IIC是一种低速,半双工,同步的串行通信总线。
为什么是半双工呢,因为IIC只有两根线,一根时钟线SCL和一根数据线SDA. 所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。
IIC的特点:可实现一主多从,多主多从。但是一个时段只能读或者写一个从设备。 主设备:提供IIC总线的控制电路 从设备:只能被动参与传输
基本时序:
1、空闲状态:SDA处于高电平
2、起始信号:SCL高电平期间,将SDA拉低意味着新一轮的传输开始(主设备发起)
3、中止信号:SCL高电平期间,将SDA拉高意味着一轮传输的结束(主设备发起)
4、数据信号:一个时钟周期的低电平期间,由发送方将数据线拉高(传输1)、拉低(传输0),同一时钟周期的高电平期间,由接收方读取数据线状态,如果高电平意味着接收是1, 如果读到低电平意味着接收到是0.
通信协议:
IIC通信包括如下内容:
1、从设备地址:同一个IIC通道上,每个从设备都有唯一的身份编码---从设备地址 一般从设备地址占7个二进制位,组成一个字节时放在字节的7-1位,该字节的第0位表示传输方向。
<1>、第0位是0:表示主机向从设备的寄存器里写数据。主机发送,从设备接收
<2>、第0位是1:表示主机从从设备的寄存器里读数据。主机接收,从设备发送
2、从设备中某个寄存器地址:每个从设备中有多个寄存器,为了区分他们,从设备会给这些寄存器唯一的身份标识---寄存器地址。
3、与从设备交互的数据:
<1>、向某个从设备指定寄存器里写数据
<2>、从从设备指定寄存器里读数据
4、辅助应答信号:每次传输完一个字节后,由接收方设置SDA线,以便告知发送方这个字节传输是否正常的一个回馈信号。
关于回馈信号:
1、主机发送数据,从设备接收数据—回馈信号由从设备来,在第九周期的低电平期间去设置SDA的电平。
从设备如果不想继续接收后续数据,可以向主机反馈NACK信号,而主机读到NACK后就发起终止信号,终止本轮的传输。
从设备如果还想继续接收后续数据,可以向主机反馈ACK信号,而主机读到ACK可以继续发送后续数据,也可以发起终止信号,终止本轮传输。
第九周期的高电平期间主机读SDA高电平,说明从机无应答(NACK)
第九周期的高电平期间主机读SDA低电平,说明从机有应答(ACK)
2、主机接收数据,从设备发送数据—回馈信号由主机来,在第九周期的低电平期间去设置SDA的电平。
主机如果不想继续接收后续数据,可以向从设备反馈NACK信号,然后主机发起终止信号,终止本次传输。
主机如果想继续接收后续数据,可以向从设备反馈ACK信号,然后主机继续接收后续数据。
实例代码:
IIC总线按时序编写:以FS4412芯片为例
SET_SDA_OUT:将GPB.CON[2]配置成输出
SET_SDA_IN:将GPB.CON[2]配置成输入
SET_SDA_H:将数据线拉高
SET_SDA_L:将数据线拉低
SET_SCL_H:将时钟线拉高
SET_SCL_L:将时钟线拉低
READ_SDA:读取SDA数据
IIC和SPI的异同:
相同点:
1、均采用串行,同步机制。
2、均采用TTL电平(高电平为1,低电平为0),从而决定了他们适用于短距离传输,常用于一块电路板上芯片间的通讯。
3、均采用主从方式工作。
不同点:
1、IIC为半双工,SPI为全双工
2、IIC有应答机制,SPI无应答机制
3、IIC通过广播从机地址来寻址,SPI通过片选线向从机发送使能信号。(SPI导致了SPI占用的硬件资源多,但是比IIC节省时间) IIC总线传输速度在100kbps-4Mbps。SPI总线传输速度更快,可以达到30MHZ以上。
4、IIC的时钟和相位固定,而SPI的时钟和相位可调。
5、 SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。IIC用于连接微控制器及其外围设备。