14. 同步串行接口SPI

14. 同步串行接口SPI

14.1 SPI简介

CH559芯片提供2个SPI接口,用于与外设之间进行高速的同步数据传输。

SPI0特性:

  1. 支持master主机模式和slave从机模式;
  2. 支持模式0和模式3时钟模式;
  3. 可选3线全双工或者2线半双工方式;
  4. 可选MSB高位首先发送或者LSB低位首先发送;
  5. 时钟频率可调,最高可达系统主频的一半;
  6. 内置3字节接收FIFO和1字节发送FIFO;
  7. 支持多种中断。

SPI1特性:

  1. 只支持master主机模式,MSB高位首先发送;
  2. 支持模式0和模式3时钟模式;
  3. 可选3线全双工或者2线半双工方式;
  4. 时钟频率可调,最高可达系统主频的一半。

14.2 SPI寄存器

表14.2.1 SPI相关寄存器列表

名称地址描述复位值
SPI0_SETUP FChSPI0设置寄存器 00h
SPI0_S_PRE FBhSPI0从机模式预置数据寄存器 20h
SPI0_CK_SE FBhSPI0时钟分频设置寄存器 20h
SPI0_CTRL FAh SPI0控制寄存器 02h
SPI0_DATA F9h SPI0数据收发寄存器 xxh
SPI0_STAT F8h SPI0状态寄存器 08h
SPI1_CK_SE B7hSPI1时钟分频设置寄存器 20h
SPI1_CTRL B6h SPI1控制寄存器 02h
SPI1_DATA B5h SPI1数据收发寄存器 xxh
SPI1_STAT B4h SPI1状态寄存器 08h

14.2.1 SPI0相关寄存器

SPI0设置寄存器(SPI0_SETUP):

名称访问描述复位值
7bS0_MODE_SLVRWSPI0主从模式选择位,该位为0则SPI0为主机模式;该位为1则SPI0为从机模式/设备模式0
6bS0_IE_FIFO_OVRW从机模式下FIFO溢出中断使能位,该位为1使能FIFO溢出中断;该位为0则FIFO溢出不产生中断0
5bS0_IE_FIRSTRW从机模式下接收首字节完成中断使能位,该位为1则从机模式下接收到第一个数据字节时触发中断;该位为0则接收到第一字节时不产生中断0
4bS0_IE_BYTERW数据字节传输完成中断使能位,该位为1允许字节传输完成中断;该位为0则字节传输完成不产生中断0
3bS0_BIT_ORDERRW数据字节的位序控制位,该位为0则MSB高位在前;该位为1则LSB低位在前0
2保留R0保留0
1bS0_SLV_SELTR0从机模式下片选激活状态位,该位为0表示当前没有被选中;该位为1表示当前处于选中状态0
0bS0_SLV_PRELOADR0从机模式下预加载数据状态位,该位为1表示当前处于片选有效之后、尚未传输数据之前的预加载状态0

SPI0时钟分频设置寄存器(SPI0_CK_SE):

名称访问描述复位值
[7:0]SPI0_CK_SERW主机模式下设置SPI0时钟分频系数20h

SPI0从机模式预置数据寄存器(SPI0_S_PRE):

名称访问描述复位值
[7:0]SPI0_S_PRERW预先加载从机模式下的首次传输数据20h

SPI0控制寄存器(SPI0_CTRL):

名称访问描述复位值
7 bS0_MISO_OE RW SPI0的MISO输出使能控制位,该位为1允许输出;该位为0禁止输出 0
6 bS0_MOSI_OE RW SPI0的MOSI输出使能控制位,该位为1允许输出;该位为0禁止输出 0
5 bS0_SCK_OE RW SPI0的SCK输出使能控制位,该位为1允许输出;该位为0禁止输出 0
4 bS0_DATA_DIR RWSPI0数据方向控制位,该位为0则输出数据,仅将写FIFO作为有效操作,启动一次SPI传输;该位为1则输入数据,写或读FIFO都作为有效操作,启动一次SPI传输 0
3 bS0_MST_CLK RW SPI0主机时钟模式控制位,该位为0则模式0,SCK空闲时默认低电平;该位为1则模式3,SCK默认高电平 0
2 bS0_2_WIRE RW SPI0的2线半双工模式使能位,该位为0则3线全双工方式,包括SCK、MOSI、MISO;该位为1则2线半双工方式,包括SCK、MISO 0
1 bS0_CLR_ALL RW 该位为1清空SPI0中断标志和FIFO,需要软件清零 1
0 bS0_AUTO_IF RW 允许通过FIFO有效操作自动清零字节接收完成中断标志的使能位,该位为1则在FIFO有效读写操作时自动清零字节接收完成中断标志S0_IF_BYTE 0

SPI0数据收发寄存器(SPI0_DATA):

名称访问描述复位值
[7:0]SPI0_DATARW包括发送和接收两个物理上分开的FIFO,读操作对应接收数据FIFO;写操作对应发送数据FIFO,有效读写操作可以启动一次SPI传输xxh

SPI0状态寄存器(SPI0_STAT):

名称访问描述复位值
7 S0_FST_ACT R0 该位为1表示当前状态是从机模式下接收首字节完成 0
6 S0_IF_OV RW 从机模式下FIFO溢出标志位,该位为1表示FIFO溢出中断;该位为0则无中断。直接位写0清零或寄存器对应位写1清零。当bS0_DATA_DIR=0时由发送FIFO空触发中断;当bS0_DATA_DIR=1时由接收FIFO满触发中断 0
5 S0_IF_FIRST RW从机模式下接收首字节完成中断标志位,该位为1则表示接收到首字节。直接位写0清零或寄存器对应位写1清零 0
4 S0_IF_BYTE RW 数据字节传输完成中断标志位,该位为1则表示一个字节传输完成。直接位写0清零或寄存器对应位写1清零,或者在bS0_AUTO_IF=1时通过FIFO有效操作清零 0
3 S0_FREE R0 SPI0空闲标志位,该位为1表示当前没有SPI移位,通常是处于数据字节之间的空档期 1
2 S0_T_FIFO R0 SPI0发送FIFO计数,有效值是0或者1 0
1 S0_R_FIFO1 R0 SPI0接收FIFO计数位1有效值是0或1或2或3 0
0 S0_R_FIFO0 R0 SPI0接收FIFO计数位0 0

14.2.2 SPI1寄存器描述

SPI1状态寄存器(SPI1_STAT):

名称访问描述复位值
[7:5]保留RO保留000b
4bS1_IF_BYTERO数据字节传输完成中断标志位,该位为1则表示一个字节传输完成。直接位写0清零或寄存器对应位写1清零,或者在bS1_AUTO_IF=1时通过FIFO有效操作清零0
3bS1_FREERWSPI1空闲标志位,该位为1表示当前没有SPI移位,通常是处于数据字节之间的空档期1
[2:0]保留RO保留000b

SPI1数据收发寄存器(SPI1_DATA):

名称访问描述复位值
[7:0]SPI1_DATARW实际是SPI数据移位寄存器,读用于接收数据,写用于发送数据,有效读写操作可以启动一次SPI传输xxh

SPI1控制寄存器(SPI1_CTRL):

名称访问描述复位值
12345
7 bS1_MISO_OE RW SPI1的MISO1输出使能控制位,该位为1允许输出;该位为0禁止输出0
6 保留 RO 保留0
5 bS1_SCK_OE RW SPI1的SCK1输出使能控制位,该位为1允许SCK1输出,如果bS1_2_WIRE=0,那么将同时允许MOSI1输出使能;该位为0禁止输出0
4 bS1_DATA_DIR RWSPI1数据方向控制位,该位为0则输出数据,仅将写SPI1_DATA作为有效操作,启动一次SPI传输;该位为1则输入数据,写或读SPI1_DATA都作为有效操作,启动一次SPI传输0
3 bS1_MST_CLK RW SPI1时钟模式控制位,该位为0则模式0,SCK1空闲时默认低电平;该位为1则模式3,SCK1默认高电平0
2 bS1_2_WIRE RW SPI1的2线半双工模式使能位,该位为0则3线全双工方式,包括SCK1、MOSI1、MISO1;该位为1则2线半双工方式,包括SCK1、MISO10
1 bS1_CLR_ALL RW 该位为1清空SPI1中断标志和FIFO,需要软件清零1
0 bS1_AUTO_IF RW 允许通过SPI1_DATA有效操作自动清零字节接收完成中断标志的使能位,该位为1则在SPI1_DATA有效读写操作时自动清零字节接收完成中断标志bS1_IF_BYTE0

SPI1时钟分频设置寄存器(SPI1_CK_SE):

名称访问描述复位值
[7:0]SPI1_CK_SERW设置SPI1时钟分频系数20h

14.3 SPI传输格式

SPI主机模式支持模式0和模式3两种传输格式,可以通过设置SPI控制寄存器SPIn_CTRL中的位bSn_MST_CLK选择,CH559总是在CLK上升沿采样MISO数据。数据传输格式如下图所示。

模式0: bSn_MST_CLK = 0

spi_mode_0_tim

图14.3.1 SPI模式0时序图

模式3: bSn_MST_CLK = 1

spi_mode_3_tim

图14.3.2 SPI模式3时序图

14.4 SPI配置

14.4.1 SPI主机模式配置

SPI主机模式下,SCK引脚输出串行时钟,片选输出引脚可以指定为任意I/O引脚。

SPI0配置步骤:

  1. 设置SPI时钟分频设置寄存器SPI0_CK_SE,配置SPI时钟频率。
  2. 设置SPI设置寄存器SPI0_SETUP的位bS0_MODE_SLV为0,配置为主机模式。
  3. 设置SPI控制寄存器SPI0_CTRL的位bS0_MST_CLK,根据需求设置为模式0或者3。
  4. 设置SPI控制寄存器SPI0_CTRL的位bS0_SCK_OE和bS0_MOSI_OE为1,bS0_MISO_OE位为0,设置P1端口方向bSCK、bMOSI为输出,bMISO为输入,以及片选引脚为输出。

数据发送过程:

  1. 写SPI0_DATA寄存器,向FIFO写入要发送的数据,自动启动一次SPI传输。
  2. 等待S0_FREE为1,说明发送完成,可以继续发送下一字节。

数据接收过程:

  1. 写SPI0_DATA寄存器,向FIFO写入任意数据例如0FFh以启动一次SPI传输。
  2. 等待S0_FREE为1,说明接收完成,可以读取SPI0_DATA获得接收到的数据。
  3. 如果之前bS0_DATA_DIR已置1,则上述读操作也会启动下一次SPI传输,否则不启动。

14.4.2 SPI从机模式配置

只有SPI0支持从机模式,从机模式下,SCK引脚用于接收连接的SPI主机的串行时钟。

  1. 设置SPI0设置寄存器SPI0_SETUP的位bS0_MODE_SLV为1,配置为从机模式。
  2. 设置SPI0控制寄存器SPI0_CTRL的位bS0_SCK_OE和bS0_MOSI_OE为0,设置bS0_MISO_OE为1,设置P1端口方向bSCK、bMOSI和bMISO以及片选引脚都为输入。当SCS片选有效(低电平)时,MISO将自动使能输出。同时建议设置MISO引脚为高阻输入模式(bP1_OC=0、 P1_DIR[6]=0、P1_PU[6]=0),使MISO在片选无效期间不输出,便于共享SPI总线。
  3. 可选的,设置SPI从机模式预置数据存器SPI0_S_PRE,用于被片选后首次自动加载到缓冲区中用于对外输出。在8个串行时钟之后,即首个数据字节传输交换完毕,CH559得到外部SPI主机发来的首字节数据(可能是命令码),外部SPI主机交换得到SPI0_S_PRE中的预置数据(可能是状态值)。寄存器SPI0_S_PRE的位7将在SPI片选有效后的SCK低电平期间自动加载到MISO引脚上,对于SPI模式0,如果CH559预置了SPI0_S_PRE的位7,那么外部SPI主机将在SPI片选有效但尚未传输数据时,就能够通过查询MISO引脚得到SPI0_S_PRE的位7的预置值,从而通过仅仅有效一下SPI片选就能获得SPI0_S_PRE的位7的值。

数据发送过程:

查询S0_IF_BYTE或者等待中断,在每次SPI数据字节传输完成后,写SPI0_DATA寄存器,向FIFO写入要发送的数据。或者等待S0_FREE从0变为1,可以继续发送下一字节。

数据接收过程:

查询S0_IF_BYTE或者等待中断,在每次SPI数据字节传输完成后,读SPI0_DATA寄存器,从FIFO获得接收到的数据。查询MASK_S0_RFIFO_CNT(即S0_R_FIFO1和S0_R_FIFO0)可以获知FIFO中的剩余字节数。