1. 硬件原理
1.1 SPI通信协议
-
SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
-
四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)
-
同步,全双工
-
支持总线挂载多设备(一主多从)
1.2 硬件连接
- 多NSS独立片选方式
- 菊花链方式
引脚 | 含义 |
---|---|
DO(MOSI) | Master Output, Slave Input, SPI主控用来发出数据,SPI从设备用来接收数据,输出引脚设置为推挽输出 |
DI(MISO) | Master Input, Slave Output, SPI主控用来发出数据,SPI从设备用来接收数据,输入引脚设置为浮空或上拉输入,从机不输出时为高阻态。 |
SCK | Serial Clock,时钟 |
CS | Chip Select,芯片选择引脚,NSS 信号线由高变低,是 SPI 通讯的起始信号。NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。 |
移位寄存器示意图


1.3 时序
- 起始:CS从高到低
- 终止:CS从低到高
SPI的时钟极性CPOL和时钟相位CPHA可以分别为0或1,由此构成了四种组合:
CPOL | CPHA | 模式 | 含义 |
---|---|---|---|
0 | 0 | 0 | CLK初始电平为低电平,在第一个时钟沿采样数据 |
0 | 1 | 1 | CLK初始电平为低电平,在第二个时钟沿采样数据 |
1 | 0 | 2 | CLK初始电平为高电平,在第一个时钟沿采样数据 |
1 | 1 | 3 | CLK初始电平为高电平,在第二个时钟沿采样数据 |
常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。
IIC有效字节流数据第一个字节是寄存器地址,之后是读写的数据,使用的是读写寄存器模型
SPI用指令码加读写数据模型,发送指令字节的方式来读取,从机中有指令集对应,
发送指令。
指定地址读。
指定地址写。
1.4 代码
IO模拟
void MySPI_Start(void)
{
MySPI_W_SS(0);
}
void MySPI_Stop(void)
{
MySPI_W_SS(1);
}
uint8_t MySPI_SwapByte(uint8_t ByteSend) //交换字节,发送的话就不需要读取返回值,接收的话就发送0XFF接收返回的数据。
{
uint8_t i, ByteReceive = 0x00;
for (i = 0; i < 8; i ++) //模式0,其他模式对着时序图换一下MySPI_W_SCK就行
{
MySPI_W_MOSI(ByteSend & (0