这篇详细介绍嵌入式的SPI总线,方便以后写该总线的器件驱动。
一、SPI总线讲解
SPI的主要构成有三根线,一个是数据输出线MOSI,一个是数据输入线MISO,一个是时钟线SCLK。
SPI总线实现的方式分为两种:硬件IIC & 软件模拟SPI。硬件SPI有主从之分;当然,软件SPI也是标准的SPI协议,当然有分主从,但一般情况下,(MCU)软件SPI为主机模式,即发送请求接收从机的响应信息。
可能大家不知道为什么我这MCU就是SPI主机,凭啥?你可以反过来想一下,MCU通讯的其他器件实质上都是从机,MCU要你的数据才会去找你;如果你MCU也是从机模式,从机与从机怎么通信?由于每种MCU的硬件SPI总线配置各不相同,故接下来主要讲 软件SPI。
- SPI通信是串行同步全双工(同时收发)
- IIC通信是串行同步半双工(单收或单发)
- 无论是 硬件SPI 还是 软件SPI ,两种方式只是提供最基础的桥梁——提供了读、写1字节方式。如何调用IIC从器件,还是得查对应SPI从器件的datasheet。SPI总线好比中文的拼音,具体要怎么说话、说什么话,还是得看datasheet。
Ps:硬件SPI总线 & 软件SPI总线 速率方面是有点差距的。具体没有实测,但是既然是用了软件SPI总线,就不要纠结速度问题了。但是硬件SPI总线的速度也不是无上限的,而且还要根据主、从机的配置。
以W5500为例,该芯片的SPI总线速率最高达到80Mhz。如果主控采用stm32f103,主频为72Mhz,SPI时钟最大为18Mhz。因此stm32f103无法发挥W5500完全的性能。
而如果使用STM40x处理器,SPI时钟使用42Mhz,使用DMA方式,可以达到回环测试17Mbps的速率(收+发),单独发送可以达到13Mbps的速率。
也就是说,SPI的速率本身就受器件限制。如果从机SPI时钟较低,主机被限制;主机时钟较低,从机性能被限制。编写硬件SPI驱动的时候,要多注意 主控芯片、从机器件 的datasheet。
二、(主机)软件SPI总线
硬件上为4根线:
MISO
:主设备数据输入,从设备数据输出。MOSI
:主设备数据输出,从设备数据输入。SCLK
:时钟信号,由主设备产生。CS
:从设备片选信号,由主设备控制。
Ps:外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
由上图的(硬件)SPI通信协议可知,时钟信号的相位和极性,决定了获取数据的方式;2*2=4,于是有四种模式;
CPOL决定时钟空闲状态(1为空闲高电平,0为空闲低电平)
CPHA决定获取数据的时钟相位(1为延迟一个相位,第二次SCLK突变为空闲状态获取数据;0为直接相位,SCLK空闲状态突变时,直接获取数据)
以上就是软件SPI的要点;实现具体的软件SPI,需要对器件的datasheet进行查阅,看是哪种模式。
模式 | CPOL | CPHA |
---|---|---|
MODE0 | 0 | 0 |
MODE1 | 0 | 1 |
MODE2 | 1 | 0 |
MODE3 | 1 | 1 |
下面简单列一个 CPOL=1,CPHA=1的SPI写操作
1 | /************************************************** |
2.1 FRAM_FM25L256为例——软件SPI
FM25L256支持SPI模式的0和3,下面为CPOL=1,CPHA=1。基本的字节读写操作如下:
1 | /************************************************** |
2.2 FRAM_FM25L256程序扩展——datasheet
1 | /************************************************** |