SPI(Serial Peripheral Interface)协议
SPI是串行外设接口(Serial Peripheral Interface)的缩写,是Motorola推出的一种同步串行接口技术,是一种高速的、全双工、同步的通信总线。
全双工:host能与外围从设备之间的发送线和接收线各自独立,能同时进行发送数据和接收数据。
源同步传输
文章内容
- SPI介绍
- SPI协议通信时序详解
- SPI数据传输方式
- SPI总线优缺点
1、SPI介绍
应用场景
SPI协议主要用于短距离的通信系统中,特别是嵌入式系统:
存储器:RAM,EEPROM,Flash等
数模转换器:A/D, D/A转换器等
驱动接口:LED显示驱动器,I/O接口芯片,UART接收器等。
主从模式控制:
SPI以主从方式进行工作,这种模式通常包含一个master和一个或多个slave,需要至少4根线(在单向传输时3根也可以),分别为:
- SDO/MOSI(master output slave input):主设备数据输出,从设备数据输入;
- SDI/MISO(master input slave output):主设备数据输入,从设备数据输出;
- SCLK:时钟信号,由主设备产生;
- CS/SS:片选信号,主设备控制并用于选择与其通信的从设备。
多Slave的SPI协议
SPI协议可以操作在一个master对应一个或者多个slave的条件下,此时有多个CS/SS片选信号,但是一个时间只能有一个片选信号有效。
slave的输出端口MISO都是三态驱动;高电平,低电平和不选中时输出为高阻态。
数据交换(data exchanges)
SPI设备之间的数据传输称为数据交换而不是数据传输。这是因为SPI设备不能在进行数据通信的过程中仅充当transmitter和recieiver的角色,而是在每个时钟周期内,主从SPI设备都会发送1bit大小的数据,相当于主从设备进行了1bit的数据交换。
在数据的传输过程中,每次接收到的数据必须在下一次数据传输之前被采样,如果之前接收的数据没有被采样,那么这些已经收到的数据可能被丢弃,导致 SPI 模块最终失效,因此,在程序中,一般都会在 SPI 传输完数据之后,去读取 SPI 设备里面的数据,即使这些数据是在我们程序中是没有用的。
2、SPI协议通信时序详解
时钟极性CPOL(表示状态):
时钟极性CPOL用于表示SPI空闲状态是SCLK电平状态;
CPOL=0表示当SCLK=1时处于有效状态,SCLK=0处于空闲状态;
CPOL=1表示当SCLK=0时处于有效状态,SCLK=1处于空闲状态;
时钟相位CPHA(表示收发数据):
时钟相位CPHA则用于表示数据采样发生在第几个边沿。
CPHA=0,表示在第1个边沿进行数据采样,第2个边沿进行数据发送;
CPHA=1,表示在第2个边沿进行数据采样,第1个边沿进行数据发送;
通信模式:
SPI通信具有四种不同的模式,不同的从设备可能在出厂时就配置为某种模式,不可改变;但由于通信双方需要工作在同一模式下,由master的CPOL(时钟极性)和CPHA(时钟相位)决定。
SPI通信模式与CPOL和CPHA的关系如下:
Mode0:CPOL=0,CPHA=0;
Mode1:CPOL=0,CPHA=1;
Mode2:CPOL=1,CPHA=0;
Mode3:CPOL=1,CPHA=1;
数据采样和数据传输?
数据采样指SPI主从设备的采样Buffer中的数据,数据传输指主/从设备将采样到的数据传输给从/主设备?
还是说
数据采样是slave传输数据给master,数据传输指master传输数据给slave?
3、SPI数据传输方式
SSPSR为SPI内部的移位寄存器(Shift Register),根据SPI时钟信号状态,向SSPBUF移入或移除数据,每次移动的数据大小由Bus-Width和Channel-Width决定。
Bus_Width是指定地址总线到Master之间数据传输的单位。例如,要往Master里的SSPBUF写入16Byte的数据:要先给Master的配置寄存器设置Bus_Width为Byte,然后往Master的Tx_Data移位寄存器的地址总线的入口写入数据,每次写入1Byte的数据,当写完1个Byte后,Tx_Data以为寄存器会自动的把地址总线传来的1Byte数据移入SSPBUF中,传16个Byte需要重复进行16次。
Channel_Width则是指定Master与Slave之间数据传输的单位。Master内部的移位寄存器会依据Channel_Width自动的把数据从Master_SSPBUF里通过Master_SDO传输到Slave_SDI中,Slave_SSPSR再将数据移入Slave_SSPBUF中。
通常情况下,Bus_Width≥Channel_Width,以保证不会因为Master和Slave之间数据交换的频率比地址总线与Master之间的数据交换频率要快而导致Master_SSPBUF存放的数据无效。
SSPBUF
在每个时钟周期内,Master和Slave之间交换的数据都是SPI内部移位寄存器从SSPBUF中拷贝的。可以通过往SSPBUF对应的寄存器(Tx_Data/Rx_Data register)里读写数据,间接控制SPI设备内部的SSPBUF。
例如:在发送数据之前,向Master的Tx-Data寄存器中写入将要发送的数据,这些数据会被Master-SSPSR移位寄存器根据Bus_Width自动移入Master-SSPBUF中,然后被Master-SSPSR根据Channel-Width从SSPBUF移出,通过输出管脚传给Slave。而Slave-SSPSR则将SDI接收到的数据移入到SSPBUF中。与此同时,Slave也进行相同的操作。
值得注意的是,在单次数据传输传输完成后,用户程序可以通过Master的Rx-Data寄存器读取Master设备交换后的数据。
4、SPI总线优缺点
优点:
- 协议简单利于硬件设计和实现,如不需要向I2C协议中每个从器件都需要一个地址;只需要四根线;
- 全双工协议,允许在同一时间内收发数据;
- 三态输出的驱动能力强,相对于I2C的开漏输出,抗干扰能力强,传输稳定;
- 相对于I2C协议,时钟速率快,没有最大限制;
- 输入输出的大小没有限制,允许传输多个字节;
缺点:
- 片选信号线会随着slave的增加而增加;
- 传输过程中没有确认信号,不能确定从器件是否收到;在SPI Flash中有read statu这个命令确定slave的状态是狗处于busy;
- 没有校验机制;
5、SPI代码