SPI是最常见的全双工同步串行通讯总线之一,经常用在单片机与外围芯片的数据通信中,通信速率最大可以达到几十Mbps,但是具体采用多高的通信速率还需要结合接收和发送器本身的最高速率的通信能力来设计,SPI通常使用4条线,时钟线SCK、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI 和从机选择线CS。
如果采用STM32单片机在进行SPI总线配置时,除了需要对主从模式、数据位、及速率等参数的配置以外,还需要对SPI的时钟极性(CPOL)和时钟相位(CPHA)进行配置,前面的都好理解,可是很多人对于后面的时钟极性和时钟相位一直不是很明白是做什么用的。
SPI总线时钟的极性就是来表示时钟信号在空闲时是高电平还是低电平。当CPOL=0:SCK信号线在空闲时为低电平;当CPOL=1:SCK信号线在空闲时为高电平;时钟的相位是用来决定何时进行信号采样,在第一个跳变沿还是第二个跳变沿,CPHA=0,表示第一个边沿,CPHA=1,表示第二个边沿,所以按照排列组合,就有四种模式,即: 模式1:配置CPOL=0, CPHA=0:空闲时为CLK为低电平,第一个边沿为从低到高,开始进行信号采集; 模式2:配置CPOL=1, CPHA=0:空闲时为CLK为高电平,第一个边沿为从高到低,开始进行信号采集; 模式3:配置CPOL=0, CPHA=1:空闲时为CLK为低电平,第二个边沿为从高到低,开始进行信号采集; 模式4:配置CPOL=1, CPHA=1:空闲时为CLK为高电平,第二个边沿为从低到高,开始进行信号采集;
知道了极性和相位的作用,那么在配置时具体是配置成什么模式,还是要分析通信的时序图,按照时序图中数据线与CLK时钟线的关系进行选择时钟极性与相位。很多人在初次设计时,以单片机作为主机,配置好了SPI各项参数之后,最后与从机芯片通讯不成功,很大一部分原因就是因为没有仔细查看从机芯片的手册时序图,导致这里的时钟极性和时钟相位配置不对,这是最容易被忽略的地方。
采用单片机片上的SPI外设需要进行这些配置,如果是采用模拟时序是不是就没有时钟极性与相位的关系要求了,也并不是的,因为模拟SPI不管是在数据的写函数SPI_write和数据的读取函数SPI_read中都对CLK的状态进行了提前设置高电平还是提前设置了低电平,其实道理是一样的,都是为了让数据符合与时钟线对应的关系。 但是模拟SPI时序时有很多需要注意的地方,因为模拟时序不像配置片内SPI一样可以配置好SPI的速度,所以在数据的读写函数中一般要控制时间,也就是单片机的运行时间与SPI的总线时间做到匹配,比如SPI的速率很低,但是单片机的运行速度很高,往往在SPI时许中需要进行延时处理来降低总线的速度,如果SPI的速度已经远远高于单片机的运行速度,一般的就不需要进行延时处理了。
|