SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
标准的SPI接口有四个线,分别为CS,SCLK,MOSI和MISO;如下图:
下面我们根据问题来进一步熟悉这个模块:
1、主机发送了正确的数据出去,却收不到从机的回复?
可能是主机没有发送SCLK。在SPI通信中,时钟线SCLK是由主机控制,只有SCLK持续发送,才能实现数据的传输。如果主机在发送了数据后,不再持续发送时钟信号,那么从机也将回复不了数据。
排查方法:用示波器量SCLK,确认主机会在从机回复数据时,有SCLK信号输出
2、SPI可以实现一个主机对多个从机吗?
可以。通过CS脚,可以实现一个主机分时与不同从机的通信,如下图:
3、SPI主机与从机可以通信,但收发的数据却是错的?
可能是CPOL或CPHA没设置好。下面详细介绍一下这两个配置:
a、极性(CPOL):Clock Polarity时钟极性
先说什么是SCLK时钟的空闲时刻,其就是当SCLK在数发送8个bit比特数据之前和之后的状态,于此对应的,SCLK在发送数据的时候,就是正常的工作的时候,有效active的时刻了。
先说英文,其精简解释为:Clock Polarity = IDLE state of SCK。
再用中文详解:
SPI的CPOL,表示当SCLK空闲idle的时候,其电平的值是低电平0还是高电平1:
CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high;
CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low;
如图:
b、相位(CPHA):Clock Phase时钟相位
表示数据采集,数据有效的时刻。相位,对应这数据采集是在第几个边沿(edge),是第一个边沿还是第二个边沿,0对应第一个边沿,1对应第二个边沿。
对于:
CPHA=0,表示第一个边沿:
对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿;
对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿;
CPHA=1,表示第二个边沿:
对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿;
对于CPOL=1,idle时候的是高电平,第一个边沿就是从低变到高,所以是上升沿; 如图:
下图是CPHA = 0情况下,CPOL为0或者为1的时序图:
下图是CPHA = 1情况下,CPOL为0或者为1的时序图:
怎么确定设置CPOL跟CPHA的值?
SPI分主机和从机,两者通过SPI协议通讯。
而设置SPI的模式,是从机的模式,决定了主机的模式。
所以要先去搞懂从机的SPI是何种模式,然后再将主机的SPI的模式,设置和从机相同的模式,即可正常通讯 如果SPI从机通信序列是固定的,相关的datasheet中会有描述,需要自己去datasheet中找到相关的描述。 如果SPI从机也是SPI控制器,模式可调,则主机跟从机调成同一种模式即可。
|