原文地址:https://i-blog.csdnimg.cn/blog_migrate/2938855973fa120be099f37547b0b77b.png
1,SPI总线简介
SPI(serial peripheral interface,串行外围设备接口)总线技术是Motorola公司推出的一种高速、同步、全双工的通信总线。它只需要四条线就可以完成MCU与各种外围器件的通讯,正是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,比如AT91RM9200。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
(1)MOSI – 主设备数据输出,从设备数据输入;
(2 MISO – 主设备数据输入,从设备数据输出;
(3)SCLK – 时钟信号,由主设备产生;
(4)CS – 从设备使能信号,由主设备控制。
其中,CS是控制芯片是否被选中,也就是说只有片选信号为预先规定的使能信号是(高电位或底电位),对芯片的操作才有效,这就允许同一总线上连接多个SPI设备成为可能。
接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。当SPI工作时,在移位寄存器中的数据逐位从输出引脚(SDO)输出(高位在前),同时输入引脚(SDI)接受的数据逐位移入到移位寄存器(高位在前)。发送一个字节后,从另一个外围器件接受的字节进入移位寄存器中。即完成一个字节数据的传输的实质是两个器件寄存器内容的交换
。
要注意的是,SCLK信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于SPI的设备中,至少有一个主控设备。这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通讯一次连续传送至少8位数据,而SPI允许数据一位一位的传送,甚至允许暂停,因为SCLK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备通过对SCLK时钟线的控制可以完成对通讯的控制。SPI还是一个数据交换协议:因为SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档。
最后,
SPI接口的一个缺点
:没有指定的流控制,没有应答机制确认是否接收到数据。
SPI的片选可以扩充选择16个外设,这时PCS输出=NPCS,说NPCS0~3接4-16译码器,这个译码器是需要外接4-16译码器,译码器的输入为NPCS0~3,输出用于16个外设的选择。其经典的系统框图如下所示。
![](https://i-blog.csdnimg.cn/blog_migrate/2938855973fa120be099f37547b0b77b.png)
2,SPI的工作时序
SPI总线有四种工作方式,其中使用最广泛的是SPI0和SPI3方式
四种工作方式
![](https://i-blog.csdnimg.cn/blog_migrate/2938855973fa120be099f37547b0b77b.png)
时序详解:
CPOL:时钟极性选择,为0时SPI总线空闲为低电平,为1时SPI总线空闲时为高电平。
CPHA:时钟相位选择,为0时在SCK第一个跳变沿采样,为1时在第二个跳变沿采样。
3,SPI易犯错误
SPI的内部硬件框图
![](http://hi.csdn.net/attachment/201107/21/0_1311214092bDOe.gif)