记得以前找工作面试的时候,面试官总喜欢问我SPI有几种模式,允许有几个主机存在一次传输几位等问题,当时的我对SPI通信一窍不通,也许现在的我对SPI通信还是一知半解,在这里说说我对SPI通信的浅显理解。
SPI的物理连接比较简单,通常有4根线,事实上3根也可以(单向传输时)。SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
SPI总线上必须有且只有一个主机,从机可以有若干。时钟由主设备提供,从设备不能产生或控制时钟,通信由主机发起。这是为什么SPI允许数据一位一位的传送,允许传输暂停,因为SCLK时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。所以如果MCU没有SPI接口的时候可以很方便的实现软件模拟。因为软仿的时候,时序可能会被中断暂停,由此也可以理解SPI通信允许暂停和一位一位传输的概念。
SPI每次通信都是一次数据交换,主设备发送了一个数据必然会收到一个数据,想要收到一个数据就必须要发送一个数据。 主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输。寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。如果只进行写操作,主机可以忽略接收到的字节;相反,若主机要读取从机的一个字节,就必须发送一个字节来引发从机的传输。
对CPOL和CPHA进行不同设置是SPI通信的四种模式。
一般情况下,SPI模块的最大时钟频率为系统时钟频率的1/2。
可以通过下面的读取代码理解数据交互的概念。
也可以从逻辑分析仪得到的SPI通信波形直观地理解数据交换的概念。