SPI通信协议
- SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
- 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)
- 同步,全双工
- 支持总线挂载多设备(一主多从)
- 高位先行
硬件电路
- 所有SPI设备的SCK、MOSI、MISO分别连在一起
- 主机另外引出多条SS控制线,分别接到各从机的SS引脚
- 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入
主机和所有从机必须共地
主机选择从机时,则给该从机SS置0,同一时间只能选择一个从机。
当从机SS引脚为高电平,即从机未被选中时,它的MISO引脚必须切换为高阻态,高阻态相当于引脚断开,不输出任何电平。这样就可以防止一条线有多个输出而引发的电平冲突问题。在SS为低电平时,MISO才允许变为推挽输出。
移位示意图
按照箭头所示的方向一位一位进行字节交换。
SPI时序基本单元
- 起始条件:SS从高电平切换到低电平
- 终止条件:SS从低电平切换到高电平
- 交换一个字节(模式0)
- CPOL=0:空闲状态时,SCK为低电平
- CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
- 交换一个字节(模式1)
- CPOL=0:空闲状态时,SCK为低电平
- CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
- 交换一个字节(模式2)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
- 交换一个字节(模式3)
- CPOL=1:空闲状态时,SCK为高电平
- CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
发送指令
向SS指定的设备,发送指令(0x06)
//发送流程:指令码+数据
- 指定地址写
- 向SS指定的设备,发送写指令(0x02),
- 随后在指定地址(Address[23:0])下,写入指定数据(Data)
- 指定地址读
- 向SS指定的设备,发送读指令(0x03),
- 随后在指定地址(Address[23:0])下,读取从机数据(Data )
先把三个字节的地址0x123456交换过来,然后读取该地址下的数据。
SS为1,则读写操作结束。