SPI总线
(1)MOSI – 主器件数据输出,从器件数据输入
(2)MISO – 主器件数据输入,从器件数据输出
(3)SCLK –时钟信号,由主器件产生,最大为fPCLK/2,从模式频率最大为fCPU/2
(4)NSS/CS – 从器件使能信号,由主器件控制,有的IC会标注为CS(Chip select)
1. 接线
主设备——从设备
SCLK——SCLK
NSS/CS——NSS/CS
MOSI——SDI
MISO——SDO
2. 协议
- 一对多(单主设备,通过多个使能端,连接多个SPI从设备)
- 当SS为低电平时有效(0),选中从设备
2.1 四种模式
-
CPOL(时钟极性)和CPHA(时钟相位)意义
CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿 -
通过CPOL和CPHA来控制我们主设备的通信模式
发送和接收设备需要根据实际情况分析 (发送设备 ≠ 主设备)
Mode0:CPOL=0,CPHA=0
SCLK(0)空闲;
当SCLK由低到高跳变(上升沿),(接收设备)进行数据的读取;
当SCLK由高到低跳变(下降沿),(发送设备)进行数据的发送;
Mode1:CPOL=0,CPHA=1
SCLK(0)空闲;
当SCLK由高到低跳变(下降沿),(接收设备)进行数据的读取;
当SCLK由低到高跳变(上升沿),(发送设备)进行数据的发送;
Mode2:CPOL=1,CPHA=0
SCLK(1)空闲;
当SCLK由高到低跳变(下降沿),(接收设备)进行数据的读取;
当SCLK由低到高跳变(上升沿),(发送设备)进行数据的发送;
Mode3:CPOL=1,CPHA=1
SCLK(1)空闲;
当SCLK由低到高跳变(上升沿),(接收设备)进行数据的读取;
当SCLK由高到低跳变(下降沿),(发送设备)进行数据的发送;
2.2传输数据步骤如下
- 开始条件:NSS为低电平(0)
- 发送数据:从最高位开始(MSB)
Mode0和Mode2
是在第一个边沿时就进行数据的读取,所以bit1的输出是在第一个边沿之前就发送
Mode1和Mode3
是在第二个边沿时就进行数据的读取,所以bit1的输出是在第一个边沿时就发送
发送的数据需要看相应的Datasheet,我遇到过数据一部分从最低位LSB开始(坑的要死,可能是大小端问题?) - 结束条件:NSS为高电平(1)