IMX6ULL 芯片的 SPI接口叫做 ECSPI,支持全双工、主丛可配置。
本文学习 IMX6ULL-阿尔法开发板SPI中控芯片的 SPI寄存器部分。后续代码实现需要配置 SPI相关的寄存器。
(1) RXDATA寄存器:为接收到的数据。
关于RXDATA寄存器而言,这里读取数据时,一定要等待RR位置1(即状态位)后,才可以读取数据。
TXDATA寄存器:为发送数据寄存器。
这两个寄存器都是32位寄存器。但是,我们一般使用低8位,因为SPI通信时,我们是一个字节一个字节进行传输的。
(2) CONREG寄存器:为配置寄存器。
bit0 置1,使能SPI。
Bit3 置1,表示当向TXFIFO写入数据以后马上开启SPI突发访问,也就是发送数据。
Bit7:4 设置 SPI通道主从模式,bit7为通道3,bit4为通道0,我们使用到了SS0,也就是通道0,因此需要设置bit4为1。
Bit8:11 是设置是时钟分频用的,Bit12:15也是设置时钟分频用。 (关于时钟分频数的配置在后面会进行详细的介绍!!!)
Bit19:18 设置为00,我们使用到SS0,也就是通道0。
Bit31:20 设置突发访问长度,我们设置为7,也就是8bit突发长度,一个字节。
(3) CONFIGREG寄存器:为配置寄存器。
bit0 为PHA,设置为 0,表示 串行时钟的第一个跳变沿开始采集数据。
bit4:7 位表示设置时钟极性。bit4为PO,设置为0,表示SCLK空闲的时候为低电平。
Bit8 设置0。
Bit12 设置 为0。
Bit16 设置为0,表示空闲的时候数据线为高。
Bit20 设置为0,表示SCLK空闲的时候为低。
(4) STATREG寄存器:为状态寄存器。
bit0表示TXFIFO为空,我们在发送数据之前要等待TXFIFO为空,即等待bit0为1。
Bit3表示RXFIFO是否有数据,为1的时候示RXFIFO至少有1个字的数据,我们在接收数据的时候要等到bit3为1。
(5) PERIODREG寄存器:采用周期控制寄存器。
bit14:0设置wait states时间,我们设置为0X2000。
Bit15设置wait states的时钟源为SPI CLK,将此位设置0。
Bit21:16表示片选信号的延时,可设置0-63,这里设置为0.
时钟分频设置需要参考 "时钟章节" 中的时钟树部分。
从时钟树可以看出:
SPI时钟源最终来源于pll3_sw_clk=480MHz/8=60MHz。
CSCDR2寄存器:
bit18:设置为 0,则 ECSPI时钟源为 60MHz。
bit24:19:设置为0,表示1分频,最终进入到 SPI外设的时钟源为 60MHz
ECSPI_CONREG寄存器:
ECSPI模块还需要对时钟进行两级分频,由ECSPI_CONREG寄存器设置。
Bit15:12设置前级分频,可以设置0~0xf,表示1~16分频。
Bit11:8设置2级分频,设置2^n分频,n=0~15.