【SPI的相位和极性】
CPOL和CPHA,分别都可以是0或时1,对应的四种组合就是:
Mode 0 | CPOL=0, CPHA=0 | Mode 1 | CPOL=0, CPHA=1 | Mode 2 | CPOL=1, CPHA=0 | Mode 3 | CPOL=1, CPHA=1 |
arm 常用的接口总结" width="371"> 结合这个图已经很清楚的认识到,极性和相位主要是控制什么东东了.cpol等于0时,时钟的空闲电平就是0;cpol等于1时,空闲电平就是1;而cpha决定了数据采样的时刻,是第一个边沿的时候,还是第二个边沿的时候。 【如何看懂和记忆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。
【软件中如何设置SPI的极性和相位】
SPI分主设备和从设备,两者通过SPI协议通讯。
而设置SPI的模式,是从设备的模式,决定了主设备的模式。
所以要先去搞懂从设备的SPI是何种模式,然后再将主设备的SPI的模式,设置和从设备相同的模式,即可正常通讯。
对于从设备的SPI是什么模式,有两种:
(1)固定的,有SPI从设备硬件决定的
SPI从设备,具体是什么模式,相关的datasheet中会有描述,需要自己去datasheet中找到相关的描述,即:
关于SPI从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL是0还是1;
然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了CPOL的值的前提下,对应着可以推算出CPHA是0还是1了。
举例1:
CC2500 - Low-Cost Low-Power 2.4 GHz RFTransceiver的datasheet中SPI的时序图是:
arm 常用的接口总结" width="576">
从图中可以看到,最开始的SCLK和结束时候的SCLK,即空闲时刻的SCLK,是低电平,推导出CPOL=0,然后可以看到数据采样的时候,即数据最中间的那一点,对应的是SCLK的第一个边沿,所以CPHA=0(此时对应的是上升沿)。
举例2:
SSD1289 - 240 RGB x 320 TFT LCDController Driver的datasheet中提到:
“SDI is shifted into 8-bit shift register onevery rising edge of SCK in the order of data bit 7, data bit 6 ……data bit 0.”
意思是,数据是在上升沿采样,所以可以断定是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。
|