Bootstrap

SPI中的CPOL和CPHA

SPI中的CPOL和CPHA,是学习SPI必须掌握的知识,因为它涉及到“数据位采集”。重点掌握空闲时SCK的电平是怎么定义的。采集时,是怎么规定发生在哪个时钟边沿。CPOL用来决定SPI总线在空闲时,SPI_SCK引脚输出的电平;CPHA用来决定“数据位采集点”发生在第几边沿。

什么叫“SPI总线空闲”?
对于SPI主机来说,就是没有数据传输,即:不发送数据,也不接收数据,这种总线的状态叫空闲状态
SPI外设初始化完成后,SPI总线处于空闲状态,既不发送数据也不接收数据。
SPI_SCK引脚的输出电平是由CPOL位来决定。
CPOL=0,表示SPI总线在空闲时,SPI_SCK引脚输出低电平;
CPOL=1,表示SPI总线在空闲时,SPI_SCK引脚输出高电平;

什么是SPI时钟的第1边沿?
SPI总线从空闲状态进入传输数据时,出现的“第1个边沿”
“第1个边沿”是上升沿,还是下降沿,要看CPOL的值。
CPOL=0,SPI_SCK引脚在SPI总线空闲时输出的是低电平,那么“SPI时钟的第1边沿”就是上升沿。
CPOL=1,SPI_SCK引脚在SPI总线空闲时输出的是高电平,那么“SPI时钟的第1边沿”就是下降沿。

什么是SPI时钟的第2边沿?
SPI总线从空闲状态进入传输数据时,出现的“第2个边沿”
“第2个边沿”是上升沿,还是下降沿,要看CPOL的值。
CPOL=0,SPI_SCK引脚在SPI总线空闲时输出的是低电平,那么“SPI时钟的第2边沿”就是下降沿。
CPOL=1,SPI_SCK引脚在SPI总线空闲时输出的是高电平,那么“SPI时钟的第2边沿”就是上升沿。

为了保证SPI硬件协议得以实现,约定使用“CPHA位的值”来决定采集点
CPHA=0表示在“SPI时钟的第1边沿”处采集数据;
CPHA=1表示在“SPI时钟的第2边沿”处采集数据;

小结:

下面这张图,做过SPI通讯的,一般都见过,但是真正看懂的人不多。我和大家一样,人云亦云,看久了,就会明白了。

上面的图,是把两种情况合在一起,看起来很费劲。若拆开了,就好懂了。见下图:

 图中有文字,一看就知道了,不用再去看定义了。从上图可以看出,SPI总是先移出数据的最高位,这里是对SPIx_CR1寄存器bit7(LSBFIRST)进行配置,LSBFIRST=0,表示先传送最高位。但是若令LSBFIRST=1,表示先传送最低位。

在有些公司面试时,有时会遇到SPI波形图,让我们根据波形图去读数据,这时,如果不懂“SPI中的CPOL和CPHA”的意义,就很麻烦。即使你会编程,也会被淘汰。

以上是我个人的理解,若有错误之处,请给我留言。

;