SPI 全称是 SerialPerripheral Interface,也就是串行外围设备接口。SPI 是 Motorola 公司推出的一种同步串行接口
技术,是一种高速、全双工的同步通信总线,SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线,但是也可以使用三根线(单向传输),本章我们讲解标准的 4 线 SPI,这四根线如下:
SPI 通信都是由主机发起的,主机需要提供通信的时钟信号。主机通过 SPI 线连接多个从设备的结构如下图 所示
四种工作模式:改变串行时钟极性(CPOL)和相位(CPHA)能得到四种工作模式
以 CPOL=0,CPHA=0 这个工作模式为例,SPI 进行全双工通信的时序如图
主机输出11010010 主机读取数据位01100110
•全双工同步串行接口
•主/从配置
•四个片选(SS)信号支持多个外设
•传输继续功能允许无限长度的数据传输
•32*64的FIFO,用于发送和接收数据
•片选(SS)和SPI时钟(SCLK)的极性和相位是可配置的
•直接内存访问(DMA)支持
•最大工作频率直至参考时钟频率。
重要寄存器:
接收数据寄存器(ECSPI_RXDATA)是只读寄存器,它构成前几位64 x 32的字接收FIFO。 该寄存器保存从外部接收的数据
数据传输期间的SPI设备。 仅允许字大小的读取操作。
发送数据(ECSPI_TXDATA)寄存器是一个只写数据寄存器,保存将要发送的数据
BURST_LENGTH(bit31:20) :突发长度,设置 SPI 的突发传输数据长度,在一次 SPI 发送中最大可以发送 2^12bit 数据。可以设置 0X000~0XFFF,分别对应 1~2^12bit。我们一般设置突发长度为一个字节,也就是 8bit,BURST_LENGTH=7。
CHANNEL_SELECT(bit19:18):SPI 通道选择,一个 ECSPI 有四个硬件片选信号,每个片选信号是一个硬件通道,虽然我们本章实验使用的软件片选,但是 SPI 通道还是要选择的。可设置为 0~3,分别对应通道 0~3。
DRCTL(bit17:16) :SPI 的 SPI_RDY 信号控制位,用于设置 SPI_RDY 信号,为 0 的话不关心 SPI_RDY 信号;为 1 的话 SPI_RDY 信号为边沿触发;为 2 的话 SPI_DRY 是电平触发。
PRE_DIVIDER(bit15:12): SPI 预分频,ECSPI 时钟频率使用两步来完成分频,此位设置的是第一步,可设置 0~15,分别对应 1~16 分频。
POST_DIVIDER(bit11:8) :SPI 分频值,ECSPI 时钟频率的第二步分频设置,分频值为2^POST_DIVIDER。
CHANNEL_MODE(bit7:4): SPI 通道主/从模式设置,CHANNEL_MODE[3:0]分别对应 SPI通道 3~0,为 0 的话就是设置为从模式,如果为 1 的话就是主模式。比如设置为 0X01 的话就是设置通道 0 为主模式。
SMC(bit3):开始模式控制,此位只能在主模式下起作用,为 0 的话通过 XCH 位来开启 SPI突发访问,为 1 的话只要向 TXFIFO 写入数据就开启 SPI 突发访问。
XCH(bit2) :此位只在主模式下起作用,当 SMC 为 0 的话此位用来控制 SPI 突发访问的开启。
HT(bit1) :HT 模式是能位,I.MX6ULL 不支持。
EN(bit0) :SPI 使能位,为 0 的话关闭 SPI,为 1 的话使能 SPI。
HT_LENGTH(bit28:24):HT 模式下的消息长度设置,I.MX6ULL 不支持。
SCLK_CTL(bit23:20):设置 SCLK 信号线空闲状态电平,SCLK_CTL[3:0]分别对应通道3~0,为 0 的话 SCLK 空闲状态为低电平,为 1 的话 SCLK 空闲状态为高电平。
DATA_CTL(bit19:16):设置 DATA 信号线空闲状态电平,DATA_CTL[3:0]分别对应通道3~0,为 0 的话 DATA 空闲状态为高电平,为 1 的话 DATA 空闲状态为低电平。
SS_POL(bit15:12) :设置 SPI 片选信号极性设置,SS_POL[3:0]分别对应通道 3~0,为 0 的话片选信号低电平有效,为 1 的话片选信号高电平有效。
SCLK_POL(bit7:4):SPI 时钟信号极性设置,也就是 CPOL,SCLK_POL[3:0]分别对应通道 3~0,为 0 的话 SCLK 高电平有效(空闲的时候为低电平),为 1 的话 SCLK 低电平有效(空闲的时候为高电平)。
SCLK_PHA(bit3:0): SPI时钟相位设置,也就是CPHA,SCLK_PHA[3:0]分别对应通道3~0,为 0 的话串行时钟的第一个跳变沿(上升沿或下降沿)采集数据,为 1 的话串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。
CSD_CTL(bit21:16) :片选信号延时控制位,用于设置片选信号和第一个 SPI 时钟信号之间的时间间隔,范围为 0~63。
CSRC(bit15):SPI 时钟源选择,为 0 的话选择 SPI CLK 为 SPI 的时钟源,为 1 的话选择32.768KHz 的晶振为 SPI 时钟源。我们一般选择 SPI CLK 作为 SPI 时钟源,
CCM_CSCDR2寄存器控制SPI时钟选择和分频
SAMPLE_PERIO(bit14:0): 控制采样周期,可设置为 0~0X7FFF 分别对应 0~32767 个周期。
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为空。