SPI(Serial Peripheral Interface)接口是全双工的同步串行通讯总线,支持通过多个不同的片选信号来连接多个外设。SPI接口通常由四根线组成,分别是提供时钟的SCLK,提供数据输出的MOSI,提供数据输入的MISO和提供片选信号的CS。同一时刻只能有一个SPI设备处于工作状态。为了适配不同的外设 ,SPI支持通过寄存器来配置片选信号和时钟信号的极性和相位。(imx6ull支持ecspi,即增强配置型spi,这里为了与其他兼容,统一用spi来称呼)。
18.1.1 SPI硬件连接 SPI支持slave和master两种模式,作为APU来说,多数情况下是作为master来使用的。在master模式下,通过不同的片选引脚ssn来连接多个不同的设备。下图为MASTER模式下的SPI单线通讯模式框图,只对设备进行写操作。
在master模式下,ss、sclk和mosi作为信号输出接口,MISO作为信号输入接口。通过SS片选信号使能外部SPI设备,SCLK同步数据传输。MOSI和MISO信号在SCLK上升沿变化,在下降沿锁存数据。SPI的具体通讯格式如下图所示(默认高位在前,低位在后),输出数据为0xD2,输入数据为0x66。
SPI支持不同的SPI时钟和CS片选相位和极性设置,通过设置POL和PHA值的不同来设置相对相位和极性。POL:表示SPICLK的初始电平,0为电平,1为高电平 ;CHA:表示相位,即第一个还是第二个时钟沿采样数据,0为第一个时钟沿,1为第二个时钟沿。具体如下表所示:
POLPHA模式含义000初始电平为低电平,在第一个时钟沿采样数据011初始电平为低电平,在第二个时钟沿采样数据102初始电平为高电平,在第一个时钟沿采样数据113初始电平为高电平,在第二个时钟沿采样数据 实际时钟和相位关系如下图所示,我们常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。极性选什么?格式选什么?通常去参考外接的模块的芯片手册。
IMX6ULL的SPI控制器ECSPI(Enhanced Configurable Serial Peripheral Interface) 为全双工同步四线串行通讯模块,有4路独立的控制器。主要特性如下:
- 全双工同步串行接口
- 可配置为MASTER或SLAVE模式
- 支持多达四个片选信号来连接不同的外设
- 传输数据长度不限
- 包含一个64X32的接收FIFO和64X32的发送FIFO
- 片选信号和时钟信号的极性及相位可配置
- 支持DMA(Direct Memory Acess)
- 最大运行频率依赖于参考时钟频率
SPI控制器内部包含位移寄存器、接收和发送FIFO、控制寄存器等相关寄存器。SPI控制器时钟来源于外部,有低频和参考时钟源两个来源。通过时钟发生器提供给状态机进行SPI控制器的状态控制,控制器内部框图如下图所示。
SPI控制器在使用时,需要首先进行初始化。具体的初始化流程如下:
- 清除CONFREG寄存器的EN位来复位模块
- 使能SPI时钟,具体在CCM模块中进行设置
- 配置控制寄存器,并使能ECSPI_CONFREG寄存器的EN位来让模块工作
- 配置SPI引脚,具体在IOMUX中设置
- 根据外部SPI设备规格信息来配置SPI寄存器
在MASTER模式下,对SPI的操作可以参考下图所示的流程进行设置
IMX6ULL有4路SPI控制器,掌握其中一路SPI控制器即可。其他几路SPI控制器都类似,只需要修改寄存器基址和IO复用管脚即可。这里以SPI3为例进行说明,SPI3的相关寄存器地址如下图所示,其中红框内的寄存器为我们本次实验使用到的寄存器。
此次实验用到的寄存器具体功能如下:
18.2.3.1 ECSPIx_RXDATA该寄存器用于保存数据传输中从外部设备接收到的外部数据,是只读寄存器。该寄存器与接收数据FIFO的顶端数据相同,只允许四个字节的读操作。当模块被禁止的时候,读取到的是0。
该寄存器用于保存数据传输中发送给外部设备的数据,是只写寄存器。该寄存器与发送数据FIFO有关,只允许四个字节的写操作。当模块被禁止的时候,写入的数据将被忽略。
该寄存器用于设置SPI控制器的操作模式,包括时钟频率,相关控制方式和数据传输长度等。
该寄存器用于配置每个不同SPI片选通道的控制方式,包括SPI时钟和片选信号的模式相位和极性等。
该寄存器只有低8位有效,用于指示SPI控制器的操作状态,包括发送和接收FIFO的状态等信息。如果模块被禁止的话,读取到的值为0x00000003。
该寄存器提供了一个测试方式,通过软件在SPI控制器内部将接收和发送区域连接起来。通过该寄存器,将接收和发送连接起来了,可以用于测试。不会影响到设备的输出,同时外部的输入将会被忽略。
为了使用SPI控制器,我们需要初始化对应的IO引脚为spi3引脚。PAD的功能设置框图如下图所示,需要设置引脚工作模式、引脚上下拉和工作速度等。
初始化引脚为SPI3,涉及到的引脚模式配置的寄存器如下图所示。
这四组引脚涉及到的具体寄存器如下
- IOMUXC_SW_MUX_CTL_PAD_UART2_TX_DATA
该寄存器用于设置SPI3的SS0片选引脚,由于需要设置为SPI3_SS0模式(如果要求CS片选有效和时钟有效间隔较大,可以将该引脚设置为普通GPIO来进行拉高拉低操作来代替默认片选功能,此时应将该引脚设置成GPIO模式)。
- IOMUXC_SW_MUX_CTL_PAD_UART2_RX_DATA
该寄存器用于设置SPI3的SCLK引脚,需要设置为SPI3_SCLK模式。
- IOMUXC_SW_MUX_CTL_PAD_UART2_CTS_B
该寄存器用于设置SPI3的MOSI引脚,需要设置为SPI3_MOSI模式。
- IOMUXC_SW_MUX_CTL_PAD_UART2_RTS_B
该寄存器用于设置SPI3的MISO引脚,需要设置为SPI3_MISO模式。
初始化引脚为SPI3之后,需要设置引脚的上下拉和工作速度等,涉及到的SW_CTL_PAD下图所示。
18.2.4.2 初始化SPI3工作速率这四组引脚涉及到的具体寄存器如下
- IOMUXC_SW_PAD_CTL_PAD_UART2_TX_DATA
该寄存器用于设置引脚UART2_TX_DATA上下拉、速度和驱动能力等,具体如下图所示。
- IOMUXC_SW_PAD_CTL_PAD_UART2_RX_DATA
该寄存器用于设置引脚UART2_RX_DATA上下拉、速度等,具体如下图所示。
- IOMUXC_SW_PAD_CTL_PAD_UART2_CTS_B
该寄存器用于设置引脚UART2_CTS_B上下拉、速度等,具体如下图所示。
- IOMUXC_SW_PAD_CTL_PAD_UART2_RTS_B
该寄存器用于设置引脚UART2_RTS_B上下拉、速度等,具体如下图所示。
ICM-20608-G采用LGA16 封装(大小为330.75m),6轴姿态传感器,包括3轴加速度和3轴角速度,具有如下特性:
- 支持数字输出X、Y和Z轴角速度传感器(陀螺仪),具有±250、±500、±1000和±2000 ▫/秒的用户可编程量程,内部集成16位ADC
- 数字输出X、Y和Z轴加速度位±2g、±4g、±8g和±16g的用户可编程满量程,内部集成16位ADC
- 512字节的FIFO缓冲器,允许应用处理器来读取突然的数据
- 数字输出温度传感器
- 支持用户可编程的角速度、加速度和温度传感器滤波设置
- 支持400kHz的快速模式I2C,或者8MHz的SPI串行接口
- 支持self-test
- 支持动作唤醒和低功耗操作
ICM-20608-G内部框图如下所示:
ICM-20608-G支持SPI和I2C去操作,这里选择SPI接口进行控制。具体连接方式如下图所示,通过SPI接口连接到imx6ull上,使用imx6ull的spi3接口去读写ICM-206068-G设备。
ICM-20608-G内部有多个寄存器,可以通过spi接口来选择不同寄存器地址来实现读取设备ID、温度、加速度和加速度等多个信息,也可以通过SPI接口来设置ICM-20608-G的相关工作方式。相关寄存器地址具体如下图所示,其中红框里的是此次实验涉及到的寄存器。
相关寄存器的含义具体如下:
- Sample rate divider
该寄存器用于设置采样频率,该值用于产生采样频率来控制传感器数据输出和FIFO采样率。
- Configuration
该寄存器用于设置设备的工作模式,包括FIFO、加速度、温度和加速度输出等。
- Gyroscope configuration
该寄存器用于配置加速度传感器,包括量程选择、是否自测等信息
- Accelerometer configuration
该寄存器用于配置加速度传感器,包括量程选择、是否自测等。
- Accelerometer configuration2
该寄存器也同时用于配置加速度传感器,包括采样速度等
- Low power mode configuration
该寄存器用于设置ICM-20608-G是否处于低功耗模式以及唤醒频率
- Fifo enable
该寄存器用于设置数据存储FIFO是否进行使用,为1表示使用,为0表示禁止FIFO。
- Power management1
该寄存器用于设置ICM-20608-G时钟来源、电源模式、以及是否清楚全部寄存器到默认状态等
- Power management2
该寄存器用于设置是否使能相关传感器、包括加速度和角速度传感器
- Who am i
该寄存器存储设备ID,ICM-20608-G的默认值为0xAF。
- Accelerometer measurements
该寄存器存储角速度的测量结果,一共6个地址,每两个地址为一组X/Y/Z轴角速度的高低字节,具体内容如下图所示。
- Temperature measurements
该寄存器用于存储温度测量结果,由高低两个字节构成。
- Gyroscope measurement
该寄存器存储加速度的测量结果,一共6个地址,每两个地址为一组X/Y/Z轴加速度的高低字节,具体内容如下图所示。
18.4 SPI控制器编程板卡通过spi3接口连接到ICM-20608-G,因此这里针对spi3进行相关编程说明,其他的spi接口可通过修改寄存器地址和初始化相关引脚来实现。
在这里,我们首先进行SPI控制器的编程。要想实现SP控制器的顺利使用,我们首先需要将对应的SPI控制器引脚初始化为SPI功能引脚,然后设置SPI控制器。SPI控制器的设置包括时钟的配置、传输数据长度、工作模式和电平极性等。SPI控制的具体部分的设置可以参考以下几个部分。
18.4.1 SPI控制器引脚设置我们使用的是SPI3控制器,连接到ICM-20608-G的引脚如下图红框处所示。
我们首先设置引脚的工作模式,然后设置引脚上下拉和驱动能力等
- 设置SPI3的SS0片选引脚,针对ICM-20608-G,我们将该引脚设置成GPIO,通过拉高拉低来进行片选操作。因此需要将IOMUX_SW_MUX_CTL_PAD_UART2_TX_DATA设置为ALT5模式,作为GPIO进行使用。SPI3的SS0引脚对应的GPIO为GPIO1_20,具体地址如下所示。
-
设置SPI3的SCLK引脚,需要将IOMUXC_SW_MUX_CTL_PAD_UART2_RX_DATA设置为ALT8模式。
-
设置SPI3的MOSI引脚,需要将IOMUXC_SW_MUX_CTL_PAD_UART2_CTS_B设置为ALT8模式。
-
设置SPI3的MISO引脚,需要将IOMUXC_SW_MUX_CTL_PAD_UART2_RTS_B设置为ALT8模式。
接下来通过寄存器SW_PAD_CTL_PAD来设置引脚上下拉和驱动能力等,我们使用默认值,不进行处理。
18.4.1.2 引脚初始化代码SPI3引脚初始化代码如下所示,将CS片选引脚设置成ALT5模式,其他设置成ALT8模式。
这部分的代码在**裸机Git仓库 NoosProgramProject/18_SPI编程(001_spi_init/spi.c)**中第87行~第96行。
//引脚初始化
iomuxc_sw_set(UART2_TX_BASE,5);//设置为GPIO作为片选来进行使用。GPIO1_IO20
GPIO1_GDIR = (volatile unsigned int *)(0x209C000 + 0x4);
GPIO1_DR = (volatile unsigned int *)(0x209C000);
*GPIO1_GDIR |= (1
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?