SPI(Serial Peripheral Interface,串行(xing)外设接口)是(shi)Motorola公(gong)司提出的一种(zhong)同步串行数据传(chuan)输标(biao)准,是一(yi)种高速的(de),全双(shuang)工,同步的(de)通信总(zong)线,在很多器(qi)件中被广泛应用。
SPI相关缩写
SS: Slave Select,选(xuan)中从设备,片(pian)选(xuan)。
CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性
CKPHA (Clock Phase) = CPHA = PHA = Phase = (时钟)相位(wei)
SCK = SCLK = SCL = SPI的时钟(Serial Clock)
Edge = 边沿,即时钟(zhong)电平变化的时刻,即上升沿(rising edge)或者下降沿(falling edge)。
对于一个时钟周期内,有两个edge,分(fen)别称为(wei):
Leading edge = 前一(yi)个边沿(yan) = 第一(yi)个边沿(yan),对于(yu)开(kai)始(shi)电(dian)压(ya)是(shi)(shi)1,那么就是(shi)(shi)1变成0的时(shi)候,对于(yu)开(kai)始(shi)电(dian)压(ya)是(shi)(shi)0,那么就是(shi)(shi)0变成1的时(shi)候;
Trailing edge = 后(hou)一个边沿 = 第(di)二(er)个边沿,对于(yu)开始(shi)电压是1,那(nei)么(me)就是0变(bian)成1的时(shi)候(hou)(即在第(di)一次1变(bian)成0之后(hou),才可能有后(hou)面(mian)的0变(bian)成1),对于(yu)开始(shi)电压是0,那(nei)么(me)就是1变(bian)成0的时(shi)候(hou);
接口
SPI接(jie)口经(jing)常(chang)被称为(wei)4线(xian)串行总线(xian),以主/从方式工(gong)作,数据传输(shu)过程由主机初始化。
如图1所示,其使用的4条信号线(xian)分别(bie)为:
1) SCLK:串行时钟,用(yong)来同步数据传输,由主机输出(chu);
2) MOSI:主机输出从机输入(Master Output Slaver Input)数据线;
3) MISO:主机输入从机输出数据线;
4) SS:片选线,低电平有效,由主机输出
在SPI总线上(shang),某(mou)一时(shi)刻可以出现多(duo)个从(cong)机(ji),但只能存在一个主机(ji),主机(ji)通过片选(xuan)(xuan)线来确定要(yao)通信的从(cong)机(ji)。这就(jiu)要(yao)求从(cong)机(ji)的MISO口具有三态(tai)特性,使得该口线在器件未(wei)被选(xuan)(xuan)通时(shi)表现为高阻抗。
SPI由于(yu)接口相对(dui)简(jian)单(只(zhi)需要(yao)(yao)4根线),用途算是比(bi)较(jiao)广泛(fan),主要(yao)(yao)应(ying)用在 EEPROM,FLASH,实时(shi)时(shi)钟,AD转(zhuan)换器(qi),还(hai)有(you)数字信(xin)号处理器(qi)和数字信(xin)号解码器(qi)之间(jian)。
即一个SPI的Master通(tong)过(guo)SPI与(yu)一个从(cong)设备,即上述的那些(xie)Flash,ADC等的Slaver SPI进(jin)行(xing)通(tong)讯(xun)。而(er)主从(cong)设备之间通(tong)过(guo)SPI进(jin)行(xing)通(tong)讯(xun),首(shou)先要保证两者之间时钟(zhong)SCLK要一致(zhi),互相要商(shang)量好了,要匹配,否则,就(jiu)没法正常通(tong)讯(xun)了,即(ji)保证(zheng)时(shi)序上的一致才可(ke)正常讯(xun)。而这里的SPI中的时(shi)钟(zhong)和相(xiang)位,指(zhi)的就是SCLk时(shi)钟(zhong)的特性(xing),即保(bao)证主从设备两者的时(shi)钟(zhong)的特性(xing)一致了(le),以(yi)保(bao)证两者可以(yi)正常实现SPI通讯。
数据(ju)传(chuan)输
在一个(ge)SPI时钟周期内,会(hui)完成(cheng)如下(xia)操作:
1) 主(zhu)机通过(guo)MOSI线发(fa)送1位数(shu)据(ju),从(cong)机通过(guo)该(gai)线读(du)取这1位数(shu)据(ju);
2) 从机通过MISO线发送1位数据(ju),主机通过该线读取(qu)这1位数据(ju)。
这是通过移(yi)位来寄存器实现的。如图2所示,主(zhu)机(ji)和(he)从机(ji)各有一个(ge)移位寄(ji)存(cun)器(qi),且二者连(lian)接成(cheng)环。随着时钟脉冲,数据(ju)按(an)照从高位到低位的(de)方(fang)式依次移出(chu)主(zhu)机(ji)寄(ji)存(cun)器(qi)和(he)从机(ji)寄(ji)存(cun)器(qi),并且依次移入(ru)从机(ji)寄(ji)存(cun)器(qi)和(he)主(zhu)机(ji)寄(ji)存(cun)器(qi)。当寄(ji)存(cun)器(qi)中的(de)内容全部移出(chu)时,相当于完成(cheng)了两个(ge)寄(ji)存(cun)器(qi)内容的(de)交(jiao)换(huan)。
时钟极性和时钟相位
在SPI操作中,最重要的两项设置就是(shi)时(shi)(shi)(shi)钟极(ji)(ji)性(CPOL或UCCKPL)和时(shi)(shi)(shi)钟相位(CPHA或UCCKPH)。时(shi)(shi)(shi)钟极(ji)(ji)性设(she)置时(shi)(shi)(shi)钟空闲时(shi)(shi)(shi)的电平(ping),时(shi)(shi)(shi)钟相位设(she)置读取数据和发送数据的时(shi)(shi)(shi)钟沿。
主机和(he)从机的(de)(de)(de)发送(song)数(shu)据是同(tong)(tong)时(shi)完成的(de)(de)(de),两者(zhe)的(de)(de)(de)接收(shou)数(shu)据也是同(tong)(tong)时(shi)完成的(de)(de)(de)。所以为(wei)了(le)保证主(zhu)从机(ji)正确通信,应使得它们的(de)SPI具有相(xiang)同的(de)时钟(zhong)极(ji)性(xing)和时钟(zhong)相(xiang)位。
CPOL极(ji)性(xing)
先说什么是(shi)(shi)SCLK时(shi)(shi)钟(zhong)的(de)(de)空闲(xian)时(shi)(shi)刻,其就是(shi)(shi)当SCLK在(zai)发送(song)8个bit比(bi)特数据之前和(he)之后的(de)(de)状态,与此对应的(de)(de),SCLK在(zai)发送(song)数据的(de)(de)时(shi)(shi)候,就是(shi)(shi)正常的(de)(de)工(gong)作的(de)(de)时(shi)(shi)候,有效active的(de)(de)时(shi)(shi)刻了(le)。
先说英文,其精(jing)简解(jie)释为(wei):Clock Polarity = IDLE state of SCK。
再(zai)用中文详解:
SPI的CPOL,表示当SCLK空闲idle的时候(hou),其电平(ping)的值是(shi)低电平(ping)0还(hai)是(shi)高电平(ping)1:
CPOL=0,时(shi)钟空闲idle时(shi)候的(de)电(dian)(dian)平(ping)是低电(dian)(dian)平(ping),所以当SCLK有(you)效(xiao)的(de)时(shi)候,就是高电(dian)(dian)平(ping),就是所谓的(de)active-high;
CPOL=1,时钟(zhong)空闲(xian)idle时候(hou)的(de)电平是(shi)高电平,所(suo)以当SCLK有效的(de)时候(hou),就(jiu)是(shi)低(di)电平,就(jiu)是(shi)所(suo)谓的(de)active-low;
CPHA相位
首(shou)先说明(ming)一点,capture strobe = latch = read = sample,都是(shi)表示数据采(cai)样,数据有效的时刻。
相位(wei),对应(ying)着数据采样(yang)是(shi)在第(di)(di)几个边沿(yan)(edge),是(shi)第(di)(di)一个边沿(yan)还是(shi)第(di)(di)二个边沿(yan),0对应(ying)着第(di)(di)一个边沿(yan),1对应(ying)着第(di)(di)二个边沿(yan)。
CPOL=0:
对于CPHA=0,idle时候的(de)是(shi)低(di)电平,第一个边沿(yan)就(jiu)是(shi)从(cong)低(di)变到高,所以是(shi)上(shang)升沿(yan);
对于(yu)CPHA=1,idle时(shi)候的是(shi)低电平,第二个边沿(yan)就(jiu)是(shi)从高(gao)变到低,所以是(shi)下降沿(yan);
CPOL=1:
对于CPHA=0,idle时(shi)候的是(shi)高电平,第一个(ge)边沿就(jiu)是(shi)从高变到低,所以是(shi)下降(jiang)沿;
对于CPHA=1,idle时候(hou)的是(shi)高电平,第二个边沿就是(shi)从低(di)变到高,所以是(shi)上升沿;
用图文形式表示(shi),更加容易看懂:
CKP和(he)CKE
CKP和(he)CKE是Microchip的(de)PIC系列芯片中的(de)说(shuo)法(fa)。
(1)CKP是(shi)Clock Polarity Select,就是(shi)极性=CPOL:
CKP,虽然名(ming)字和CPOL不(bu)一(yi)样,但是(shi)都是(shi)指时钟(zhong)极性的(de)选择,定义也一(yi)样:
CKP: Clock Polarity Select bit
1 = Idle state for clock (CK) is a high level
0 = Idle state for clock (CK) is a low level
所(suo)以不多解释。
(2)CKE是Clock Edge Select,就(jiu)是相位=CPHA:
CKE: SPI Clock Edge Select bit
1 = Transmit occurs on transition from active to Idle clock state
0 = Transmit occurs on transition from Idle to active clock state
意思是:
1 =(数据)传输发生在(zai)时钟(zhong)从(cong)有效状(zhuang)态(tai)转到空闲(xian)状(zhuang)态(tai)的那一时刻
0 =(数据(ju))传输(shu)发生在时(shi)钟从空闲状态(tai)转到有效状态(tai)的那一时(shi)刻
其中(zhong),数据(ju)传输的(de)时刻(ke),即(ji)上图中(zhong)标出的(de)“数据(ju)transmit传输的(de)时刻(ke)”。
CKE的定义(yi)也(ye)跟CPHA相同(tong)。
所以,CKP和CKE所对应的取值的含义为(wei):
When CKP = 0:
CKE=0 => Data transmitted on rising edge of SCK(idle时候是(shi)(shi)低电平(ping)(ping),从空(kong)闲到有(you)效,就是(shi)(shi)从低电平(ping)(ping)到高电平(ping)(ping),所以是(shi)(shi)上升沿)
CKE=1 => Data transmitted on falling edge of SCK(idle时候是(shi)(shi)低电(dian)平(ping),从(cong)有效到空闲,就(jiu)是(shi)(shi)从(cong)高(gao)电(dian)平(ping)到低电(dian)平(ping),所(suo)以是(shi)(shi)下降沿)
When CKP = 1:
CKE=0 => Data transmitted on falling edge of SCK(idle时候(hou)是(shi)高电(dian)平(ping),从空闲到有效(xiao),就(jiu)是(shi)从高电(dian)平(ping)到低电(dian)平(ping),所以是(shi)下降沿)
CKE=1 => Data transmitted on rising edge of SCK(idle时(shi)候是高(gao)电(dian)平,从有效(xiao)到空闲,就是从低电(dian)平到高(gao)电(dian)平,所以(yi)是上升沿)
举例来说,分别选取MSP430控制器和OLED驱动SH1101A为(wei)主从机,图3和图4为(wei)它们的SPI时序(xu)。由图(tu)4可知(zhi),SH1101A的SPI时(shi)钟空闲时(shi)为高电(dian)平,并且(qie)在后(hou)时(shi)钟沿(yan)(yan)接收数据(ju)(后(hou)时(shi)钟沿(yan)(yan)在数据(ju)的中间部位),则MSP430控制器(qi)SPI的设(she)置应与(yu)此保持一致。从图3中可以看出,要使得(de)时(shi)钟(zhong)在空闲时(shi)为高电平,应将UCCKPL置1;要使得(de)在后时(shi)钟(zhong)沿接收数据,应将UCCKPH清零。
下(xia)面再列(lie)出其他一些地方找到的,常见的SPI的四种模(mo)式(shi)的时序图,供参考(kao):
如何看懂和记忆CPOL和CPHA
所以,关于(yu)在其他地方介绍(shao)的,看(kan)似多么复杂难懂(dong)难记忆的CPOL和(he)CPHA,其实经过上面解(jie)释,就肯容易看(kan)懂(dong)了:
去看(kan)时(shi)序图(tu),如(ru)果时(shi)钟SCLK的(de)起始(shi)电平(ping)是0,那么CPOL=0,如(ru)果是1,那么CPOL=1。
然后(hou)看数(shu)据采样时刻(ke),即时序图数据线上(shang)的数据矩形(xing)区域的中(zhong)间所对(dui)应的位置,对(dui)应(ying)(ying)到(dao)上面(mian)SCLK时(shi)钟的(de)位(wei)置(zhi),对(dui)应(ying)(ying)着是(shi)(shi)(shi)(shi)第一(yi)个(ge)边沿或是(shi)(shi)(shi)(shi)第二(er)个(ge)边沿,即CPHA是(shi)(shi)(shi)(shi)0或1。(对(dui)应(ying)(ying)的(de)是(shi)(shi)(shi)(shi)上升沿还是(shi)(shi)(shi)(shi)下降沿,要(yao)根据(ju)对(dui)应(ying)(ying)的(de)CPOL的(de)值(zhi),才能(neng)确定)。
即(ji):
(1)如何判断CPOL:SCLK的空闲时候(hou)电压是(shi)0还是(shi)1,决定(ding)了CPOL是(shi)0还是(shi)1;
(2)如何(he)判断(duan)CPHA:而数据采(cai)样(yang)时(shi)刻对(dui)应着(zhe)的SCLK的电(dian)平,是第(di)一个边沿(yan)还(hai)是第(di)二(er)个边沿(yan),对(dui)应着(zhe)CPHA为0还(hai)是1。
软件(jian)中如何设置SPI的极性和相位
SPI分主设(she)备(bei)和从设(she)备(bei),两者通(tong)过SPI协议(yi)通(tong)讯。
设置SPI的(de)模(mo)(mo)式,是从设(she)备的(de)模(mo)(mo)式,决定了(le)主设(she)备的(de)模(mo)(mo)式。
所(suo)以要先(xian)去搞懂从(cong)设(she)(she)备(bei)的(de)(de)SPI是(shi)何种(zhong)模(mo)(mo)式(shi)(shi),然后再将主设(she)(she)备(bei)的(de)(de)SPI的(de)(de)模(mo)(mo)式(shi)(shi),设(she)(she)置和(he)从(cong)设(she)(she)备(bei)相同的(de)(de)模(mo)(mo)式(shi)(shi),即可正常(chang)通讯。
对于从(cong)设备的SPI是什么模式,有两种:
(1)固(gu)定的,设备硬(ying)件(jian)决定的。
SPI从设(she)备,具体是什么模式,相关的datasheet中会有描述(shu),需要自(zi)己去datasheet中找到相关的描述(shu),即:
关于SPI从设备,在空闲(xian)的时候,是高(gao)电平(ping)还(hai)是低电平(ping),即决(jue)定(ding)了(le)CPOL是0还(hai)是1;
然后(hou)再找(zhao)到(dao)关(guan)于设备是(shi)在(zai)(zai)上(shang)升(sheng)沿还是(shi)下降沿去采(cai)样数据,这样就是(shi),在(zai)(zai)定了CPOL的值的前提下,对应着可以推算出CPHA是(shi)0还是(shi)1了。
举(ju)例1:
CC2500 - Low-Cost Low-Power 2.4 GHz RF Transceiver的(de)datasheet中(zhong)SPI的(de)时序图是:
从图(tu)中可以(yi)看(kan)到,最(zui)开始的(de)(de)(de)SCLK和结(jie)束时(shi)候的(de)(de)(de)SCLK,即(ji)(ji)空闲时(shi)刻(ke)的(de)(de)(de)SCLK,是低电(dian)平(ping),推导出CPOL=0,然后(hou)可以(yi)看(kan)到数据(ju)采样的(de)(de)(de)时(shi)候,即(ji)(ji)数据(ju)最(zui)中间的(de)(de)(de)那一点,对应(ying)的(de)(de)(de)是SCLK的(de)(de)(de)第一个边沿,所以(yi)CPHA=0(此时(shi)对应(ying)的(de)(de)(de)是上升沿)。
举例2:
SSD1289 - 240 RGB x 320 TFT LCD Controller Driver的(de)datasheet中(zhong)提到:
“SDI is shifted into 8-bit shift register on everyrising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0.”
意思是(shi)(shi),数据是(shi)(shi)在上升沿(yan)采样,所以可以断定是(shi)(shi)CPOL=0,CPHA=0,或者CPOL=1,CPHA=1的模式,但是(shi)(shi)至于是(shi)(shi)哪(na)种模式。
按理来说,接下来应(ying)该再去确定SCLK空闲(xian)时候是(shi)高电平还(hai)是(shi)低电平,用以确定CPOL是(shi)0还(hai)是(shi)1,但是(shi)datasheet中没有提(ti)到(dao)这(zhei)点。
所以,此处,目(mu)前不太(tai)确定(ding),是两种模式(shi)都支(zhi)持(chi),还(hai)是需要额外找证据却(que)确定(ding)CPOL是0还(hai)是1.
(2)可配(pei)置的,由(you)软件(jian)自己设(she)定(ding)
从设(she)备也是一个SPI控制(zhi)器,4种模(mo)(mo)式都支持,此时只要自己设(she)置为某(mou)种模(mo)(mo)式即可。
然后(hou)(hou)知道(dao)了从设(she)(she)备(bei)的(de)模式后(hou)(hou),再(zai)去将(jiang)SPI主设(she)(she)备(bei)的(de)模式,设(she)(she)置为和从设(she)(she)备(bei)模式一样,即(ji)可。
对(dui)于如(ru)何配(pei)置(zhi)SPI的CPOL和CPHA的话,不多(duo)细说(shuo),多(duo)数都(dou)是直接去写对(dui)应(ying)的SPI控制(zhi)器(qi)中(zhong)对(dui)应(ying)寄存器(qi)中(zhong)的CPOL和CPHA那两位,写0或写1即可。
举(ju)例:
此(ci)处遇到(dao)的(de)(de)C8051F347中的(de)(de)SPI就是一(yi)个SPI的(de)(de)controller控制(zhi)器,即支(zhi)持软(ruan)件配置(zhi)CPOL和CPHA的(de)(de)值,四(si)种模(mo)(mo)式都(dou)支(zhi)持,此(ci)处C8051F347作(zuo)为SPI从(cong)设(she)(she)备,设(she)(she)置(zhi)了CPOL=1,CPHA=0的(de)(de)模(mo)(mo)式,因(yin)此(ci),此(ci)处对应主芯片Blackfin F537中的(de)(de)SPI控制(zhi)器,作(zuo)为Master主设(she)(she)备,其SPI的(de)(de)模(mo)(mo)式也(ye)要设(she)(she)置(zhi)为CPOL=1,CPHA=0。
优缺(que)点(dian)
SPI接口(kou)具有如下优点:
1) 支(zhi)持全(quan)双工操作;
2) 操作简单;
3) 数据传输速率较高。
同时,它也具有如下缺点:
1) 需(xu)要占用主机较多的(de)口线(每个从(cong)机都(dou)需(xu)要一(yi)根片选(xuan)线);
2) 只支持单个主机。