SPI是一种高速的、全双工、同步通信总线,并且只占用四根线,常用来和FLASH、数字信号处理器等通信。SPI通信要比I2C简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常也只需要四根线,分别都是 CS(片选使能)、SCLK(时钟信号)、MOSI(主机输出从机输入)、MISO(主机输入从机输出)
SPI使用也是非常灵活的也可以使用2根线或3根线进行通信。列如当主机只给从机发送命令,而从机福需要回复数据给主机的时候,就可以不要MISO,有时当变片选信号固定为有效电平时CS(片选使能)就可以不要,这样就可以实现2根线也可通信,3根线也可以通信了。一般标准的还是4根线进行SPI通信。
SPI接口有四种不同的数据通信时序,取决于CPOL和CPHL这两位的组合。
CPOL:Clock Polarity 是时钟的极性。,什么是时钟极性,在通信的过程中分为空闲时刻和通信时刻,如果在空闲时刻为高电平那么CPOL=1,如果空闲时刻为低电平那么CPOL=0;
CPHA: Clock Phase 是时钟的相位,时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。
当CPHA=0 表示数据的采样是在一个时钟周期的第一个沿上(至于是上升沿或下降沿由CPOL决定),那么数据的输出就是在第二个沿上了。
当CPHA=1表示数据的采样是在一个时钟周期的第二个沿上(至于是上升沿或下降沿由CPOL决定),那么数据的输出就是在第一个沿上了。
如下图:
![31ad3c52f22d2e5cb47daf7e9a3c9caa.png](https://i-blog.csdnimg.cn/blog_migrate/8216b5b83b0ab853e86cc14c67a26b7e.jpeg)
CPOL=0,CPHA=0,空闲状态下SCK为低电平,数据采集是在第一个沿上(SCK由低电平变为高电平)所以数据采集是在上升沿,数据的输出是在第二个沿上的下降沿。
![a6b3c18dc3b6d5d02fe08499e465d7d6.png](https://i-blog.csdnimg.cn/blog_migrate/230dd7032323a9d98da9c3e4db4011f7.jpeg)
CPOL=1,CPHA=0,空闲状态下SCK为高电平,数据采集是在第一个沿上(SCK由高电平变为低电平)所以数据采集是在下将沿,数据的输出是在第二个沿上的上升沿。
![48bc6917c3b52ae3924ef35febf4244b.png](https://i-blog.csdnimg.cn/blog_migrate/90322ab6f16ecd9933b4550f2edf00e8.jpeg)
CPOL=0,CPHA=1,空闲状态下SCK为低电平,数据采集是在第二个沿上(SCK由高电平变为低电平)所以数据采集是在下将沿,数据的输出是在第一个沿上的上升沿。
![5bb058d19217770cb75e734a6dd9102f.png](https://i-blog.csdnimg.cn/blog_migrate/1f14fa8396942804fb37401573aad53e.jpeg)
CPOL=1,CPHA=1,空闲状态下SCK为高电平,数据采集是在第二个沿上(SCK由低电平变为高电平)所以数据采集是在上升沿,数据的输出是在第一个沿上的下降沿。
下面我们以51单片机为例编写CPOL=1,CPHA=1时相应的代码
Unsigned char SPI_ReadWriteByte(unsigned char Dat)
{
unsigned char temp=0;
unsigned char i=0;
SPI_SCK =1;//空闲高电平
for(i=0;i<8;i++)
{
if((Dat&0X80))
MOSI_OUT=1; //输出高电平1
else
MOSI_OUT=0; //输出低电平0
Dat<<=1; //数据左移一位
SPI_SCK =0; //第一个下降沿输出数据
Temp<<=1; //数据左移一位
if(MISO)temp++; //采集从设备返回来的数据,然后拉高时钟
SPI_SCK =1; 第二个上升沿采集数据
}
SPI_SCK=1;//空闲高电平
return temp;
}
写数据首先要片选使能从设备然后给从设备发送数据,等数据传输完成后,取消片选
Void SPI_Write_Data(unsigned char dat)
{
Unsigned char value=0;
SPI_CS=0;
value=SPI_ReadWriteByte(dat);//主设备向从设备发送数据,并返回从设备发送过来的数据。
SPI_CS=1;
}
喜欢的朋友支持关注和转发。