SPI(串行外设接口)属于全双工同步串行总线,有四条线----MISO(主入从出),MOSI(主出从入),SCK(同步时钟),CS(片选)。SPI只能有一个主设备,时钟只能由主设备产生,数据流传输速率比I2C高。
SPI设备之间通信其实是在同步时钟下两个双向的移位寄存器的数据交换。
SPI根据时钟极性(CPOL)和时钟相位(CPHA)不同有4中工作模式:
CPOL=0:SCK空闲时为低电平
CPOL=1:SCK空闲时为高电平
CPHA=0:第一个时钟边沿数据被采样,(采样前需要准备好数据);而在第二个时钟边沿数据开始准备好
CPHA=1:第二个时钟边沿数据被采样;而在第一个时钟边沿数据开始准备好
组合在一起就有四种模式,譬如CPOL=1,CPHA=1:SCK空闲时为高电平,下降沿准备数据,上升沿采样
SPI可以选择MSB(高位先发送)或者LSB(低位先发送)
CS为低时选中外设
时序如图:
下图是用逻辑分析仪抓取的波形,主机发送0x10
当然也可以使用软件来模拟,考虑到I/O翻转等,速度比硬件SPI控制器要低
下面是使用I/O口简单模拟的CPOL=1,CPHA=1模式读取SD卡的DBR时的时序截图,上升沿采样
下图是IO模拟SPI向SD卡发送CMD1命令和返回值0x01
模拟SPI时初始化MISO为输入,CS,MOSI,SCK为输出配置。一般读取数据是发送0xff来产生时钟的循环移位得到的,所以软件模拟读函数上可以拉高MOSI(相当于发送0xff)。
具体参看STM8的IAR工程:点击打开链接