简述
SPI是串行外设接口(Serial Peripheral Interface)的缩写,相比于I2C最高400bps的传输速度,SPI每秒可以传输的数据可以高达几十M甚至上百Mbit。
1、SPI的的特点是高速、全双工(可以一边发数据一边收数据)、同步(有统一的时钟信号)通信。
2、标准SPI通信一共需要四根线,
- CS:片选信号线,需要通信的时候主设备直接将对应从设备的CS拉低。
- SCK:时钟信号线
- MOSI:主出从入数据线
- MISO:主入从出数据线
(一)、I.MX6ULL的SPI接口
I.MX6ULL自带的SPI外设叫做ECSPI,一共有4个ECSPI,每一个的特点如下:
- 全双工同步串行接口
- 可配置的主从/模式
- 四个片选信号,支持多从机
- 发送和接收都有一个64x32的FIFO
- 片选信号SS/CS,时钟信号SCLK极性可配置
- 支持DMA
(二)、ECSPI的重要寄存器
1、ECSPIx_CONREG:ECSPI配置寄存器
bit | 描述 |
---|---|
bit[31:20] | 突发长度,设置SPI的突发传输数据长度,可以设置的值的范围为:0X0 ~ 0XFFF,分别对应长度为1 ~ 2^12bit,通常设置为8个bit。 |
bit[19:18] | 通道选择,一个ECSPI有四个通道,可设置值为0 ~ 3 |
bit[17:16] | SPI_RDY信号控制位。2:SPI_RDY为电平触发,1:SPI_RDY为边沿触发;0:不关心SPI_RDY信号 |
bit[15:12] | ECSPI时钟频率要分频两次后获得,这是第一次预分频,取值0 ~15,对应1 ~ 16分频 |
bit[11:8] | SPI分频,这是第二次分频,取值0 ~ 15,对应分频值2^0 ~ 2^15 |
bit[7:4] | SPI通道主/从模式设置,bit[7:4] 分别对应通道3 ~ 0,1:主模式;0:从模式 |
bit[3] | 开始模式控制,此位只能在主模式下起作用,为 0 的话通过 bit[2]位来开启 SPI突发访问,为 1 的话只要向 TXFIFO 写入数据就开启 SPI 突发访问 |
bit[2] | 此位只在主模式下起作用,当 bit[3]为 0 的话此位用来控制 SPI 突发访问的开启 |
bit[1] | HT模式使能位,貌似I.MX6ULL不支持 |
bit[0] | SPI使能位,1:使能SPI;0:关闭SPI |
2、 ECSPIx_CONFIGREG:同样也是ECSPI配置寄存器
bit | 描述 |
---|---|
bit[28:24] | HT模式下的消息长度设置,I.MX6UL不支持这个 |
bit[23:20] | 设置 SCLK 信号线空闲状态电平,bit[23:20]分别对应通道3~0,为 0 的话 SCLK 空闲状态为低电平,为 1 的话 SCLK 空闲状态为高电平 |
bit[19:16] | 设置 DATA 信号线空闲状态电平,bit[19:16]分别对应通道3~0,为 0 的话 DATA 空闲状态为高电平,为 1 的话 DATA 空闲状态为低电平 |
bit[15:12 | 设置 SPI 片选信号极性设置,bit[15:12]分别对应通道 3~0,为 0 的话片选信号低电平有效,为 1 的话片选信号高电平有效 |
bit[7:4] | SPI 时钟信号极性设置,也就是 bit[7:4]分别对应通道 3~0,为 0 的话 SCLK 高电平有效(空闲的时候为低电平),为 1 的话 SCLK 低电平有效(空闲的时候为高电平) |
bit[3:0] | SPI时钟相位设置,也就是bit[3:0]分别对应通道3~0, 为 0 的话串行时钟的第一个跳变沿(上升沿或下降沿)采集数据,为 1 的话串行时钟的第二个跳变沿(上升沿或下降沿)采集数据 |
通过bit[7:4]和bit[3:0]可以设置SPI 的工作模式。
3、ECSPIx_PERIODREG:这个是 ECSPI 的采样周期寄存器
bit | 描述 |
---|---|
bit[28:24] | 片选信号延时控制位,用于设置片选信号和第一个 SPI 时钟信号之间的时间间隔,范围为 0~63 |
bit[15] | SPI 时钟源选择,为 0 的话选择 SPI CLK 为 SPI 的时钟源,为 1 的话选择32.768KHz 的晶振为 SPI 时钟源。我们一般选择 SPI CLK 作为 SPI 时钟源 |
bit[15:0] | 采样周期,可设置为 0~0X7FFF 分别对应 0~32767 个周期 |
4、ECSPIx_STATREG:ECSPI状态寄存器
bit | 描述 |
---|---|
bit[7] | 传输完成标志位,1:传输完成;0:传输还未完成 |
bit[6] | RXFIFO溢出标志位,1:溢出;0:未溢出 |
bit[5] | RXFIFO空标志位,1:空;0:不为空 |
bit[4] | RXFIFO 数据请求标志位,此位为 0 表示 RXFIFO 里面的数据不大于RX_THRESHOLD,此位为 1 的话表示 RXFIFO 里面的数据大于 RX_THRESHOLD |
bit[3] | RXFIFO 就绪标志位,为 0 的话 RXFIFO 没有数据,为 1 的话表示 RXFIFO 中至少有一个字的数据 |
bit[2] | TXFIFO 满标志位,为 0 的话表示 TXFIFO 不为满,为 1 的话表示 TXFIFO 为满 |
bit[1] | TXFIFO 数据请求标志位,为 0 表示 TXFIFO 中的数据大于 TX_THRESHOLD, 为 1 表示TXFIFO 中的数据不大于 TX_THRESHOLD |
bit[0] | TXFIFO 空标志位,为 0 表示 TXFIFO 中至少有一个字的数据,为 1 表示 TXFIFO为空 |
5、ECSPIx_TXDATA 和 ECSPIx_RXDATA:两个数据寄存器
这两个寄存器都是 32位的,如果要发送数据就向寄存器 ECSPIx_TXDATA 写入数据,读取及存取ECSPIx_RXDATA里面的数据就可以得到刚刚接收到的数据。
(三)SPI初始化
- 初始化对应的配置寄存器ECSPIx_CONREG和ECSPIx_CONFIGREG
- 配置时钟信号
- 初始化对应的IO复用模式和电气属性
- 读写功能的实现