文章目录
一、SPI通信
- SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
- 四根通信线:SCK(Serial Clock)【CLK或SCL】、MOSI(Master Output Slave Input)【DO(Data Output)】、MISO(Master Input Slave Output)【DI(Data Input)】、SS(Slave Select)【CS或NSS】
- 同步,全双工
- 支持总线挂载多设备(一主多从)
- 最大传输速度取决于芯片厂商设计需求,比I2C最大400KHZ快
- SPI硬件开销较大,通信线个数较多
- SS(Slave Select)从机选择线(可以不止一条),专门用来指定通信的从机地址,相比于I2C在起始条件后的寻址操作方便
二、硬件电路
- 所有SPI设备的SCK、MOSI、MISO分别连在一起
- 主机另外引出多条SS控制线,分别接到各从机的SS引脚【低电平有效】
输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入
- 需要共地
- 对比I2C的输出引脚配置为复用开漏输出,因为是半双工要切换输入输出,且实现多主机的时钟同步和总线仲裁,容易电源短路
- 当从机的SS引脚为高电平时,MISO必须切换为高阻态
三、移位示意图
高电平:移位输出
低电平:采样输入
SPI的数据收发都是基于字节交换
这个基本单元进行的
如果只要读取从机数据时:主机可以发送0X00或0XFF去和从机换数据
四、SPI时序基本单元
起始条件:SS从高电平切换到低电平
终止条件:SS从低电平切换到高电平
交换一个字节(模式0)【用的多】
CPOL=0:空闲状态时,SCK为低电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
ps:MISO一条线表示高阻态
交换一个字节(模式1)
CPOL=0:空闲状态时,SCK为低电平
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
交换一个字节(模式2)
CPOL=1:空闲状态时,SCK为高电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
交换一个字节(模式3)
CPOL=1:空闲状态时,SCK为高电平
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
五、SPI时序
通常采用指令码加读写数据的模型,起始条件后第一个字节为指令码,在从机中会有指令集,指导从机完成相应功能
发送指令
向SS指定的设备,发送指令(0x06)
指定地址写
向SS指定的设备,发送写指令(0x02),随后在指定地址(Address[23:0])下,写入指定数据(Data)
- 由于从机W25Q64芯片内存地址为24位,所以起始条件后要发送三个字节指定地址,先发送的是高位地址,后发送的则是低位地址
指定地址读
向SS指定的设备,发送读指令(0x03),随后在指定地址(Address[23:0])下,读取从机数据(Data)
参考视频:江科大自化协