正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.3,4 SPI驱动实验-I.MX6U SPI 寄存器

前言:

本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

SPI学习参考资料:

简述SPI通信协议-01_cpha选择为第一个边沿-CSDN博客

SPI中的CPHA,CPOL详解-CSDN博客

一文搞懂SPI通信协议_spi协议-CSDN博客

摩托罗拉 《SPI Block Guide V03.06》 手册

链接:https://pan.baidu.com/s/1_mvR5AD0-OBI2bYyx2i4Sw?pwd=f4bo 
提取码:f4bo

正文:

本文是 “正点原子[第二期]Linux之ARM(MX6U)裸机篇--第24讲 SPI驱动。本节将参考正点原子的视频教程第24讲和配套的正点原子开发指南文档进行学习。

0. 概述

通I2C一样,SPI是很常用的通信接口,也可以通过SPI来连接众多的传感器。相比I2C接口,SPI接口的通信速度很快,I2C最多400KHz,但是SPI可以到达即使MHz。I.MX6U 也有4个SPI接口,可以通过这4个SPI接口来连接一些SPI外设。I.MX6U-ALHPA使用SPI3接口连接了一个6周传感器 ICM-20608,本章我们就来学习如何使用I.MX6U的SPI接口来驱动ICM-20608,读取ICM-20608的六轴数据。

1. I.MX6U 的SPI接口

I.MX6U 处理器的SPI接口在《I.MX6ULL参考手册》的第20章 "Chapter 20Enhanced Configurable SPI (ECSPI)"章节,

I.MX6U ECSPI 接口的硬件框图如下:

  • ECSPI有64个32位的TXFIFO 缓冲区
  • ECSPI有64个32位的RXFIFO 缓冲区
  • 通过ECSPI 硬件接口的 FIFOx 缓冲区可以减少数据传输时的中断数量从而提高传输速率

I.MX6U ECSPI 硬件接口的特向如下:

  • 全双工,同步,串行接口
  • 主机/从机模式
  • 4个CS(Chip Seclect)片选信号线来支持多个外部设备
  • 持续传输模式允许任意长度的数据传输
  • Tx和Rx方向分别有32位的 64 条目的FOFO缓冲器
  • 时钟极性(Polarity),时钟相位(Phase)和时钟频率可以配置
  • DMA支持
  • 最大运行频率可以达到参考时钟频率

2. I.MX6U ECSPI 时钟

从I.MX6U的时钟树(Clock Tree)可以找到 ECSPI 接口的时钟来源于 PLL3_480MHz,并且经过一个固定值为8的分频,所以从时钟树CCM进入到到 ESPAI 接口的时钟频率为

ESAPI = PLL3_480Mhz/8 = 60MHz

在ECSAPI时钟树可以看到,ECSAPI的时钟源选择还需要配置一个多路选择器 CCM_CSCDR2 [ECSPI_CLK_SEL] 和一个分频器 CCM_CSCDR2[ECSPI_CLK_PODF] 

这个CCM_CSCDR2 寄存器的结构如下图所示:

这里配置为1分频,时钟源选择为PLL3_60M

CCM_CSCDR2寄存器的 bit[24:19] 设置为0表示1分频,bit[18]=0 表示时钟源选择 PLL3_60M

3. I.MX6U ECSPI 寄存器

I.MX6U ECSPI 寄存器主要有如下这些寄存器。

本节实验中正点原子的示例教程里不使用SPI的DMA和中断,所以我们需要的寄存器有:

  • ECSPIx_RXDATA:Tx要发送数据
  • ECSPIx_TXDATA:Rx接收到的数据
  • ECSPIx_CONREG:控制寄存器
  • ECSPIx_CONFIGREG:控制寄存器
  • ECSSPIx_STATREG:状态寄存器

3.1 ECSPIx_RXDATA寄存器

ECSPIx_RXDATA 是32位的 Rx 接收数据寄存器,在读取Rx数据之前需要先检查 RR (Read Ready)标志位是否为1.

3.2 ECSPIx_TXDATA寄存器

ECSPIx_TXDATA 是32位的 Tx 发送数据寄存器,写到TxDATA寄存器的数据被存放到ECSPI的TX FIFO中,如果TXFIFO不满软件就可以向这个寄存器写值。

3.3 ECSPIx_CONREG 寄存器

ECSPI_CONREG 寄存器允许软件来使能/复位 ECSPI接口,设置时钟分频值,设置传输长度(Bust-Length)。我们需要使用的位如下:

  • EN bit[0]:为1使能ECSPI接口,为0去使能接口并对ECSPI进行复位。
  • HT bit[1]: 硬件翻转,手册说I.MX6ULL不支持该功能
  • XCH bit[2]:指示空闲或者Busy,本实验设置该位值为0。
  • SMC bit[3]:传输开始模式,值为1的时候需要SPI_RDY信号来控制传输开始,值为0时TXFIFO中写数据立即传输开始,本实验设置该位为0。
  • CHANNEL_MODE bit[7:4]:一个ECSPI接口支持4个通道(Channel),这里是选择4个通道的工作模式为主机模式(Master)还是从机模式(Slave),本实验使用 Channel 0,所以该位设置为0x1.
  • POST_DIVDER bit[11:8]:后级分频,值范围为0~15对应2的(0~15)次方分频。
  • PRE_DIVIDER bit[15:12]:前级分频,值范围为0~15对应1~16分频。
  • DRCTL bit[17:16]:本实验不使用
  • BUSRT_LENGTH bit[31:20]:每次突发传输长度,值范围为0~0XFFF,对应1到0x1000 bit 位,本实验设置每次突发传输长度为8位,所以设置值为7。

3.4 ECSPI_CONFIGREG寄存器

ECSPIx_CONFIGREG 寄存器允许软件来配置SPI通道的运行模式,串行时钟的极性(CPOL: Clock Polarity),串行时钟的相位(Clock Phase),数据发送波形模式(SPI Wave From)。本实验中用到的寄存器如下:

  • SCLK_PHA bit[3:0]:ECSPI接口支持4个通道(channel) ,通道0~3,配置通道0~3的 CPHA 时钟相位。
  • SCLK_POL bit[3:0]:ECSPI接口支持4个通道(channel) ,通道0~3,配置通道0~3的 CPOL时钟极性。
  • SS_CTL bit[11:8]:SPI Wave From 波形模式,配置SPI发送数据时 single bust 单突发模式,还是Multi bust 多突发模式,单突发模式每次发送数据之后等待用户再次写入数据,多突发模式会发送一个burst之后自动拉高拉低SS线并再次发送TXFIFO中的下一个数据知道TXFIFO为空。本实验选择多突发模式。
  • DATA_CTL(bit19:16):设置 DATA 信号线空闲状态电平, DATA_CTL[3:0]分别对应通道3~0,为 0 的话 DATA 空闲状态为高电平,为 1 的话 DATA 空闲状态为低电平。
  • SCLK_CTL bit[23:20]:设置 SCLK 信号线空闲状态电平, SCLK_CTL[3:0]分别对应通道3~0,为 0 的话 SCLK 空闲状态为低电平,为 1 的话 SCLK 空闲状态为高电平

3.5 ECSPIx_STATREG

ECSPIx_STATREG 状态寄存器指示ECSPI接口的 TxFIFO和 RXFIFO的状态,本实验我们需要使用的是:

  • TC(bit7):传输完成标志位,为 0 表示正在传输,为 1 表示传输完成。
  • RO(bit6): RXFIFO 溢出标志位,为 0 表示 RXFIFO 无溢出,为 1 表示 RXFIFO 溢出。
  • RF(bit5): RXFIFO 空标志位,为 0 表示 RXFIFO 不为空,为 1 表示 RXFIFO 为空。
  • RDR(bit4): RXFIFO 数据请求标志位,此位为 0 表示 RXFIFO 里面的数据不大于
  • RX_THRESHOLD,此位为 1 的话表示 RXFIFO 里面的数据大于 RX_THRESHOLD。
  • RR(bit3): RXFIFO 就绪标志位,为 0 的话 RXFIFO 没有数据,为 1 的话表示 RXFIFO 中至少有一个字的数据。
  • TF(bit2): TXFIFO 满标志位,为 0 的话表示 TXFIFO 不为满,为 1 的话表示 TXFIFO 为满。
  • TDR(bit1): TXFIFO 数据请求标志位,为 0 表示 TXFIFO 中的数据大于 TX_THRESHOLD,为 1 表示 TXFIFO 中的数据不大于 TX_THRESHOLD
  • TE(bit0): TXFIFO 空标志位,为 0 表示 TXFIFO 中至少有一个字的数据,为 1 表示 TXFIFO为空。

3.6 ECSPI_PERIODREG

寄存器 ECSPIx_PERIODREG,这个是 ECSPI 的采样周期寄存器。寄存器 ECSPIx_PERIODREG 用到的重要位如下:

  • CSD_CTL(bit21:16): 片选信号延时控制位,用于设置片选信号和第一个 SPI 时钟信号之间的时间间隔,范围为 0~63。
  • CSRC(bit15): SPI 时钟源选择,为 0 的话选择 SPI CLK 为 SPI 的时钟源,为 1 的话选择32.768KHz 的晶振为 SPI 时钟源

关于 ECSPI 的寄存器就介绍到这里,关于这些寄存器详细的描述,请参考《I.MX6ULL 参
考手册》第 805 页的 20.7 小节。

4. ICM-20608 6轴传感器

ICM-20608 是 InnvenSence 出品的一款6轴 MEMS传感器,包括3轴加速度和3周陀螺仪。ICM20608 的尺寸非常小,只有3X3X0.57ms,采用16P的LGA封装。ICM-20608内部有一个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接口和I.MX6U连接在一起。ICM-20608特性如下:

  • 陀螺仪支持X,Y 和 Z 三轴输出,内部集成16位ADC,测量范围可设置,±250,±500,±1000和±2000 °/s。
  • 加速度计支持X,Y 和 Z 轴输出,内部集成16为ADC,测量范围可设置,±2g,±4g,±8g和±16g。
  • 用户可编程中断
  • 内部包含了512字节的FIFO
  • 内部包含一个数字温度传感器
  • 难受1000g的冲击
  • 支持快速I2C,速度可以达到400KHz。
  • 支持SPI,速度可以到达 8MHz。

ICM-20608的3轴方向如下图所示:

ICM-20608的结构框图如下图所示:

术语表

英文单词中文解释英文词源(词根)
gyroscope陀螺仪;[航] 回转仪

gyroscope:陀螺仪

gyro-, 旋转。-scope, 看,见telescope. 后用做科技名词。

accelerometer加速度计;(飞机、火箭的)加速器

accelerate +‎ -meter

FR

如果使用I2C接口的话 IMC-20608 的 AD0 引脚决定I2C设备从地址的最后一位,如果AD0为0的话ICM-20608从设备的地址是0x68,如果AD0为1的话ICM-20608从设备的地址为0x69。本章我们使用SPI接口,根上一章使用AP3216C一样,ICM-20608也是通过读写寄存器来配置和读取传感器数据,使用SPI接口读写寄存器需要16个时钟周期获证更多(如果写操作包括多个字节的话),第一个字节包含要读写的寄存器地址,寄存器地址最高位是读写标志位,如果是读的话寄存器地址最高位要为1,如果是写的话寄存器地址最高位要为0,剩下的7位才是实际的寄存器地址,寄存器地址后面跟着的就是读写的数据。下表列出了本实验用到的一些寄存器和位,关于ICM-20608的详细寄存器和位的介绍请参考ICM-20608寄存器手册。

ICM-20608 6轴传感器的Datasheet数据手册,介绍其SPI通信读写寄存器数据的命令序列如下:

  • ICM-20608也是通过读写寄存器来配置和读取传感器数据,使用SPI接口读写寄存器需要16个时钟周期获证更多(如果写操作包括多个字节的话)
  • 第一个字节包含要读写的寄存器地址,寄存器地址最高位是读写标志位,如果是读的话寄存器地址最高位要为1,如果是写的话寄存器地址最高位要为0,剩下的7位才是实际的寄存器地址
  • 寄存器地址后面跟着的就是读写的数据

本实验用到的一些ICM-20608寄存器和位:

ICM-20608 的介绍就到这里,关于 ICM-20608 的详细介绍请参考 ICM-20608 的数据手册和
寄存器手册。

英文术语

英文中文解释术语结束
DLPF filter block

DLPF是数字低通滤波器(Digital Low-Pass Filter)的缩写。

DLPF是数字信号处理技术的一种,主要用于降低采集信号中的噪音。在工程和科研领域,它被用来提取原始信号中的有效部分,并消除高频和噪音成分,以保证信号的可靠性和准确性。具体来说,DLPF能够滤除信号的高频成分,保留低频部分,从而达到降噪和滤波效果。这种技术在多个领域都有应用,例如半导体芯片、通信和医学电子。在医学影像系统中,DLPF能提升图像的清晰度和信噪比,方便医生和病人的诊断。在通信领域,DLPF也有助于提升通话质量
SMPLRT_DIVSample Rate DividerSMPL 是Sample的缩写,采样
RT 是Rate的缩写
SMPLRT合起来是SampleRate 采样率的缩写
DIV,是Divider 的缩写

latch

弹簧锁,

碰锁,

门闩

锁存器,

作为名词时,Latch通常指的是“门闩”、“碰锁”或“弹簧锁”,这是一种用于固定门或窗的装置

作为动词时,Latch的意思是“用闩把...闩上”或“用碰锁把...锁上”,即使用门闩或碰锁将门、窗等固定或锁住


此外,Latch在电子领域也有特定的应用。在数码电子直路中,Latch是一种用于保存二进制数据的组合逻辑电路,即锁存器。它是数字电路中最基本的记忆元件之一,被广泛应用于数字系统中的寄存器、缓存、捕获和比较器等部件中3。锁存器的主要功能是“锁住”某个输入信号的值,在时钟边沿或控制信号变化时将待锁住的信息存储在内部

Transitioned“Transitioned”是英文单词“transition”的过去式和过去分词形式,主要有以下几层含义转变、变迁:它通常用来描述某种状态、形式或位置的改变或过渡。例如,一个人从一种职业过渡到另一种职业,或者一个社会从一个阶段转变到另一个阶段,都可以使用“transitioned”来描述这种变化
FS_SELFull Scale SelectICM-20608 X/Y/Z 轴加速度计的量程范围选择,可选择±2g,±4g,±8g和±16g

5. 硬件原理

正点原子I.MX6U ALPHA 开发板上使用的ICM-20608 6轴MEMS 陀螺仪角速度和加速度传感器的SPI接口进行通信,在I.MX6U-ALPHA 开发板底板的电路原理图中使用如下引脚:

从电路原理图得到ICM-20608 MEMS传感器使用的SPI引脚对应的I.MX6U IOMUX 接口复用如下:

SPI信号线SPI信号线功能IO引脚IOMUX复用
ECSPI3_SS0片选UART2_TXDALT8
ECSPI3_SCLK时钟UART2_RXDALT8
ECSPI3_MISO主设备输入UART2_RTSALT8
ECSPI3_MOSI主设备输出UART2_CTSALT8

6. SPI驱动程序源码编写

6.1 ICM20608 SPI 接口特性

ICM20608 SPI 接口的CPOL(Clock Polarity时钟极性)和CPHA(Clock Phase时钟相位)从数据手册中可以找到,如下图,ICM20608 SPI 接口的 CPOL=1, CPHA=1 。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小白专用 已验证24.5.30】ThinkPHP6 视图

ThinkPHP6 视图 模板引擎支持普通标签和XML标签方式两种标签定义,分别用于不同的目的 标签类型描述普通标签主要用于输出变量、函数过滤和做一些基本的运算操作XML标签也称为标签库标签,主要完成一些逻辑判断、控制和循环输出,并且可扩展 c…

Vue:现代前端开发的首选框架-【基础篇】

引言 在众多前端框架中,Vue.js 以其独特的优势脱颖而出,成为现代前端开发的首选框架之一。本文将首先介绍 Vue.js 的优势,随后详细讲解如何搭建 Vue.js 开发环境,并深入探讨 Vue.js 的核心概念。 Vue.js 的优势 选择 Vue.js 作…

SpringBoot整合Shiro流程

1.pom.xml导入shiro相关jar包 <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version> </dependency> <dependency><groupId>org.apache.shiro</gr…

注意力可视化代码

读取网络层输出的特征到txt文件&#xff0c;arr为文件名 def hot(self, feature, arr):# 在第二维&#xff08;通道维&#xff09;上相加summed_tensor torch.sum(feature, dim1, keepdimTrue) # 结果形状为 [1, 1, 64, 64]selected_matrix summed_tensor.squeeze(1) # 移除…

牛客小白月赛95

c相助 题目描述 此题为E题的easy版&#xff0c;只有aia_iai​的数据范围不同。 给你一个 nnn 个正整数组成的数组 a &#xff0c;你每次操作可以选择一对 (i,j)( i, j )(i,j)&#xff0c;满足 1≤i<j≤n1 \leq i < j \leq n1≤i<j≤n&#xff0c;且 aiaja_{i} a_{…

三丰云免费服务器

三丰云网址&#xff1a; https://www.sanfengyun.com 可申请免费云服务器&#xff0c;1核/1G内存/5M宽带/有公网IP/10G SSD硬盘/免备案。 收费云服务器&#xff0c;买2年送1年&#xff0c;有很多优惠

Lombok一文通

1、Lombok简介 作为java的忠实粉丝&#xff0c;但也不得不承认&#xff0c;java是一门比较啰嗦的语言&#xff0c;很多代码的编写远不如其他静态语言方便&#xff0c;更别说跟脚本语言比较了。 因此&#xff0c;lombok应运而生。 Lombok是一种工具库&#xff0c;它提供了一组…

msf攻击windows实例

环境&#xff1a;攻击机kali&#xff08;192.168.129.139&#xff09;&#xff0c;目标机windows10&#xff08;192.168.129.132&#xff09; 方法一&#xff1a;通过web站点&#xff0c;使用无文件的方式攻击利用执行&#xff08;命令执行漏洞&#xff09; 方法二&#xff1…

迪文 51单片机,全局变量、静态变量初始化失败,修正

1. 问题 51单片机全局变量常量的初始化&#xff0c;static code const函数内部静态变量初始化也失败&#xff0c;例如 void fun() {static int a 5;printf("a %d\n", a); //输入的不一定是5&#xff0c;是之前这个地址的值&#xff08;随机值&#xff09; }2. 解决…

Lua两个点号连接字符串

在Lua中&#xff0c;两个点号 .. 代表字符串连接操作符。当你想要将两个或多个字符串拼接在一起时&#xff0c;可以使用这个操作符。 以下是使用 .. 操作符的一些示例&#xff1a; local str1 "Hello, " local str2 "World!" local result str1 .. str2…

提示工程(Prompt Engineering)和代码生成

文心一言 提示工程&#xff08;Prompt Engineering&#xff09;和代码生成之间的关系主要体现在如何通过精心设计的提示来指导或优化代码生成的过程。以下是关于提示工程和代码生成的详细解释&#xff1a; 一、提示工程&#xff08;Prompt Engineering&#xff09; 提示工程…

路径操作函数

System.SysUtils.AnsiCompareFileName 根据当前语言环境比较文件名。 在 Windows 下不区分大小写&#xff0c;在 MAC OS 下区分大小写。 在不使用多字节字符集 (MBCS) 的 Windows 区域设置下&#xff0c;AnsiCompareFileName 与 AnsiCompareText 相同。在 MAC OS 和 Linux 下&…

KotlinConf 2024:深入了解Kotlin Multiplatform (KMP)

KotlinConf 2024&#xff1a;深入了解Kotlin Multiplatform (KMP) 在近期的Google I/O大会上&#xff0c;我们推荐了Kotlin Multiplatform (KMP)用于跨移动、网页、服务器和桌面平台共享业务逻辑&#xff0c;并在Google Workspace中采用了KMP。紧接着&#xff0c;KotlinConf 2…

【设计模式深度剖析】【7】【结构型】【享元模式】| 以高脚杯重复使用、GUI中的按钮为例说明,并对比Java类库设计加深理解

&#x1f448;️上一篇:外观模式 | 下一篇:结构型设计模式对比&#x1f449;️ 设计模式-专栏&#x1f448;️ 目录 享元模式定义英文原话直译如何理解&#xff1f;字面理解例子&#xff1a;高脚杯的重复使用例子&#xff1a;GUI中的按钮传统方式使用享元模式 4个角色1. …

锻压设备智能制造工厂物联数字孪生平台,推进制造业数字化转型

锻压设备智能制造工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。随着全球制造业的飞速发展&#xff0c;数字化转型已经成为企业提升竞争力、实现可持续发展的关键。在锻压设备智能制造领域&#xff0c;工业物联数字孪生平台以其强大的数据集成、分析和管理能力&#…

国际物流管理系统的选择:花钱不怕,就怕花冤枉钱

现在市场上的国际物流管理系统还是非常多的&#xff0c;想在这么多类型的系统中选择一套适合自己的系统确实不是个简单的事情。 尤其是现在很多物流商其实都是比较小的国际物流商&#xff0c;很多大型的&#xff0c;过于复杂的系统并不适合这个群体。那这个群体应该怎么选择国…

什么是Java序列化?它有什么用途?

Java序列化&#xff08;Serialization&#xff09;是将Java对象转换为字节流的过程&#xff0c;反序列化&#xff08;Deserialization&#xff09;则是将字节流恢复为Java对象的过程。Java的序列化机制使得对象的持久化和跨网络传输成为可能。 Java序列化的用途 持久化存储&am…

mfc140u.dll丢失的解决方法有哪些?怎么全面修复mfc140u.dll文件

mfc140u.dll丢失其实相对来说不太常见到&#xff0c;因为这个文件一般是不丢失的&#xff0c;不过既然有人遇到这种问题&#xff0c;那么小编一定满足各位&#xff0c;给大家详细的唠叨一下mfc140u.dll丢失的各种解决方法&#xff0c;教大家以最快最有效率的方法去解决mfc140u.…

【Redis】Redis分片集群中数据的存储和读取

Redis 分片集群&#xff08;Sharded Cluster&#xff09;通过将数据分散到多个节点上来实现高可用性和可扩展性。它采用一致性哈希&#xff08;Consistent Hashing&#xff09;或其他哈希算法来将键分配到不同的分片中。每个分片由一个或多个 Redis 实例组成&#xff0c;这些实…

Spring MVC 源码分析之 DispatcherServlet#getHandlerAdapter 方法

前言&#xff1a; 前面我们分析了 Spring MVC 的工作流程源码&#xff0c;其核心是 DispatcherServlet#doDispatch 方法&#xff0c;我们前面分析了获取 Handler 的方法 DispatcherServlet#getHandler 方法&#xff0c;本篇我们重点分析一下获取当前请求的适配器 HandlerAdapt…