您当前的位置: 首页 > 

韦东山

暂无认证

  • 0浏览

    0关注

    506博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

18_SPI编程

韦东山 发布时间:2022-01-13 16:05:49 ,浏览量:0

第十八章 SPI编程(有误) 18.1 SPI接口简介

​ 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单线通讯模式框图,只对设备进行写操作。

image-20220107143401855

18.1.2 SPI通讯数据格式

​ 在master模式下,ss、sclk和mosi作为信号输出接口,MISO作为信号输入接口。通过SS片选信号使能外部SPI设备,SCLK同步数据传输。MOSI和MISO信号在SCLK上升沿变化,在下降沿锁存数据。SPI的具体通讯格式如下图所示(默认高位在前,低位在后),输出数据为0xD2,输入数据为0x66。

image-20220107143430735

​ SPI支持不同的SPI时钟和CS片选相位和极性设置,通过设置POL和PHA值的不同来设置相对相位和极性。POL:表示SPICLK的初始电平,0为电平,1为高电平 ;CHA:表示相位,即第一个还是第二个时钟沿采样数据,0为第一个时钟沿,1为第二个时钟沿。具体如下表所示:

POLPHA模式含义000初始电平为低电平,在第一个时钟沿采样数据011初始电平为低电平,在第二个时钟沿采样数据102初始电平为高电平,在第一个时钟沿采样数据113初始电平为高电平,在第二个时钟沿采样数据

​ 实际时钟和相位关系如下图所示,我们常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。极性选什么?格式选什么?通常去参考外接的模块的芯片手册。

image-20220107162721035

18.2 IMX6ULL的SPI控制器操作与寄存器介绍 18.2.1 SPI控制器介绍

IMX6ULL的SPI控制器ECSPI(Enhanced Configurable Serial Peripheral Interface) 为全双工同步四线串行通讯模块,有4路独立的控制器。主要特性如下:

  • 全双工同步串行接口
  • 可配置为MASTER或SLAVE模式
  • 支持多达四个片选信号来连接不同的外设
  • 传输数据长度不限
  • 包含一个64X32的接收FIFO和64X32的发送FIFO
  • 片选信号和时钟信号的极性及相位可配置
  • 支持DMA(Direct Memory Acess)
  • 最大运行频率依赖于参考时钟频率

SPI控制器内部包含位移寄存器、接收和发送FIFO、控制寄存器等相关寄存器。SPI控制器时钟来源于外部,有低频和参考时钟源两个来源。通过时钟发生器提供给状态机进行SPI控制器的状态控制,控制器内部框图如下图所示。

image-20220107163027163

18.2.2 SPI控制器初始化流程

SPI控制器在使用时,需要首先进行初始化。具体的初始化流程如下:

  1. 清除CONFREG寄存器的EN位来复位模块
  2. 使能SPI时钟,具体在CCM模块中进行设置
  3. 配置控制寄存器,并使能ECSPI_CONFREG寄存器的EN位来让模块工作
  4. 配置SPI引脚,具体在IOMUX中设置
  5. 根据外部SPI设备规格信息来配置SPI寄存器

在MASTER模式下,对SPI的操作可以参考下图所示的流程进行设置

image-20220107163102420

18.2.3 SPI控制器寄存器介绍

IMX6ULL有4路SPI控制器,掌握其中一路SPI控制器即可。其他几路SPI控制器都类似,只需要修改寄存器基址和IO复用管脚即可。这里以SPI3为例进行说明,SPI3的相关寄存器地址如下图所示,其中红框内的寄存器为我们本次实验使用到的寄存器。

image-20220107163123688

此次实验用到的寄存器具体功能如下:

18.2.3.1 ECSPIx_RXDATA

该寄存器用于保存数据传输中从外部设备接收到的外部数据,是只读寄存器。该寄存器与接收数据FIFO的顶端数据相同,只允许四个字节的读操作。当模块被禁止的时候,读取到的是0。

image-20220107163227986

18.2.3.2 ECSPIX_TXDATA

该寄存器用于保存数据传输中发送给外部设备的数据,是只写寄存器。该寄存器与发送数据FIFO有关,只允许四个字节的写操作。当模块被禁止的时候,写入的数据将被忽略。

image-20220107163245837

18.2.3.3 ECSPIX_CONREG

该寄存器用于设置SPI控制器的操作模式,包括时钟频率,相关控制方式和数据传输长度等。

image-20220107163253051

18.2.3.4 ECSPIX_CONFIGREG

该寄存器用于配置每个不同SPI片选通道的控制方式,包括SPI时钟和片选信号的模式相位和极性等。

image-20220107163353864

18.2.3.5 ECSPIX_STATREG

该寄存器只有低8位有效,用于指示SPI控制器的操作状态,包括发送和接收FIFO的状态等信息。如果模块被禁止的话,读取到的值为0x00000003。

image-20220107163402129

18.2.3.6 ECSPIX_TESTREG

该寄存器提供了一个测试方式,通过软件在SPI控制器内部将接收和发送区域连接起来。通过该寄存器,将接收和发送连接起来了,可以用于测试。不会影响到设备的输出,同时外部的输入将会被忽略。

image-20220107163431517

18.2.4 SPI控制器介绍

为了使用SPI控制器,我们需要初始化对应的IO引脚为spi3引脚。PAD的功能设置框图如下图所示,需要设置引脚工作模式、引脚上下拉和工作速度等。

image-20220107163542616

18.2.4.1 初始化SPI3引脚

初始化引脚为SPI3,涉及到的引脚模式配置的寄存器如下图所示。

image-20220107163559253

这四组引脚涉及到的具体寄存器如下

  1. IOMUXC_SW_MUX_CTL_PAD_UART2_TX_DATA

该寄存器用于设置SPI3的SS0片选引脚,由于需要设置为SPI3_SS0模式(如果要求CS片选有效和时钟有效间隔较大,可以将该引脚设置为普通GPIO来进行拉高拉低操作来代替默认片选功能,此时应将该引脚设置成GPIO模式)。

image-20220107163605899

  1. IOMUXC_SW_MUX_CTL_PAD_UART2_RX_DATA

该寄存器用于设置SPI3的SCLK引脚,需要设置为SPI3_SCLK模式。

image-20220107163611126

  1. IOMUXC_SW_MUX_CTL_PAD_UART2_CTS_B

该寄存器用于设置SPI3的MOSI引脚,需要设置为SPI3_MOSI模式。

image-20220107163616139

  1. IOMUXC_SW_MUX_CTL_PAD_UART2_RTS_B

该寄存器用于设置SPI3的MISO引脚,需要设置为SPI3_MISO模式。

image-20220107163623707

初始化引脚为SPI3之后,需要设置引脚的上下拉和工作速度等,涉及到的SW_CTL_PAD下图所示。

18.2.4.2 初始化SPI3工作速率

image-20220107163718602

这四组引脚涉及到的具体寄存器如下

  1. IOMUXC_SW_PAD_CTL_PAD_UART2_TX_DATA

该寄存器用于设置引脚UART2_TX_DATA上下拉、速度和驱动能力等,具体如下图所示。

image-20220107163724691

  1. IOMUXC_SW_PAD_CTL_PAD_UART2_RX_DATA

该寄存器用于设置引脚UART2_RX_DATA上下拉、速度等,具体如下图所示。

image-20220107163732738

  1. IOMUXC_SW_PAD_CTL_PAD_UART2_CTS_B

该寄存器用于设置引脚UART2_CTS_B上下拉、速度等,具体如下图所示。

image-20220107163737567

  1. IOMUXC_SW_PAD_CTL_PAD_UART2_RTS_B

该寄存器用于设置引脚UART2_RTS_B上下拉、速度等,具体如下图所示。

image-20220107163741931

18.3 ICM-20608-G操作方法 18.3.1 ICM-20608-G介绍

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内部框图如下所示:

image-20220107163934560

18.3.2 ICM-20608-G操作方法

ICM-20608-G支持SPI和I2C去操作,这里选择SPI接口进行控制。具体连接方式如下图所示,通过SPI接口连接到imx6ull上,使用imx6ull的spi3接口去读写ICM-206068-G设备。

image-20220107163953919

18.3.3 ICM-20608-G相关寄存器

ICM-20608-G内部有多个寄存器,可以通过spi接口来选择不同寄存器地址来实现读取设备ID、温度、加速度和加速度等多个信息,也可以通过SPI接口来设置ICM-20608-G的相关工作方式。相关寄存器地址具体如下图所示,其中红框里的是此次实验涉及到的寄存器。

image-20220107164000427

相关寄存器的含义具体如下:

  1. Sample rate divider

该寄存器用于设置采样频率,该值用于产生采样频率来控制传感器数据输出和FIFO采样率。

  1. Configuration

该寄存器用于设置设备的工作模式,包括FIFO、加速度、温度和加速度输出等。

  1. Gyroscope configuration

该寄存器用于配置加速度传感器,包括量程选择、是否自测等信息

  1. Accelerometer configuration

该寄存器用于配置加速度传感器,包括量程选择、是否自测等。

  1. Accelerometer configuration2

该寄存器也同时用于配置加速度传感器,包括采样速度等

  1. Low power mode configuration

该寄存器用于设置ICM-20608-G是否处于低功耗模式以及唤醒频率

  1. Fifo enable

该寄存器用于设置数据存储FIFO是否进行使用,为1表示使用,为0表示禁止FIFO。

  1. Power management1

该寄存器用于设置ICM-20608-G时钟来源、电源模式、以及是否清楚全部寄存器到默认状态等

  1. Power management2

该寄存器用于设置是否使能相关传感器、包括加速度和角速度传感器

  1. Who am i

该寄存器存储设备ID,ICM-20608-G的默认值为0xAF。

  1. Accelerometer measurements

该寄存器存储角速度的测量结果,一共6个地址,每两个地址为一组X/Y/Z轴角速度的高低字节,具体内容如下图所示。

  1. Temperature measurements

该寄存器用于存储温度测量结果,由高低两个字节构成。

  1. 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的引脚如下图红框处所示。

image-20220107164100677

18.4.1.1 设置引脚的工作模式

我们首先设置引脚的工作模式,然后设置引脚上下拉和驱动能力等

  1. 设置SPI3的SS0片选引脚,针对ICM-20608-G,我们将该引脚设置成GPIO,通过拉高拉低来进行片选操作。因此需要将IOMUX_SW_MUX_CTL_PAD_UART2_TX_DATA设置为ALT5模式,作为GPIO进行使用。SPI3的SS0引脚对应的GPIO为GPIO1_20,具体地址如下所示。

image-20220107164214439

  1. 设置SPI3的SCLK引脚,需要将IOMUXC_SW_MUX_CTL_PAD_UART2_RX_DATA设置为ALT8模式。

  2. 设置SPI3的MOSI引脚,需要将IOMUXC_SW_MUX_CTL_PAD_UART2_CTS_B设置为ALT8模式。

  3. 设置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            
关注
打赏
1658827356
查看更多评论
0.0411s