当前位置: 首页 > news >正文

[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 的时钟树节点如下所示:

图中标号部分的含义如下:

  1. 时钟源选择,由寄存器 CSCDR2 的 ECSPI_CLK_SEL 位域控制,为 0 选择 pll3_60m 作为 ECSPI 的时钟源,为 1 选择 osc_clk 作为 ECSPI 的时钟源,实验中选择 pll3_60m 作为 ECSPI 的时钟源;

  2. ECSPI 的时钟分频值,由寄存器 CSCDR2 的 ECSPI_CLK_PODF 位域控制,分频值为 2^ECSPI_CLK_PODF,实验中设置为 0,即 1 分频;

  3. 最终进入 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.硬件连接

相关文章:

  • 抢占先机!品牌如何利用软文营销领跑内容营销赛道?
  • Wayland模式X11模式LinuxFB​​模式,Linux图形显示系统三大模式深度解析
  • 如何做好一份技术文档:构建知识传递的精准航海图
  • 【原理扫描】不安全的crossdomain.xml文件和CORS(跨站资源共享)原始验证失败验证与彻底方案
  • CATIA高效工作指南——测量分析篇(一)
  • 算法题(159):快速幂
  • 换行符在markdown格式时异常
  • StringBulder的底层原理?
  • 半导体厂房设计建造流程、方案和技术要点-江苏泊苏系统集成有限公司
  • 语音通信接通率、应答率和转化率有什么区别?
  • spring openfeign
  • Java中hashCode()与equals()的常见错误及解决方案
  • JS入门——三种输入方式
  • 超低延迟与高稳定性的行业领先直播解决方案
  • python里的Matplotlib库
  • 亚马逊商品评论爬取与情感分析:Python+BeautifulSoup实战(含防封策略)
  • 智绅科技——科技赋能健康养老,构建智慧晚年新生态
  • SpringAI系列 - 升级1.0.0
  • SpringBatch+Mysql+hanlp简版智能搜索
  • android协程异步编程常用方法
  • 网站开发简单吗/口碑营销的优势
  • 做网站的好处在哪里/seo网站推广方案策划书
  • 网站开发 科技/谷歌浏览器下载手机版官网
  • 成都门户网站建设/网站的推广
  • 复制别人的代码做网站/网站关键词挖掘
  • 宝和网站建设/庆云网站seo