SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI是一种高速的、全双工、同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,只是出于这种简单易用的特性,如今越来越多的芯片集成了这种通信协议,如NRF24L01、VS1053、SD卡等等。
那么何为高速?串口是不是高速?串口的波特率一般是多少?
115200bps是吧,那么SPI的最高速率是10Mbps,比串口快多少?
115200bps就是115.2kbps对吧那么乘以10也就是1.152Mbps对吧?这样也就说明SPI的速度比串口快了差不多100倍的速度。
那么何为全双工呢?
全双工通信:发送数据的同时也可以接收数据,接收数据的同时也可以发送数据。而且通信的同时是可以同步的。
那么同步是什么意思呢?
同步:发送数据的同时,并且要发送数据给我。
假如有两个模块:
XX芯片给SPI Flash发送数据的同时,同时SPI Flash也要发送数据给我;
就像买卖关系一样,我给你钱的时候,你必须把东西给我。
并且同时在芯片上只需要占用四根线就可以达到10Mbps。(10Mbps是非常快的)
10Mbps也就是说在1秒内能传输多少字节?是不是要除以8?
那么SPI是总线关系,什么是总线?总线有什么用? 其实就像路由器一样,可以连接很多电脑。
就是说XX芯片可以用四根线连接很多设备。
在平时对SPI的利用是非常广泛的,所以必须的懂,为什么要必须懂?我们可以想一想,我们使用的手机,照相机之类的设备是不是离不开SD卡?还有一些音频啊之类的都是利用SPI协议,所以不懂也得花时间把它弄明白。
SPI协议中有四根线,SCLK、MISO、MOSI、SS;
在SPI通信中分为两个角色,有SPI Msater和SPI Slave;什么意思呢?
SPI Msater:是主机(主机模式)
SPI Slave:是从机(从机模式)
在主机和从机当中有什么区别?
谁发起通信谁就是主机;发起通信的时候SCLK作为时钟线,它是由主机来发起的。
那么接下来说一下总共有四根线:
SCLK:串行时钟线;
MOSI:主机输出数据,从机接收数据;
MISO:主机接收数据,从机发送数据;
SS:我们一般称之为片选信号,也就是说只有这根线输出低电平信号的时候,才能开始工作。
接下来很多人会想为什么要有SS(片选信号)来连接两个设备呢?
其实最主要的就是它是一个总线的关系;
我们看一个图:
那么通过以上这张图,就能说明为什么要有SS(片选信号),主要是为了防止数据紊乱,所以要用片选引脚来控制是哪一个设备工作,在我们工作当中,只能有一个设备工作,也就是说SPI通信的时候只能控制一个设备工作,其他设备是不能工作的。
片选信号:用于控制从机设备,而同时这三根引脚只能有一根作为低电平,其他必须为高电平。因为工作的时候,只允许其中一个设备工作,其它设备是不能工作的。原因是为了防止数据出现紊乱的一个现象。
那么接下来就说一下同步通信与传输:
因为今天主要介绍的是SPI协议,是全双工(具有高速的优势),所以就先了解下全双工:
全双工通信:发送数据的同时可以接收数据;接收数据的同时可以发送数据。
半双工通信:发送数据的同时不可以接收数据;接收数据的同时不能发送数据。
SPI是一种全双工的通信方式;
再来了解下同步和异步的区别:
同步通信:发送数据的同时,必须接收数据;
异步通信:发送数据的同时,可以接收数据也可以不接收数据。
接下来画一个图来简单的了解下:
根据上面这张图来看,SCLK通信开始和结束必须是高电平;
假如单片机芯片发送给SPI Flash一个命令,然后读取一个字节。
对照上图来一起看下面的两段话:
XX芯片 发送的假如是:0xF4 ( 1 1 1 1 0 1 0 0 )二进制数,因为它是串行通信,MSB(最高有效位优先的方式)。发送第一个Bit的时候先发送一个1,再发送一个1,一直重复8次发送完成。如上图;SPI的通信都是以字节传输的。
SPI Flash 同时要给XX芯片返回 假如返回:假如是0x74 ( 0 1 1 1 0 1 0 0 )二进制数, MBS(最高有效位优先的方式)。返回一个Bit 的时候先返回一个0,再返回一个1,一直重复8次。如上图;
注意:还有一点在通信开始的时候必须是由高到低;通信结束的时候必须是由低到高。
很多时候:
通信开始前SS(片选信号)引脚变为低电平,SPI Flash才工作;
通信结束后SS(片选信号)引脚变为高电平,SPI Flash不工作,同时腾出更多的机会给其他设备工作,不能独占它这一根引脚的低电平对吧。
最后要记住如果有人要问到MSB的话,要知道它和LSB是对应的;
MSB:高有效位优先
LSB:低有效位优先
附上扩展知识:
SPI相对IIC来说有优点也有缺点
优点:
IIC一次需要连续传输8位数据,而SPI允许一位一位的传输,还可以暂停,因为SCK是由我们主设备产生的,所以没有时钟跳变的时候,特别是不采集,或者说传输数据,也就是说主设备通过对SCK时钟线的控制可以完全的对通讯的控制,如果说我们是这个一对一通信,SPI还不需要进行寻址的操作,而且是全双工的通信,就变得非常的简单高效,在多设备的设备当中,每个设备都需要独立的使能,在硬件上看来就会比IIC稍微复杂一点,因为它每一个设备都有有一个独立的IO口进行使能的;
相当于SPI来说IIC的缺点:
没有指定的控制没有应答机制来确认它是否收到数据。
今天的SPI总结到此结束,我把它分享给大家,希望大家能够给些意见,哪里还有欠缺的地方多多指教。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删