[IMX] 10.串行外围设备接口 - SPI
代码链接:GitHub - maoxiaoxian/imx
参考资料:
https://zhuanlan.zhihu.com/p/290620901
SPI协议详解 - bujidao1128 - 博客园
SPI总线协议及SPI时序图详解 - Ady Lee - 博客园
目录
1.SPI 简介
2.I.MX6U ECSPI 简介
2.1.控制寄存器 1 - ECSPIx_CONREG
2.2.控制寄存器 2 - ECSPIx_CONFIGREG
2.3.采样周期 - ECSPIx_PERIODREG
2.4.SPI 时钟源
2.5.状态寄存器 - ECSPIx_STATREG
2.6.数据寄存器 - ECSPIx_TXDATA & ECSPIx_RXDATA
3.ICM-20608 简介
4.硬件连接
1.SPI 简介
SPI 全称 Serial Perripheral Interface,即串行外围设备接口,是一种高速、全双工的同步通信总线
SPI 以主从方式工作,通常有一个主设备和多个从设备,SPI 一般需要 4 根线,单向传输时也可以只使用 3 根线
标准 4 线 SPI (Quad Serial Peripheral Interface) 包含的通信线如下:
-
CS/SS:Slave Select/Chip Select,片选信号线,选择需要进行通信的从机设备,SPI 主机无需发送从机的设备地址,直接将相应的从机设备片选信号拉低即可;
-
SCLK:Serial Clock,串行时钟,和 I2C 的 SCL 时钟信号线一样,为 SPI 通信提供时钟;
-
MOSI/SDO:Master Out Slave In/Serial Data Output,主出从入信号线,该数据线仅用于主机向从机发送数据,也就是主机输出,从机输入;
-
MISO/SDI:Master In Slave Out/Serial Data Input,主入从出信号线,该数据线仅用于从机向主机发送数据,也就是主机输入,从机输出;
SPI 通信由主机率先发起,主机需要提供时钟信号,主机通过 SPI 连接多个从机设备的结构如下图所示:
SCLK 的时钟信号可配置总线极性 CPOL 和时钟相位 CPHA
CPOL 配置 SPI 总线的极性,CPHA 配置 SPI 总线的相位
极性直接影响 SPI 总线在空闲时的时钟信号为高电平还是低电平:
-
CPOL = 1:表示空闲时为高电平;
-
CPOL = 0:表示空闲时为低电平;
数据传输从跳变沿 (上升沿/下降沿) 开始,如下图所示:
相位决定 SPI 总线从哪个跳变沿开始采样数据:
-
CPHA = 0:表示从第一个跳变沿开始采样;
-
CPHA = 1:表示从第二个跳变沿开始采样;
SPI 总线有四种工作模式,通过串行时钟极性 CPOL 和相位 CPHA 的组合获得:
-
CPOL = 0:串行时钟空闲状态为低电平;
-
CPOL = 1:串行时钟空闲状态为高电平,此时可以通过配置时钟相位 CPHA 选择具体的传输协议;
-
CPHA = 0:串行时钟的第一个跳变沿 (上升沿或下降沿) 采集数据;
-
CPHA = 1:串行时钟的第二个跳变沿 (上升沿或下降沿) 采集数据;
四种工作模式的时钟信号如下图所示:
以 CPOL = 0,CPHA = 0 的工作模式为例,此时 SPI 进行全双工通信的时序如下图所示:
SPI 的时序较为简单,不像 I2C 需要区分写时序和读时序 (SPI 为全双工通信),图中,CS 片选信号先拉低,选中要通信的从设备,然后通过 MOSI 和 MISO 这两根数据线收发数据,MOSI 数据线发出 0xD2 给从设备,同时从设备通过 MISO 数据线向主设备返回 0x66
2.I.MX6U ECSPI 简介
I.MX6U 自带的 SPI 外设称为 ECSPI,全称 Enhanced Configurable Serial Peripheral Interface
ECSPI 有 64*32 个数据接收 FIFO (RXFIFO) 和 64*32 个数据发送 FIFO (TXFIFO),ECSPI 的特性如下:
-
全双工同步串行通信;
-
可配置主/从模式;
-
四个片选信号,支持多从机;
-
发送和接收都有一个 32x64 的 FIFO;
-
片选信号 SS/CS,时钟信号 SCLK 的极性可配置;
-
支持 DMA 传输;
I.MX6U 的 ECSPI 可以工作在主模式或从模式,例程使用主模式
I.MX6U 有 4 个 ECSPI,每个 ECSPI 支持四个硬件片选信号,即一个 ECSPI 可以支持 4 个外设,如果不使用硬件的片选信号则可以支持无数个外设,实验中不使用硬件片选信号,因为硬件片选信号只能使用指定的片选 IO,软件片选可以使用任意的 IO
2.1.控制寄存器 1 - ECSPIx_CONREG
-
BURST_LENGTH[31:24]:突发长度,设置 SPI 突发传输的数据长度,单次 SPI 传输最大可以发送 2^12bit 个数据,可以设置 0x000~0xFFF,对应 1~2^12bit,一般设置突发长度为一个字节 (8-bit);
-
CHANNEL_SELECT[19:18]:SPI 通道选择,一个 ECSPI 有四个硬件片选信号,每个片选信号为一个硬件通道,使用软件片选仍需设置 SPI 通道,可设置为 0~3,对应通道 0~3,I.MX6U-ALPHA 开发板上的 ICM-20608 的片选信号接的是 ECSPI3_SS0,即 ECSPI3 的通道 0,所以实验中设置为 0;
-
DRCTL[17:16]:控制 SPI 的 SPI_RDY 信号,为 0 时忽略 SPI_RDY 信号,为 1 时 SPI_RDY 信号为边沿触发,为 2 时 SPI_DRY 信号为电平触发;
-
PRE_DIVIDER[15:12]:SPI 预分频值,ECSPI 时钟分频包含两部分,该位域设置第一部分,可设置 0~15,对应 1~16 分频;
-
POST_DIVIDER[11:8]:SPI 后分频值,ECSPI 时钟分频的第二部分,分频值为 2^POST_DIVIDER;
-
CHANNEL_MODE[7:4]:SPI 通道主/从模式设置,CHANNEL_MODE[3:0] 分别对应 SPI 通道 3~0,为 0 时设置为从模式,为 1 时设置为主模式,比如设置为 0x01 表示设置通道 0 为主模式;
-
SMC[3]:开始模式控制,该位只在主模式有效,为 0 时通过 XCH 位开启 SPI 突发访问,为 1 时只要向 TXFIFO 写入数据就会开启 SPI 突发访问;
-
XCH[2]:该位只在主模式中有效,SMC 位为 0 时该位控制 SPI 突发访问的开启和关闭;
-
HT[1]:HT 模式使能,I.MX6ULL 不支持;
-
EN[0]:SPI 使能,为 0 关闭 SPI,为 1 使能 SPI;
2.2.控制寄存器 2 - ECSPIx_CONFIGREG
-
HT_LENGTH[28:24]:设置 HT 模式的消息长度,I.MX6ULL 不支持;
-
SCLK_CTL[23:20]:设置 SCLK 信号线空闲状态的电平,SCLK_CTL[3:0] 分别对应通道 3~0,为 0 时 SCLK 空闲状态为低电平,为 1 时 SCLK 空闲状态为高电平;
-
DATA_CTL[19:16]:设置 DATA 信号线空闲状态的电平,DATA_CTL[3:0] 分别对应通道 3~0,为 0 时 DATA 空闲状态为高电平,为 1 时 DATA 空闲状态为低电平;
-
SS_POL[15:12]:设置 SPI 片选信号的极性,SS_POL[3:0] 分别对应通道 3~0,为 0 时片选信号低电平有效,为 1 时片选信号高电平有效;
-
SCLK_POL[7:4]:SPI 时钟信号的极性,即 CPOL,SCLK_POL[3:0] 分别对应通道 3~0,为 0 时 SCLK 高电平有效 (空闲时为低电平),为 1 时 SCLK 低电平有效 (空闲时为高电平);
-
SCLK_PHA[3:0]:SPI 时钟相位,即 CPHA,SCLK_PHA[3:0] 分别对应通道 3~0, 为 0 时串行时钟的第一个跳变沿 (上升沿或下降沿) 采集数据,为 1 时串行时钟的第二个跳变沿 (上升沿或下降沿) 采集数据;
-
通过 SCLK_POL[7:4] 和 SCLK_PHA[3:0] 设置 SPI 的工作模式;
2.3.采样周期 - ECSPIx_PERIODREG
-
CSD_CTL[21:16]:片选信号延时控制,设置片选信号和第一个 SPI 时钟信号之间的时间间隔,范围为 0~63;
-
CSRC[15]:SPI 时钟源选择,为 0 时选择 SPI CLK 为 SPI 的时钟源,为 1 时选择 32.768KHz 的晶振为 SPI 的时钟源;
-
SAMPLE_PERIO[14:0]:采样周期,可设置为 0~0x7FFF,分别对应 0~32767 个周期;
2.4.SPI 时钟源
SPI 的时钟树节点如下所示:
图中标号部分的含义如下:
-
时钟源选择,由寄存器 CSCDR2 的 ECSPI_CLK_SEL 位域控制,为 0 选择 pll3_60m 作为 ECSPI 的时钟源,为 1 选择 osc_clk 作为 ECSPI 的时钟源,实验中选择 pll3_60m 作为 ECSPI 的时钟源;
-
ECSPI 的时钟分频值,由寄存器 CSCDR2 的 ECSPI_CLK_PODF 位域控制,分频值为 2^ECSPI_CLK_PODF,实验中设置为 0,即 1 分频;
-
最终进入 ECSPI 的时钟频率 SPI CLK = 60MHz;
2.5.状态寄存器 - ECSPIx_STATREG
-
TC[7]:传输完成标志,为 0 表示正在传输,为 1 表示传输完成;
-
RO[6]:RXFIFO 溢出标志,为 0 表示 RXFIFO 无溢出,为 1 表示 RXFIFO 溢出;
-
RF[5]:RXFIFO 空标志位,为 0 表示 RXFIFO 不为空,为 1 表示 RXFIFO 为空;
-
RDR[4]:RXFIFO 数据请求标志,为 0 表示 RXFIFO 中的数据不大于 RX_THRESHOLD,为 1 表示 RXFIFO 中的数据大于 RX_THRESHOLD;
-
RR[3]:RXFIFO 就绪标志,为 0 表示 RXFIFO 中没有数据,为 1 表示 RXFIFO 中至少有一个字的数据;
-
TF[2]:TXFIFO 满标志,为 0 表示 TXFIFO 不为满,为 1 表示 TXFIFO 为满;
-
TDR[1]:TXFIFO 数据请求标志,为 0 表示 TXFIFO 中的数据大于 TX_THRESHOLD,为 1 表示 TXFIFO 中的数据不大于 TX_THRESHOLD;
-
TE[0]:TXFIFO 空标志位,为 0 表示 TXFIFO 中至少有一个字的数据,为 1 表示 TXFIFO 为空;
2.6.数据寄存器 - ECSPIx_TXDATA & ECSPIx_RXDATA
Tx 和 Rx 的数据寄存器均为 32-bit 长度,如下所示:
3.ICM-20608 简介
ICM-20608 是一款 6 轴 MEMS 传感器,包括 3 轴加速度和 3 轴陀螺仪,其内部有一个 512 字节的 FIFO
陀螺仪的量程范围可编程设置,可选择 ±250,±500,±1000 和 ±2000°/s, 加速度的量程范围也可以编程设置,可选择 ±2g,±4g,±8g 和 ±16g
陀螺仪和加速度计均为 16 位的 ADC,且支持 I2C 和 SPI 两种协议,使用 I2C 接口时通信速度最高可达 400KHz,使用 SPI 接口时通信速度最高可达 8MHz
I.MX6U-ALPHA 开发板上的 ICM-20608 通过 SPI 接口与 SoC 连接,ICM-20608 的特性如下:
-
陀螺仪支持 X、Y 和 Z 三轴输出,内部集成 16 位 ADC,测量范围可设置:±250,± 500,±1000 和 ±2000°/s;
-
加速度计支持 X、Y 和 Z 轴输出,内部集成 16 位 ADC,测量范围可设置:±2g,±4g, ±4g,±8g 和 ±16g;
-
用户可编程中断;
-
内部包含 512 字节的 FIFO;
-
内部包含一个数字温度传感器;
-
耐 10000g 的冲击;
-
支持快速 I2C,速度可达 400KHz;
-
支持 SPI,速度可达 8MHz;
ICM-20608 的 3 轴方向如下图所示:
ICM-20608 的结构框图如下图所示:
使用 I2C 接口时 ICM-20608 的 AD0 引脚决定 I2C 设备从地址的最后一位,AD0 为 0 则 ICM-20608 的从设备地址为 0x68,AD0 为 1 则 ICM-20608 的从设备地址为 0x69
实验使用 SPI 接口,ICM-20608 通过读写寄存器进行配置和传感器数据读取,使用 SPI 接口读写寄存器时至少需要 16 个时钟信号或更多 (如果读写操作包括多个字节):
-
第一个字节包含要读写的寄存器地址,寄存器地址的最高位是读写标志位,读取时最高位为 1,写入时最高位为 0,剩下的 7 位是实际的寄存器地址;
-
寄存器地址后面跟着的就是要读写的数据;
实验中使用的 ICM-20608 的寄存器和相关位域如下图所示:
4.硬件连接