我是靠谱客的博主 朴实往事,最近开发中收集的这篇文章主要介绍重度理解SPI(半原创),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述



重度理解SPI总线

  

本文是在参考了许多文章之上总结出来的(文章最后会附上参考文章的出处),作者呼吁保护原创权益,希望广大电子爱好者在学习知识的同时珍惜作者的劳动成果。

                                                                                                                      -----NJ_BIGCAT

一、概念(什么是SPI

设备与设备之间通过某种硬件接口通讯,目前存在很多种接口,SPI接口是其中的一种。SPI是串行外设接口(Serial Peripheral Interface)的缩写,是Motorola公司推出的一种同步串行接口技术。SPI是一种高速的,全双工,以同步串行方式的通信总线,SPI接口只占用四根线:SCKMOSIMISOSS

SPI中分Master主设备和Slave从设备,数据发送都是由Master控制。一个master可以接一个或多个slave,常见用法是一个Master接一个slave

 

二、用途(用来干什么)

SPI由于接口相对简单(只需要4根线),用途算是比较广泛,主要应用在 EEPROMFLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。即一个SPI主设备(Master)与一个SPI从设备(slave,即上述的那些FlashADC)进行通讯。

 

三、SPI工作原理

14根线:

SCLKSerial Clock         串行时钟,由主设备提供(有的叫SCK

MISOMaster In Slave Out 主设备输入,从设备输出(有的叫SDI,串行数据输入)

MOSIMaster Out  Slave In 主设备输出,从设备输入(有的叫SDO,串行数据输出)

SS   Slave Select        选中从设备,片选(有的叫CS

2)工作原理:

通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDISDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

主从设备之间通过SPI进行通讯,首先要保证两者之间时钟SCLK要一致,互相要商量好了,要匹配,否则,就没法正常通讯了,即保证时序上的一致才可正常通讯。

 

先简单说一下,关于SPI中一些常见的说法:

SPI的极性Polarity和相位Phase(这里的SPI中的时钟和相位,指的就是SCLK时钟的特性,即保证主从设备两者的时钟的特性一致了,以保证两者可以正常实现SPI通讯),最常见的写法是CPOLCPHA,不过也有一些其他写法,简单总结如下:

(1) CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性

(2) CKPHA (Clock Phase)   = CPHA = PHA = Phase = (时钟)相位

(3) SCK=SCLK=SPI的时钟

(4) Edge=边沿,即时钟电平变化的时刻,即上升沿(rising edge)或者下降沿(falling edge)

对于一个时钟周期内,有两个edge,分别称为:

Leading edge=前一个边沿=第一个边沿,对于开始电压是1,那么就是1变成0的时候,对于开始电压是0,那么就是0变成1的时候。

Trailing edge=后一个边沿=第二个边沿,对于开始电压是1,那么就是0变成1的时候(即在第一次1变成0之后,才可能有后面的0变成1),对于开始电压是0,那么就是1变成0的时候。

 

本文采用如下用法:

极性=CPOL

相位=CPHA

SCLK=时钟

第一个边沿和第二个边沿

 

SPI的相位和极性】

CPOLCPHA,分别都可以是0或时1,对应的四种组合(即SPI的四种模式)就是:

Mode 0CPOL=0, CPHA=0

Mode 0CPOL=0, CPHA=1

Mode 0CPOL=1, CPHA=0

Mode 0CPOL=1, CPHA=1

 

 

结合上图与下面的详细解释,你应该会理解清楚。

【 CPOL极性】

先说什么是SCLK时钟的空闲时刻,其就是当SCLK在数发送8bit比特数据之前和之后的状态(即没有进行数据传输的时候),于此对应的,SCLK在发送数据的时候,就是正常的工作的时候,有效active的时刻了。

先说英文,其精简解释为:Clock Polarity = IDLE state of SCK

再用中文详解:

SPICPOL,表示当SCLK空闲idle的时候,其电平的值是低电平0还是高电平1

CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high

CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low

【 CPHA相位】

首先说明一点,capture strobe = latch = read = sample,都是表示数据采样,数据有效的时刻。

相位,对应着数据采样是在第几个边沿(edge),是第一个边沿还是第二个边沿,0对应着第一个边沿,1对应着第二个边沿。

对于:

CPHA=0,表示第一个边沿:

对于CPOL=0idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;

对于CPOL=1idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;

CPHA=1,表示第二个边沿:

对于CPOL=0idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;

对于CPOL=1idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;

 

用图文形式表示,更加容易看懂: 

 

注意:有些地方对于相位和极性的英文简写不同,但是其代表的含义是一样的。

下面再列出其他一些地方找到的,常见的SPI的四种模式的时序图,供参考:

 

【如何看懂和记忆CPOLCPHA

看似多么复杂难懂难记忆的CPOLCPHA,其实经过上面解释,就肯容易看懂了:

去看时序图,如果起始和最终的SCLK的电平是0,那么CPOL=0,如果是1,那么CPOL=1

然后看数据采样时刻,即时序图数据线上的数据那个矩形区域的中间所对应的位置,对应到上面SCLK时钟的位置,对应着是第一个边沿或是第二个边沿,即CPHA01。(对应的是上升沿还是还是下降沿,要根据对应的CPOL的值,才能确定)。

即:

1)如何判断CPOLSCLK的空闲时候的电压,是0还是1,决定了CPOL0还是1

2)如何判断CPHA:而数据采样时刻对应着的SCLK的电平,是第一个边沿还是第二个边沿,对应着CPHA0还是1

【软件中如何设置SPI的极性和相位】

SPI分主设备和从设备,两者通过SPI协议通讯。

而设置SPI的模式,是从设备的模式,决定了主设备的模式。

所以要先去搞懂从设备的SPI是何种模式,然后再将主设备的SPI的模式,设置和从设备相同的模式,即可正常通讯。

 

对于从设备的SPI是什么模式,有两种:

1)固定的,有SPI从设备硬件决定的

SPI从设备,具体是什么模式,相关的datasheet中会有描述,需要自己去datasheet中找到相关的描述,即:

关于SPI从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL0还是1

然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了CPOL的值的前提下,对应着可以推算出CPHA0还是1了。

举例1

CC2500 - Low-Cost Low-Power 2.4 GHz RF TransceiverdatasheetSPI的时序图是:

 

从图中可以看到,最开始的SCLK和结束时候的SCLK,即空闲时刻的SCLK,是低电平,推导出CPOL=0,然后可以看到数据采样的时候,即数据最中间的那一点,对应的是SCLK的第一个边沿,所以CPHA=0(此时对应的是上升沿)。


 

举例2

SSD1289 - 240 RGB x 320 TFT LCD Controller Driverdatasheet中提到:

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.

意思是,数据是在上升沿采样,所以可以断定是CPOL=0CPHA=0,或者CPOL=1CPHA=1的模式,但是至于是哪种模式。

按理来说,接下来应该再去确定SCLK空闲时候是高电平还是低电平,用以确定CPOL0还是1,但是datasheet中没有提到这点。

所以,此处,目前不太确定,是两种模式都支持,还是需要额外找证据却确定CPOL0还是1.


 

2)可配置的,由软件自己设定

从设备也是一个SPI控制器,4种模式都支持,此时只要自己设置为某种模式即可。

然后知道了从设备的模式后,再去将SPI主设备的模式,设置为和从设备模式一样,即可。


 

对于如何配置SPICPOLCPHA的话,不多细说,多数都是直接去写对应的SPI控制器中对应寄存器中的CPOLCPHA那两位,写0或写1即可。

举例:

此处遇到的C8051F347中的SPI就是一个SPIcontroller控制器,即支持软件配置CPOLCPHA的值,四种模式都支持,此处C8051F347作为SPI从设备,设置了CPOL=1CPHA=0的模式,因此,此处对应主芯片Blackfin F537中的SPI控制器,作为Master主设备,其SPI的模式也要设置为CPOL=1CPHA=0

 

 

注意:对于SPI通讯速度,SPI协议本身并没有规定最高速度,完全是通信双方的能力限制,一般的实现通常能达到甚至超过10 Mbps

四、加深理解的图片

 

这个网址有动画演示:http://bbs.elecfans.com/jishu_441914_1_1.html

五、参考文章出处

http://blog.chinaunix.net/uid-20620288-id-3164384.html

http://bbs.elecfans.com/jishu_441914_1_1.html

http://my.oschina.net/freeblues/blog/67400

http://blog.csdn.net/skyflying2012/article/details/11710801

http://blog.csdn.net/md521/article/details/6775618

http://baike.baidu.com/subview/140064/140064.htm

http://baike.baidu.com/link?url=huXhgqPnAfQqmHOy9KaHhlKEUnsiZ0j1bmvvxdeqHqLNu4Kdz7Qj1rPIenl7GdZK5M3BNjU3CyOrl2P3tvgsS_

2015.11.8

NJ_BIGCAT

 

 

最后

以上就是朴实往事为你收集整理的重度理解SPI(半原创)的全部内容,希望文章能够帮你解决重度理解SPI(半原创)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部