嵌入式系统中SPI 子系统基本原理实现

简介: 嵌入式系统中SPI 子系统基本原理实现

1、SPI  hardware


SPI:Serial Perripheral Interface,串行外围设备接口,由 Motorola 公司提出,是一种高速、全双工、同步通信总线。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,无应答机制。

本文我们讲解标准的 4 线 SPI,四根线如下:

①、CS/SS,Slave Select/Chip Select,片选信号线,用于选择需要进行通信的从设备。

②、SCK,Serial Clock,串行时钟,和 I2C 的 SCL 一样,为 SPI 通信提供时钟。

③、MOSI/SDO,Master Out Slave In/Serial Data Output,主输出从输入。

④、MISO/SDI,Master In Slave Out/Serial Data Input,主输入从输出。

821cb3aafb1c8e0ceede0554e8b13ae2.png


2、SPI 四种工作模式


SPI 有四种工作模式,通过时钟极性(CPOL)和时钟相位(CPHA)的搭配来得到四种工作模式:

①、CPOL=0,串行时钟空闲状态为低电平。
②、CPOL=1,串行时钟空闲状态为高电平。
③、CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④、CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。


7a0773097779039e51014cf292f1f0ca.png

示例波形图如下:

5c7fc0b2b1f1cc79bacd0e6dba04ea31.png

SPI 是全双工的,所以读写时序可以一起完成。


3、SPI 传输机制


ff2a085e4d3942195afe28b4bd89a222.png

从图可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的 SPI 串行寄存器写入一个字节来发起一次传输。寄存器通过 MOSI 信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过 MISO 信号线返回给主机。这样,两个移位寄存器中的内容就被交换。

外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

5ef75e75c67004d2639282d8fb7be4a4.gif

6c54254c724b9fec1c00160d5572a009.gif

5f18edbf9ec53edd195d6471d5b99a3f.gif

虽然 SPI 四线制支持读写同时进行,但实际上我们很多时候并不需要又读又写,见以下两种情况(参考 BMA223 数据手册):

注意:如下三幅图示均为 CPOL=1,CPHA=1


1、主机向从机写数据

564f906732af5d8bc7b8b5c3f26bdd8c.png

主机发送先发送 8 bits,第一个 bit 为 0 代表这次主机是想写数据到从机,AD6~AD0 表示要写的寄存器地址。然后,主机就会一直写下去。在这期间 SDO 一直没用,一直是高阻态,算是一直读到1。


2、主机从从机读数据

16d862b9e1ee9c15ca19de54bac4bcca.png

这种情况下,主机先发送 8 bits,第一位为 1 代表这次是读,然后 AD6 ~ AD0 是想要读的寄存器地址,然后 SDO 开始返回数据。


4、SPI timing diagram


336a1942db721b0dba004b1f51f49ff5.png

Tcsb_setup:建立时间
Tcsb_hold:保持时间
tsckl:低电平时间
tsckh:高电平时间
SCK period :Tsckl + tsckh
一般情况下 Tsckl = tsckh

注意:真实的波形图如上,高低电平并不是到达最高点才算,0.3Vdd 以下为低电平,0.7Vdd 以上为高电平,计算信号时间长度的时候需要注意这个微小的时间,硬件设计必须注意信号质量风险,软件开发人员也要会看波形图。

这里的参数,一般 spi 驱动不需要设置,但是半导体厂商提供的 spi 控制器驱动中,可以修改这些参数。我们写 SPI 驱动时候,可以根据从设备的要求来修改这些参数。


5、DMA 与 FIFO


不同平台对于 SPI FIFO 和 DMA 的 buffer size 设置不同:

105791062a434e1eeb471fb8241eb501.png

传输 32bytes 以下使用 FIFO,传输 32bytes 以上使用 DMA。

DMA 可以自动发起多次传输,一次最大 256K 。


6、I2C 与 SPI 对比


功能 I2C SPI
线数 2(SDA,SCL) 4(MOSI,MISO,SCLK,CS)
主机数量 >=1 ==1
类型 半双工 全双工
回应机制 yes no
速度 <=3.4Mbps high
应用 重要数据 大量数据
流控 yes no
设备地址 yes no
常规用途 命令 数据


I2C 和 SPI 的速率如下:

I2C模式 速度
标准 100KHz
快速 400KHz
快速+ 1MHz
高速 3.4MHz


SPI 速率:几十 MHz 甚至上百 MHz,速度取决于 CPU 的 SPI 控制器和时钟 clock


STM32F103 的 SPI 最高支持 18MHz,imx6ull 的 SPI 最高支持 52MHz,其他芯片一般用不到更高的,因为速度越快波形质量越不好,越容易出问题。


具体采用多大速率还和外设有关,比如 EEPROM 的 W25Q128 的 SPI 最高支持 80MHz,ICM20608 传感器的 SPI 最高支持8MHz。一般用在 flash 上的速度会较快。


7、扩展


SPI 协议其实是包括:Standard SPI、Dual SPI 和 Queued SPI 三种协议接口。

Dual SPI 还是四线制,只是传输线可以变为同方向,速度是 Standard SPI 的两倍。

Queued SPI 是六线制,多了两根数据线,传输速度是 Standard SPI 的四倍。

目录
相关文章
|
6月前
|
Linux C语言 SoC
嵌入式linux总线设备驱动模型分析
嵌入式linux总线设备驱动模型分析
80 1
|
Linux
Linux驱动开发(使用I2C总线设备驱动模型编写AT24C02驱动程序)
Linux驱动开发(使用I2C总线设备驱动模型编写AT24C02驱动程序)
149 0
|
6月前
|
设计模式 程序员 测试技术
LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计1
LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计1
66 0
|
6月前
|
API Go
LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计2
LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计2
50 0
|
6月前
|
消息中间件 存储 Linux
嵌入式Linux系统中SPI 子系统基本实现
嵌入式Linux系统中SPI 子系统基本实现
146 0
|
6月前
|
芯片
嵌入式STM32中时钟系统详细分析
嵌入式STM32中时钟系统详细分析
162 0
嵌入式STM32中时钟系统详细分析
|
6月前
|
Linux API
Linux驱动的软件架构(三):主机驱动与外设驱动分离的设计思想
Linux驱动的软件架构(三):主机驱动与外设驱动分离的设计思想
98 0
|
6月前
|
存储 Linux 芯片
嵌入式系统中I2C总线通信基本方法(下)
嵌入式系统中I2C总线通信基本方法(下)
218 0
|
6月前
|
传感器 物联网 SoC
嵌入式系统中I2C总线通信基本方法(上)
嵌入式系统中I2C总线通信基本方法(上)
174 0
|
SoC
深入理解AMBA总线(十六)AXI设计的关键问题(二)
深入理解AMBA总线(十六)AXI设计的关键问题(二)
822 0
深入理解AMBA总线(十六)AXI设计的关键问题(二)