SPI协议详解
1.SPI协议简介
1.1.SPI协(xie)议概括(kuo)
SPI,是英语Serial Peripheral interface的(de)(de)(de)(de)缩写(xie),顾(gu)名(ming)思义(yi)就(jiu)是串行外围(wei)设备接口(kou)。是Motorola首先在其MC68HCXX系列处(chu)理(li)器(qi)(qi)上(shang)定义(yi)的(de)(de)(de)(de)。SPI接口(kou)主要应(ying)用在 EEPROM,FLASH,实时时钟,AD转换器(qi)(qi),还(hai)有数字(zi)信号处(chu)理(li)器(qi)(qi)和(he)数字(zi)信号解(jie)码(ma)器(qi)(qi)之间。SPI,是一种高速的(de)(de)(de)(de),全双工,同步的(de)(de)(de)(de)通(tong)信总(zong)线,并且在芯片(pian)的(de)(de)(de)(de)管脚(jiao)上(shang)只占(zhan)用四根线,节(jie)约(yue)了(le)芯片(pian)的(de)(de)(de)(de)管脚(jiao),同时为PCB的(de)(de)(de)(de)布局上(shang)节(jie)省空(kong)间,提(ti)供(gong)方便,正是出(chu)于这种简单易用的(de)(de)(de)(de)特(te)性,现在越来越多的(de)(de)(de)(de)芯片(pian)集成了(le)这种通(tong)信协议.
SPI的(de)通(tong)信(xin)原理(li)很简单(dan),它(ta)以主从方式工作,这种(zhong)模式通(tong)常有一(yi)(yi)个主设备和一(yi)(yi)个或多个从设备,需要至少4根(gen)(gen)线(xian),事实上(shang)3根(gen)(gen)也(ye)可以(单(dan)向传(chuan)输时)。也(ye)是所有基于SPI的(de)设备共有的(de),它(ta)们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。
SDO – 主设(she)备数(shu)据输出,从(cong)设(she)备数(shu)据输入 对应MOSI master output slave input
SDI – 主设备数据输(shu)(shu)入(ru),从设备数据输(shu)(shu)出 对(dui)应(ying)MISO master input slave output
SCLK – 时钟信号,由主设备产生
CS – 从设备(bei)使能(neng)信(xin)号(hao),由主设备(bei)控制(zhi)
CS: 其中CS是(shi)(shi)(shi)控制芯(xin)片是(shi)(shi)(shi)否被(bei)选中的(de),也就(jiu)是(shi)(shi)(shi)说(shuo)只有(you)片选信号(hao)为预(yu)先规定(ding)的(de)使能信号(hao)时(高(gao)电位(wei)或低电位(wei)),对此芯(xin)片的(de)操作才有(you)效,这(zhei)就(jiu)允许(xu)在同一总线上连接多个SPI设(she)备成为可(ke)能。
SDI/SDO/SCLK: 通(tong)讯是(shi)通(tong)过(guo)数据(ju)交(jiao)换完成(cheng)的(de)(de)(de),这(zhei)里先要知道SPI是(shi)串(chuan)行通(tong)讯协议(yi),也就(jiu)(jiu)是(shi)说数据(ju)是(shi)一(yi)位(wei)一(yi)位(wei)的(de)(de)(de)传输的(de)(de)(de)。这(zhei)就(jiu)(jiu)是(shi)SCK时(shi)钟线(xian)存在(zai)(zai)的(de)(de)(de)原(yuan)(yuan)因(yin),由SCK提供(gong)时(shi)钟脉冲(chong),SDI,SDO则基于(yu)此脉冲(chong)完成(cheng)数据(ju)传输。数据(ju)输出通(tong)过(guo) SDO线(xian),数据(ju)在(zai)(zai)时(shi)钟上升(sheng)沿(yan)或下降(jiang)沿(yan)时(shi)改变,在(zai)(zai)紧(jin)接着的(de)(de)(de)下降(jiang)沿(yan)或上升(sheng)沿(yan)被读取。完成(cheng)一(yi)位(wei)数据(ju)传输,输入也使用(yong)同样(yang)原(yuan)(yuan)理(li)。这(zhei)样(yang),在(zai)(zai)至少8次(ci)时(shi)钟信号(hao)的(de)(de)(de)改变(上沿(yan)和下沿(yan)为一(yi)次(ci)),就(jiu)(jiu)可(ke)以完成(cheng)8位(wei)数据(ju)的(de)(de)(de)传输。
要注意的是,SCK信号线只由(you)主设(she)(she)备控(kong)制(zhi),从设(she)(she)备不(bu)能控(kong)制(zhi)信号线。同样(yang),在一(yi)个基于SPI的设(she)(she)备中,至少有一(yi)个主控(kong)设(she)(she)备。
这样(yang)传输(shu)(shu)的(de)(de)(de)(de)(de)特点:这样(yang)的(de)(de)(de)(de)(de)传输(shu)(shu)方式(shi)有(you)一(yi)(yi)个(ge)优点,与(yu)普通(tong)(tong)的(de)(de)(de)(de)(de)串(chuan)行通(tong)(tong)讯(xun)不(bu)(bu)同(tong)(tong),普通(tong)(tong)的(de)(de)(de)(de)(de)串(chuan)行通(tong)(tong)讯(xun)一(yi)(yi)次(ci)连续传送至(zhi)少8位(wei)(wei)数(shu)(shu)据(ju),而SPI允(yun)许(xu)数(shu)(shu)据(ju)一(yi)(yi)位(wei)(wei)一(yi)(yi)位(wei)(wei)的(de)(de)(de)(de)(de)传送,甚至(zhi)允(yun)许(xu)暂停,因(yin)为SCK时(shi)(shi)(shi)(shi)钟(zhong)线(xian)由主控设(she)备(bei)控制(zhi),当没(mei)有(you)时(shi)(shi)(shi)(shi)钟(zhong)跳变时(shi)(shi)(shi)(shi),从设(she)备(bei)不(bu)(bu)采集(ji)或传送数(shu)(shu)据(ju),也就是说,主设(she)备(bei)通(tong)(tong)过对SCK时(shi)(shi)(shi)(shi)钟(zhong)线(xian)的(de)(de)(de)(de)(de)控制(zhi)可以完成对通(tong)(tong)讯(xun)的(de)(de)(de)(de)(de)控制(zhi)。SPI还(hai)是一(yi)(yi)个(ge)数(shu)(shu)据(ju)交换(huan)协议:因(yin)为SPI的(de)(de)(de)(de)(de)数(shu)(shu)据(ju)输(shu)(shu)入(ru)(ru)和(he)输(shu)(shu)出线(xian)独立(li),所以允(yun)许(xu)同(tong)(tong)时(shi)(shi)(shi)(shi)完成数(shu)(shu)据(ju)的(de)(de)(de)(de)(de)输(shu)(shu)入(ru)(ru)和(he)输(shu)(shu)出。不(bu)(bu)同(tong)(tong)的(de)(de)(de)(de)(de)SPI设(she)备(bei)的(de)(de)(de)(de)(de)实现方式(shi)不(bu)(bu)尽(jin)相同(tong)(tong),主要是数(shu)(shu)据(ju)改(gai)变和(he)采集(ji)的(de)(de)(de)(de)(de)时(shi)(shi)(shi)(shi)间不(bu)(bu)同(tong)(tong),在时(shi)(shi)(shi)(shi)钟(zhong)信号上沿(yan)或下沿(yan)采集(ji)有(you)不(bu)(bu)同(tong)(tong)定(ding)义,具(ju)体请参考(kao)相关器件的(de)(de)(de)(de)(de)文档。
在点对点的(de)通信(xin)中,SPI接口(kou)不需(xu)要(yao)进行寻址操作,且为全双工通信(xin),显(xian)得简单(dan)高效(xiao)。在多个从设(she)备的(de)系(xi)统中,每个从设(she)备需(xu)要(yao)独立的(de)使能信(xin)号(hao),硬件上比I2C系(xi)统要(yao)稍微复(fu)杂一些(xie)。
最后(hou),SPI接口的一个缺(que)点:没有指定的流控(kong)制,没有应答(da)机制确(que)认是否接收到数据。
SPI接口(kou)主(zhu)(zhu)要由4个(ge)引脚(jiao)构成:SPICLK、MOSI、MISO及(ji) /SS,其(qi)中SPICLK是整个(ge)SPI总(zong)线的(de)(de)公用时钟,MOSI、MISO作为(wei)主(zhu)(zhu)机,从(cong)机的(de)(de)输(shu)(shu)(shu)入(ru)输(shu)(shu)(shu)出(chu)的(de)(de)标志,MOSI是主(zhu)(zhu)机的(de)(de)输(shu)(shu)(shu)出(chu),从(cong)机的(de)(de)输(shu)(shu)(shu)入(ru),MISO 是主(zhu)(zhu)机的(de)(de)输(shu)(shu)(shu)入(ru),从(cong)机的(de)(de)输(shu)(shu)(shu)出(chu)。/SS是从(cong)机的(de)(de)标志管(guan)(guan)脚(jiao),在(zai)互相通信的(de)(de)两个(ge)SPI总(zong)线的(de)(de)器件,/SS管(guan)(guan)脚(jiao)的(de)(de)电平低的(de)(de)是从(cong)机,相反/SS管(guan)(guan)脚(jiao)的(de)(de)电平高的(de)(de)是主(zhu)(zhu)机。在(zai)一(yi)个(ge)SPI通信系统中,必须有主(zhu)(zhu)机。SPI总(zong)线可(ke)以配置成单(dan)主(zhu)(zhu)单(dan)从(cong),单(dan)主(zhu)(zhu)多从(cong),互为(wei)主(zhu)(zhu)从(cong)。
SPI的片选(xuan)可(ke)以(yi)扩(kuo)充(chong)选(xuan)择(ze)16个(ge)(ge)(ge)外(wai)设(she),这(zhei)时PCS输出=NPCS,说NPCS0~3接(jie)4-16译码(ma)(ma)器(qi),这(zhei)个(ge)(ge)(ge)译码(ma)(ma)器(qi)是需(xu)要外(wai)接(jie)4-16译码(ma)(ma)器(qi),译码(ma)(ma)器(qi)的输入为NPCS0~3,输出用于16个(ge)(ge)(ge)外(wai)设(she)的选(xuan)择(ze)。
2.协(xie)议举(ju)例
如下(xia)图,是(shi)SPI的简单收(shou)发时序图。
SPI是一(yi)个(ge)环形总线结构,由ss(cs)、sck、sdi、sdo构成(cheng),其时(shi)序其实(shi)很简(jian)单,主要是在sck的控制下,两个(ge)双向移位寄存器进行数(shu)据交换。
假(jia)设下面的8位寄存器装(zhuang)的是待发送(song)(song)的数据10101010,上升沿发送(song)(song)、下降(jiang)沿接(jie)收(shou)、高(gao)位先(xian)发送(song)(song)。
那(nei)么第(di)一(yi)(yi)个上(shang)升沿(yan)来(lai)的时(shi)(shi)候(hou) 数据将会是sdo=1;寄(ji)存(cun)(cun)器=0101010x。下降沿(yan)到来(lai)的时(shi)(shi)候(hou),sdi上(shang)的电平(ping)将锁存(cun)(cun)到寄(ji)存(cun)(cun)器中去(qu),那(nei)么这(zhei)(zhei)时(shi)(shi)寄(ji)存(cun)(cun)器=0101010sdi,这(zhei)(zhei)样在(zai) 8个时(shi)(shi)钟脉冲以后(hou),两(liang)个寄(ji)存(cun)(cun)器的内(nei)容互相交换一(yi)(yi)次。这(zhei)(zhei)样就完成里(li)一(yi)(yi)个spi时(shi)(shi)序。
举例(li):
假(jia)设主机(ji)(ji)和从机(ji)(ji)初始(shi)化就绪:并且主机(ji)(ji)的(de)sbuff=0xaa,从机(ji)(ji)的(de)sbuff=0x55,下面将分步(bu)对(dui)spi的(de)8个时(shi)钟周期的(de)数据(ju)情况演示一遍:假(jia)设上(shang)升沿发送数据(ju)
这(zhei)样就完成了(le)两个(ge)寄存器8位的(de)交(jiao)换(huan),上面的(de)上表(biao)示(shi)上升沿、下表(biao)示(shi)下降沿,sdi、sdo相对于主(zhu)(zhu)机(ji)(ji)而言的(de)。其中ss引脚(jiao)作(zuo)为(wei)主(zhu)(zhu)机(ji)(ji)的(de)时候,从(cong)(cong)机(ji)(ji)可以把它拉底被(bei)动选为(wei)从(cong)(cong)机(ji)(ji),作(zuo)为(wei)从(cong)(cong)机(ji)(ji)的(de)是时候,可以作(zuo)为(wei)片(pian)选脚(jiao)用。根(gen)据以上分析,一(yi)个(ge)完整的(de)传(chuan)送周期是16位,即两个(ge)字节,因为(wei),首先主(zhu)(zhu)机(ji)(ji)要(yao)发送命令(ling)过去(qu),然(ran)后从(cong)(cong)机(ji)(ji)根(gen)据主(zhu)(zhu)机(ji)(ji)的(de)命令(ling)准(zhun)备数据,主(zhu)(zhu)机(ji)(ji)在下一(yi)个(ge)8位时钟周期才把数据读回(hui)来(lai)。
SPI 总线(xian)是Motorola公司推出(chu)的三线(xian)同(tong)(tong)(tong)步(bu)(bu)接口,同(tong)(tong)(tong)步(bu)(bu)串行(xing)(xing)3线(xian)方式进行(xing)(xing)通(tong)信:一(yi)条(tiao)时钟(zhong)线(xian)SCK,一(yi)条(tiao)数(shu)据输(shu)入(ru)线(xian)MOSI,一(yi)条(tiao)数(shu)据输(shu)出(chu)线(xian)MISO;用于CPU与各种外围器件(jian)进行(xing)(xing)全双工、同(tong)(tong)(tong)步(bu)(bu)串行(xing)(xing)通(tong)讯。SPI主要(yao)特点有:可(ke)以同(tong)(tong)(tong)时发(fa)出(chu)和(he)(he)接收串行(xing)(xing)数(shu)据;可(ke)以当作主机(ji)(ji)或从机(ji)(ji)工作;提供频率可(ke)编程时钟(zhong);发(fa)送结(jie)束 中断(duan)标志;写冲突保护(hu);总线(xian)竞争(zheng)保护(hu)等。下(xia)图示出(chu)SPI总线(xian)工作的四种方式,其(qi)中使用的最为广泛的是SPI0和(he)(he)SPI3方式 (实线(xian)表示):
3. SPI总线四种工作方式
SPI 模块为(wei)了和(he)外设(she)进行(xing)数据交(jiao)换,根据外设(she)工作要求,其(qi)输出(chu)串(chuan)行(xing)同步时钟极性和(he)相位可以(yi)进行(xing)配置,时钟极性(CPOL)对传输协议没有重大的影响。
时序详解(jie):
CPOL:时(shi)钟(zhong)极(ji)性选(xuan)择,为(wei)0时(shi)SPI总线(xian)空(kong)闲为(wei)低(di)电(dian)(dian)平,为(wei)1时(shi)SPI总线(xian)空(kong)闲为(wei)高(gao)电(dian)(dian)平
CPHA:时钟相位选(xuan)择,为0时在SCK第(di)一个(ge)跳(tiao)变沿采样(yang),为1时在SCK第(di)二个(ge)跳(tiao)变沿采样(yang)
工作方式1:
当CPHA=0、CPOL=0时SPI总线工作在(zai)方式1。MISO引脚上(shang)(shang)的(de)数据在(zai)第一(yi)(yi)(yi)个SPSCK沿(yan)(yan)跳变之前(qian)已经上(shang)(shang)线了(le),而为了(le)保证正确传输,MOSI引脚的(de)MSB位(wei)(wei)必须(xu)与SPSCK的(de)第一(yi)(yi)(yi)个边沿(yan)(yan)同(tong)步,在(zai)SPI传输过程中,首先将数据上(shang)(shang)线,然(ran)后在(zai)同(tong)步时钟(zhong)信(xin)(xin)号的(de)上(shang)(shang)升沿(yan)(yan)时,SPI的(de)接收方捕捉位(wei)(wei)信(xin)(xin)号,在(zai)时钟(zhong)信(xin)(xin)号的(de)一(yi)(yi)(yi)个周期(qi)结(jie)(jie)束时(下降(jiang)沿(yan)(yan)),下一(yi)(yi)(yi)位(wei)(wei)数据信(xin)(xin)号上(shang)(shang)线,再重复(fu)上(shang)(shang)述过程,直到一(yi)(yi)(yi)个字节的(de)8位(wei)(wei)信(xin)(xin)号传输结(jie)(jie)束。
工(gong)作方式2:
当(dang)CPHA=0、CPOL=1时SPI总线工作在方式(shi)2。与(yu)前者(zhe)唯(wei)一不同之处只是在同步时钟信(xin)号(hao)的下(xia)降沿时捕捉位信(xin)号(hao),上升沿时下(xia)一位数据上线。
工作方式3:
当CPHA=1、CPOL=0时(shi)(shi)SPI总线工(gong)作在(zai)方式(shi)3。MISO引脚和MOSI引脚上(shang)的(de)数(shu)据的(de)MSB位必须与SPSCK的(de)第一(yi)个边沿(yan)同步,在(zai)SPI传输过(guo)程中,在(zai)同步时(shi)(shi)钟信(xin)(xin)号周期开始时(shi)(shi)(上(shang)升沿(yan))数(shu)据上(shang)线,然后在(zai)同步时(shi)(shi)钟信(xin)(xin)号的(de)下(xia)降沿(yan)时(shi)(shi),SPI的(de)接收(shou)方捕捉(zhuo)位信(xin)(xin)号,在(zai)时(shi)(shi)钟信(xin)(xin)号的(de)一(yi)个周期结束(shu)时(shi)(shi)(上(shang)升沿(yan)),下(xia)一(yi)位数(shu)据信(xin)(xin)号上(shang)线,再重复上(shang)述过(guo)程,直到一(yi)个字节(jie)的(de)8位信(xin)(xin)号传输结束(shu)。
工作方(fang)式4:
当CPHA=1、CPOL=1时SPI总(zong)线工(gong)作在方式4。与前者(zhe)唯一不(bu)同(tong)之处只是在同(tong)步(bu)时钟信(xin)号(hao)的(de)上升(sheng)沿时捕(bu)捉位信(xin)号(hao),下降沿时下一位数(shu)据上线。
4种(zhong)工作模(mo)式波形时序如下(xia)图:
4.协议心得
SPI接(jie)口时(shi)钟配置心得(de):
在(zai)主(zhu)(zhu)(zhu)设备(bei)这(zhei)边配(pei)置SPI接(jie)口(kou)时(shi)钟(zhong)的(de)(de)(de)(de)时(shi)候一定要弄清楚从设备(bei)的(de)(de)(de)(de)时(shi)钟(zhong)要求,因为主(zhu)(zhu)(zhu)设备(bei)这(zhei)边的(de)(de)(de)(de)时(shi)钟(zhong)极(ji)(ji)性(xing)(xing)(xing)和相(xiang)位都是以(yi)从设备(bei)为基(ji)准(zhun)的(de)(de)(de)(de)。因此在(zai)时(shi)钟(zhong)极(ji)(ji)性(xing)(xing)(xing)的(de)(de)(de)(de)配(pei)置上(shang)一定要搞(gao)清楚从设备(bei)是在(zai)时(shi)钟(zhong)的(de)(de)(de)(de)上(shang)升沿还是下降沿接(jie)收数(shu)(shu)据(ju),是在(zai)时(shi)钟(zhong)的(de)(de)(de)(de)下降沿还是上(shang)升沿输出数(shu)(shu)据(ju)。但(dan)要注意的(de)(de)(de)(de)是,由于主(zhu)(zhu)(zhu)设备(bei)的(de)(de)(de)(de)SDO连接(jie)从设备(bei)的(de)(de)(de)(de)SDI,从设备(bei)的(de)(de)(de)(de)SDO连接(jie)主(zhu)(zhu)(zhu)设备(bei)的(de)(de)(de)(de)SDI,从设备(bei)SDI接(jie)收的(de)(de)(de)(de)数(shu)(shu)据(ju)是主(zhu)(zhu)(zhu)设备(bei)的(de)(de)(de)(de)SDO发(fa)送过来(lai)的(de)(de)(de)(de),主(zhu)(zhu)(zhu)设备(bei)SDI接(jie)收的(de)(de)(de)(de)数(shu)(shu)据(ju)是从设备(bei)SDO发(fa)送过来(lai)的(de)(de)(de)(de),所以(yi)主(zhu)(zhu)(zhu)设备(bei)这(zhei)边SPI时(shi)钟(zhong)极(ji)(ji)性(xing)(xing)(xing)的(de)(de)(de)(de)配(pei)置(即SDO的(de)(de)(de)(de)配(pei)置)跟(gen)从设备(bei)的(de)(de)(de)(de)SDI接(jie)收数(shu)(shu)据(ju)的(de)(de)(de)(de)极(ji)(ji)性(xing)(xing)(xing)是相(xiang)反的(de)(de)(de)(de),跟(gen)从设备(bei)SDO发(fa)送数(shu)(shu)据(ju)的(de)(de)(de)(de)极(ji)(ji)性(xing)(xing)(xing)是相(xiang)同的(de)(de)(de)(de)。下面这(zhei)段话是Sychip Wlan8100 Module Spec上(shang)说的(de)(de)(de)(de),充分说明了时(shi)钟(zhong)极(ji)(ji)性(xing)(xing)(xing)是如何配(pei)置的(de)(de)(de)(de):
The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock.
意思是:主设备在(zai)(zai)时(shi)钟的(de)下降沿发(fa)送数据,从(cong)设备在(zai)(zai)时(shi)钟的(de)上升沿接收数据。因此主设备这边SPI时(shi)钟极性应该配(pei)置(zhi)为下降沿有效。
又如,下(xia)面这段话是(shi)摘自(zi)LCD Driver IC SSD1289:
SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.
意思是:从(cong)设备(bei)(bei)SSD1289在时钟(zhong)(zhong)的(de)上升沿接(jie)收数据,而且是按照从(cong)高(gao)位(wei)到地位(wei)的(de)顺序接(jie)收数据的(de)。因此主设备(bei)(bei)的(de)SPI时钟(zhong)(zhong)极(ji)性同样应该配置为下降沿有(you)效(xiao)。
时(shi)钟极性和相位配置(zhi)正确(que)后,数据才能够被准确(que)的(de)发(fa)送和接(jie)收, 因此应该(gai)对照从设(she)备(bei)的(de)SPI接(jie)口时(shi)序或者Spec文档说明来正确(que)配置(zhi)主设(she)备(bei)的(de)时(shi)钟。