6

干货教学 | SPI 子系统(一):SPI spec

 2 years ago
source link: https://www.eefocus.com/embedded/518488
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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,主输入从输出。

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9ZXHib3icPKj1kt5gOkM183EPpLgdlribUUccVvtZxvGTu4jJE4hBS3usvg%2F640%3Fwx_fmt%3Dpng&s=300d0c

2、SPI 四种工作模式

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

①、CPOL=0,串行时钟空闲状态为低电平。
②、CPOL=1,串行时钟空闲状态为高电平。
③、CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④、CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。
forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9Z1HmrsRtfG7ljf0dgsqHICtUswlZricHweibyrxjJicdAWRPUH7rfAVQew%2F640%3Fwx_fmt%3Dpng&s=46d7b1

示例波形图如下:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9Z1ZVP3NCfsRPQaZ7lfryIVkoyukFXfrTTmScqgnTxNL4g2jFWBszdDw%2F640%3Fwx_fmt%3Dpng&s=028f97

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

3、SPI 传输机制

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9ZVmzrnaPR7POQA1qJXIHpjWQyskvJnp1xrMZBcTaEBeWj5n9VCGia83Q%2F640%3Fwx_fmt%3Dpng&s=42db62

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

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

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9ZQ6hUhkG64v3suDuXj8naR0fgNheWfJdSt8j7Gk420vWFprALxGIL8g%2F640%3Fwx_fmt%3Dgif&s=0e3151
forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9Z2D57281Gib1uFptV2NmLY3sX8mlSbPpibAcYrv31iaia3mUxkj5gFb3R6A%2F640%3Fwx_fmt%3Dgif&s=983787
forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9ZYTe0iaRNZhhS1v17zSjNkiae5yWwk2DOa2ZtCWoibFxic0wbEetZpAia4Pg%2F640%3Fwx_fmt%3Dgif&s=2846c2

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

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

1、主机向从机写数据

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9Z9xgQvNbsgnehM2FdibXhewJJzUSwFnA0LeSp8vTbWkEDCOPPqFEAZOQ%2F640%3Fwx_fmt%3Dpng&s=fedcb5

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

2、主机从从机读数据

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9ZdKz2NNYI8pavyJ0VDBCJVBb3og661OtK9E6wsusJMA3gjkzj5heKWg%2F640%3Fwx_fmt%3Dpng&s=4b9e6b

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

4、SPI timing diagram

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9ZY0EGuN2yWwqc5FZwA2iauHv6BTYEicmZQ9X2opdS7VLbBHNNDP3bhK8A%2F640%3Fwx_fmt%3Dpng&s=d90d71
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 设置不同:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FhgnOITBSQYsNJRMaiappX7ZesNREz6K9ZmLjDzfxjhd6x76xOHFVTEkAYic566gQY8XaR5zOiaibnQTvnMWXMl0O5w%2F640%3Fwx_fmt%3Dpng&s=2de83a

传输 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 上的速度会较快。

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK