
SPI时钟模式的配置.pdf
5页SPI基础知识简介】设备与设备之间通过某种硬件接口通讯,目前存在很多种接口,SPI 接口是其中的一种SPI 中分 Master 主设备和 Slave 从设备,数据发送都是由 Master 控制一个 master 可以接一个或多个 slave常见用法是一个 Master 接一个 slave,只需要 4 根线:SCLK:SerialClock, (串行)时钟MISO:MasterInSlaveOut,主设备输入,从设备输出MOSI:MasterOutSlaveIn,主设备输出,从设备输入SS:SlaveSelect,选中从设备,片选SPI 由于接口相对简单(只需要4 根线) ,用途算是比较广泛,主要应用在EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间即一个 SPI 的 Master 通过 SPI 与一个从设备,即上述的那些 Flash,ADC 等,进行通讯而主从设备之间通过 SPI 进行通讯,首先要保证两者之间时钟 SCLK 要一致,互相要商量好了,要匹配,否则,就没法正常通讯了,即保证时序上的一致才可正常讯而这里的 SPI 中的时钟和相位,指的就是 SCLk 时钟的特性,即保证主从设备两者的时钟的特性一致了,以保证两者可以正常实现 SPI 通讯。
SPI 相关的缩写或说法】先简单说一下,关于 SPI 中一些常见的说法:SPI 的极性 Polarity 和相位 Phase,最常见的写法是CPOL 和 CPHA,不过也有一些其他写法,简单总结如下:(1)CKPOL(ClockPolarity)=CPOL=POL=Polarity=(时钟)极性(2)CKPHA(ClockPhase)=CPHA=PHA=Phase=(时钟)相位(3)SCK=SCLK=SPI 的时钟(4)Edge=边沿,即时钟电平变化的时刻,即上升沿(risingedge)或者下降沿(fallingedge)对于一个时钟周期内,有两个 edge,分别称为:Leadingedge=前一个边沿=第一个边沿,对于开始电压是 1,那么就是 1 变成 0 的时候,对于开始电压是 0,那么就是 0 变成 1 的时候;Trailingedge=后一个边沿=第二个边沿,对于开始电压是1,那么就是0 变成 1 的时候(即在第一次 1 变成 0 之后,才可能有后面的 0 变成 1) ,对于开始电压是 0,那么就是 1 变成 0 的时候;本文采用如下用法:极性=CPOL相位=CPHASCLK=时钟第一个边沿和第二个边沿【SPI 的相位和极性】CPOL 和 CPHA,分别都可以是 0 或时 1,对应的四种组合就是:Mode0CPOL=0,CPHA=0Mode1CPOL=0,CPHA=1Mode2CPOL=1,CPHA=0Mode3CPOL=1,CPHA=1【CPOL 极性】先说什么是 SCLK 时钟的空闲时刻,其就是当 SCLK 在数发送 8 个 bit 比特数据之前和之后的状态,于此对应的,SCLK 在发送数据的时候,就是正常的工作的时候,有效 active 的时刻了。
先说英文,其精简解释为:ClockPolarity=IDLEstateofSCK再用中文详解:SPI 的 CPOL,表示当 SCLK 空闲 idle 的时候,其电平的值是低电平 0 还是高电平 1:CPOL=0,时钟空闲idle 时候的电平是低电平,所以当 SCLK 有效的时候,就是高电平,就是所谓的active-high;CPOL=1,时钟空闲idle 时候的电平是高电平,所以当 SCLK 有效的时候,就是低电平,就是所谓的active-low;【CPHA 相位】首先说明一点,capturestrobe=latch=read=sample,都是表示数据采样,数据有效的时刻相位,对应着数据采样是在第几个边沿(edge) ,是第一个边沿还是第二个边沿,0 对应着第一个边沿,1 对应着第二个边沿对于:CPHA=0,表示第一个边沿:对于 CPOL=0,idle 时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;对于 CPOL=1,idle 时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;CPHA=1,表示第二个边沿:对于 CPOL=0,idle 时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;对于 CPOL=1,idle 时候的是高电平,第一个边沿就是从低变到高,所以是上升沿;此处,再多解释一下可能会遇到的 CKP 和 CKE,其是 Microchip 的 PIC 系列芯片中的说法。
1)CKP 是 ClockPolaritySelect,就是极性=CPOL:CKP,虽然名字和 CPOL 不一样,但是都是指时钟相位的选择,定义也一样:CKP:ClockPolaritySelectbit1=Idlestateforclock(CK)isahighlevel0=Idlestateforclock(CK)isalowlevel所以不多解释2)CKE 是 ClockEdgeSelect,就是相位=CPHA:CKE:SPIClockEdgeSelectbit1=TransmitoccursontransitionfromactivetoIdleclockstate0=TransmitoccursontransitionfromIdletoactiveclockstate意思是1=(数据)传输发生在时钟从有效状态转到空闲状态的那一时刻0=(数据)传输发生在时钟从空闲状态转到有效状态的那一时刻其中,数据传输的时刻,即图中标出的“数据transmit 传输的时刻” ,很明显,该时刻是一个时钟和下一个时钟之间交界的地方,对应的不论是上升沿还是下降沿,都与我们前面提到的CPHA=数据采样的时刻,的边沿方向所相反。
所以,此处的 CKE,正好与 CPHA 相反所以,CKP 和 CKE 所对应的取值的含义为:WhenCKP=0:CKE=1=>DatatransmittedonrisingedgeofSCKCKE=0=>DatatransmittedonfallingedgeofSCKWhenCKP=1:CKE=1=>DatatransmittedonfallingedgeofSCKCKE=0=>DatatransmittedonrisingedgeofSCK【如何看懂和记忆 CPOL 和 CPHA】所以,关于在其他地方介绍的,看似多么复杂难懂难记忆的CPOL 和 CPHA,其实经过上面解释,就肯容易看懂了:去看时序图,如果起始的始终 SCLK 的电平是 0,那么 CPOL=0,如果是 1,那么 CPOL=1,然后看数据采样时刻,即时序图数据线上的数据那个矩形区域的中间所对应的位置,对应到上面SCLK 时钟的位置,对应着是第一个边沿或是第二个边沿,即 CPHA 是 0 或 1 (对应的是上升沿还是还是下降沿,要根据对应的 CPOL 的值,才能确定) 即:(1)如何判断 CPOL:SCLK 的空闲时候的电压,是 0 还是 1,决定了 CPOL 是 0 还是 1;(2)如何判断 CPHA:而数据采样时刻对应着的 SCLK 的电平,是第一个边沿还是第二个边沿,对应着 CPHA 为 0 还是 1。
SCLK 的极性,相位,边沿之间的内在逻辑关系SCLK 空闲时刻电压低电平CPOL=0高电平CPOL=1数据采样时刻,SCLK 的 edge 是第一个还是第二个第一个边沿CPHA=0上升沿(开始的电平是低电压 0,而第一个边沿,只能是从 0 变到 1,即上升沿)下降沿第二个边沿CPHA=1 下降沿上升沿(开始电平是高电平1,第二个边沿,肯定是从低电平0 变到高电平 1,因为第一个边沿肯定是从高电平 1,变到低电平 0)【软件中如何设置 SPI 的极性和相位】SPI 分主设备和从设备,两者通过 SPI 协议通讯而设置 SPI 的模式,是从设备的模式,决定了主设备的模式所以要先去搞懂从设备的 SPI 是何种模式, 然后再将主设备的 SPI 的模式, 设置和从设备相同的模式,即可正常通讯对于从设备的 SPI 是什么模式,有两种:(1)固定的,有 SPI 从设备硬件决定的SPI 从设备,具体是什么模式,相关的datasheet 中会有描述,需要自己去datasheet 中找到相关的描述,即:关于 SPI 从设备,在空闲的时候,是高电平还是低电平,即决定了 CPOL 是 0 还是 1;然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了 CPOL 的值的前提下,对应着可以推算出 CPHA 是 0 还是 1 了。
举例 1:的 datasheet 中 SPI 的时序图从图中可以看到,最开始的SCLK 和结束时候的 SCLK,即空闲时刻的SCLK,是低电平,推导出 CPOL=0,然后可以看到数据采样的时候,即数据最中间的那一点,对应的是 SCLK 的第一个边沿,所以 CPHA=0(此时对应的是上升沿) 举例 2:SSD1289-240RGBx320TFTLCDControllerDriver 的 datasheet 中提到:“SDIisshiftedinto8-bitshiftregisteroneveryrisingedgeofSCKintheorderofdatabit7,databit6……databit0.”意思是,数据是在上升沿采样,所以可以断定是 CPOL=0,CPHA=0,或者 CPOL=1,CPHA=1 的模式,但是至于是哪种模式按理来说,接下来应该再去确定 SCLK 空闲时候是高电平还是低电平,用以确定 CPOL 是 0 还是 1,但是 datasheet 中没有提到这点所以,此处,目前不太确定,是两种模式都支持,还是需要额外找证据却确定 CPOL 是 0 还是 1.(2)可配置的,由软件自己设定从设备也是一个 SPI 控制器,4 种模式都支持,此时只要自己设置为某种模式即可。
然后知道了从设备的模式后,再去将 SPI 主设备的模式,设置为和从设备模式一样,即可对于如何配置 SPI 的 CPOL 和 CPHA 的话, 不多细说, 多数都是直接去写对应的 SPI 控制器中对应寄存器中的 CPOL 和 CPHA 那两位,写 0 或写 1 即可举例:此处遇到的 C8051F347 中的 SPI 就是一个 SPI 的 controller 控制器, 即支持软件配置 CPOL 和 CPHA的值,四种模式都支持,此处C8051F347 作为 SPI 从设备,设置了CPOL=1,CPHA=0 的模式,因此,此处对应主芯片 BlackfinF537 中的 SPI 控制器,作为 Master 主设备,其 SPI 的模式也要设置为CPOL=1,CPHA=0待解决问题】对于软件去如何设置主设备(和从设备) 的 CPOL 和 CPHA 的值,是搞懂了,知道两者要匹配才可以正常通讯,但是对于CPOL 和 CPHA 这四种模式,不同的模式之间,相对来说有何优缺点,比如是否哪种模式更稳定,数据更不容易出错等等,还是不清楚【总结】方面的资料,国内的,还是把问题讲明白的太少,想搞懂问题,还是得去找英文的。
2.有问题,指望别人,还是不行的,凡事还是得指望自己,才有用。
