1 SPI通信
SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
四根通信线:SCK串行时钟线(Serial Clock/SCLK/CLK/CK)、MOSI主机输出从机输入(Master Output Slave Input/DO)、MISO主机输入从机输出(Master Input Slave Output/DI)、SS从机选择(Slave Select/NSS/CS)
同步,全双工
支持总线挂载多设备(一主多从)
2 硬件电路
所有SPI设备的SCK、MOSI、MISO分别连在一起
主机另外引出多条SS控制线,分别接到各从机的SS引脚
输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入
3 移位示意图
移位寄存器的时钟源由主机提供,叫波特率发生器,同时时钟也通过SCK引脚进行输出。波特率寄存器时钟上升沿所有移位寄存器向左移动移位,移出去的位放到引脚上,时钟下降沿时引脚上的位采样输入到移位寄存器的最低位。
4 SPI时序基本单元
(1)起始条件:SS从高电平切换到低电平
终止条件:SS从低电平切换到高电平
(2)交换一个字节(模式0)
CPOL时钟极性=0:空闲状态时,SCK为低电平
CPHA时钟相位=0:SCK第一个边沿移入数据,第二个边沿移出数据
在SCK第一个边沿之前就要移出数据(即在第0个边沿移出,在第1个边沿移入)。SS下降沿开始时序,在SCK还未变化时立刻触发移位输出,在SCK上升沿就能采样数据,之后SCK下降沿移出下一个数据,在下一个上升沿移入…在第8个上升沿时整个字节交换完成,在最后一个SCK下降沿时MOSI可以置回默认电平,MISO也会变化一次(为下一个字节的B7),不需要的话SS上升沿之后从机MISO置回高阻态。
(3)交换一个字节(模式1)
CPOL=0:空闲状态时,SCK为低电平
CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
SS从机选择,通信开始前SS为高电平,通信过程中SS始终保持低电平,通信结束SS恢复高电平。MISO主机输入从机输出,在空闲时位于中间呈高阻态,SS下降沿之后从机的MISO被允许开启输出,SS上升沿后从机的MISO置回高阻态。SCK上升沿MOSI和MISO主机和从机同时移出数据,时钟运行产生下降沿此时主机和从机同时移入数据进行数据采样…传输完所有数据后SS置高电平,在SS的上升沿MOSI还能再变化一次将MOSI置一个默认的高电平或低电平,MISO从机必须置回高阻态(如果主机MISO为上拉输入则MOSI电平默认高电平,MISO为浮空输入则电平不确定)。
(4)交换一个字节(模式2)
CPOL=1:空闲状态时,SCK为高电平
CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
(5)交换一个字节(模式3)
CPOL=1:空闲状态时,SCK为高电平
CPHA=1:SCK第一个边沿移出数据