1. SPI协议
SPI是一种高速全双工的同步通信总线。比起I2C的优势在于其速度可以到上百MHz。SPI通信由主机发起,标准SPI由4根线控制:
①CS/SS:片选信号线。与I2C不同的是,SPI不需要主机发送设备地址,通过拉低对应从机的片选信号即可选中。
②SCK:类似I2C的SCL,串行时钟线。
③MOSI/SDO:主出从入信号线。用于主机向从机发送数据。
④MISO/SDI:主入从出信号线。从机向主机发送数据。
SPI有四种工作模式:通过串行时钟极性CPOL和相位CPHA进行选择。
①CPOL=0:串行时钟空闲状态为低电平。
②CPOL=1:串行时钟空闲状态为高电平,此时结合CPHA可以选择具体传输协议。
③CPHA=0:串行时钟第一个跳变沿采集数据。
④CPHA=1:串行时钟第二个跳变沿采集数据。
比较常用的是①③组合的工作模式。
SPI时序:CPOL=0,CPHA=0模式
首选拉低CS,选中要通信的从机;然后MOSI和MISO进行主从通信。
2. I.MX6I ECSPI
ECSPI是I.MX6U自带的SPI外设。有6432个接收FIFO,6432个发送FIFO。有四个硬件片选信号,想要连接更多的SPI外设可以使用软件片选(而且软件片选可以用任意IO)。ECSPI有主从模式,我们选择主模式,使用软件片选。
ECSPI重要寄存器:
1)ECSPIx_CONREG(x=1-4):控制寄存器。
①BURST_LENGTH(bit31:24):设置SPI的突发传输数据长度。一般设为7,即对应8bit的突发数据长度。
②CHANNEL_SELECT(bit19:18):SPI通道选择,一个ECSPI有四个硬件片选,每个对应一个硬件通道,由于ICM-20608片选接的是ECSPI3_SS0,就是ECSPI3的通道0,所以设为0。
③DRCTL(bit17:16):SPI_RDY信号控制位,为0不关心SPI_RDY,为SPI_RDY为边沿触发,为2电平触发。
④PRE_DIVIDER(bit15:12):SPI预分频,可设为0-15,分别对应1-16分频。
⑤POST_DIVIDER(bit11:8):SPI分频,分频值为2^POST_DIVIDER。
⑥CHANNEL_MODE(bit7:4):SPI通道主从模式设置。四bit分别对应SPI通道3-0。为0从模式,为1主模式。
⑦SMC(bit3):主模式下的开始模式控制。为0通过XCH位开启SPI突发访问,为1向TXFIFO写入数据时就自动开启突发访问。
⑧XCH(bit2):见SMC。
⑨EN(bit0):SPI使能。为0关闭,为1开启。
2)ECSPIx_CONFIGREG(x=1-4):配置寄存器。
①SCLK_CTL(bit23:20):设置SCLK信号线空闲状态电平。分别对应通道3-0,为0时SCLK空闲为低,为1空闲为高。
②DATA_CTL(bit19:16):设置DAT信号线空闲状态电平,分别对应通道3-0,为0时DATA空闲为低,为1空闲为高。
③SS_POL(bit15:12):SPI片选信号极性设置。分别对应通道3-0,为0片选信号低电平有效,为1高电平有效。
④SCLK_POL(bit7:4):SPI时钟信号极性设置(CPOL)。分别对应通道3-0,为0SCLK高电平有效(空闲为低),为1相反。
⑤SCLK_PHA(bit3:0):SPI时钟相位设置(CPHA)。分别对应通道3-0,为0时串行时钟第一个跳变沿采集数据,为1第二个采集。
3)ECSPIx_PERIODREG(x=1-4):采样周期寄存器。
①CSD_CTL(bit21:16):片选信号延时控制位。用于设置片选信号和首个SPI时钟信号之间的时间间隔,范围为0-63。
②CSRC(bit15):SPI时钟源选择,为0选择SPI_CLK,为1选择32.768KHz晶振。一般设为0。
③SAMPLE_PERIO(bit14:0):设置采样周期,范围为0-0x7FFF,分别对应0-32767个周期。这里设置为0x2000
SPI_CLK时钟树分支:
首先通过CSCDR2的ECSPI_CLK_SEL进行根时钟源的选择,为0选择pll3_60m,为1选择osc_clk。这里设置为0。
然后由CSCDR2的ECSPI_CLK_PODF进行分频,分频值为2^ECSPI_CLK_PODF。这里设为0,1分频。
4)ECSPIx_STATREG(x=1-4):状态寄存器。
①TC(bit7):传输完成标志位。为0时表示正在传输,为1表示传输完成。
②RO(bit6):RXFIFO溢出标志位。为0表示无溢出,1表示溢出。
③RF(bit5):RXFIFO空标志位。为0表示不为空,为1表示空。
④RDR(bit4):RXFIFO数据请求标志位。为0表示RXFIFO里数据不大于RX_THRESHOLD,否则大于。
⑤RR(bit3):RXFIFO就绪标志位。为0表示里面没有数据,为1表示里面至少有一个字节数据。
⑥TF(bit2):TXFIFO满标志位。为0不为满,为1表示满。
⑦TDR(bit1):TXFIFO数据请求标志位。类似RDR。
⑧TE(bit0):TXFIFO空标志位,为0表示至少有1字节数据,为1表示空。
5)ECSPIx_TXDATA 和 ECSPIx_RXDATA(x=1-4):数据寄存器。
这两个都是32位寄存器。向TX发送数据,由RX读取数据。
3. ICM-20608
6轴MEMS传感器。包括3轴加速度计(±2/4/8/16g)和3轴陀螺仪(量程±250/500/1000/2000°/s)。该传感器支持的SPI最高8MHz。其硬件连接原理图如下:
重点寄存器WHOAMI(7:0)–0X75:该寄存器是ID寄存器,2068G的ID为0XAF,2068D为0XAE。还有就是0X3B到0X48就是数据寄存器。具体看驱动手册。
该器件的I2C地址由AD0引脚控制,默认为110100X,AD0=0时X=0,AD0=1时X=1。
4. Code
spi.c: