芯圣的SPI外设
作为一款单片机,怎么会没有SPI这种标准外设呢,这次就介绍下HC18M003单片机的SPI外设。对于TSSOP封装的这款单片机:
一、SPI的特性以及信号描述
我们可以看到,通过管脚复用的方式提供SPI外设功能,并且可以根据设置,灵活设定使用的管脚。HC18M003单片机的SPI外设具有以下特性:
➢ 全双工,三/四线同步传输
➢ 主从机操作
➢ 4级可编程主时钟频率
➢ 极性相位可编程的串行时钟
➢ 可选择数据传输方向
➢ 写冲突及接收溢出标志
➢ 带MCU中断的主模式故障出错标志
➢ 带MCU中断的传输结束标志
➢ 主模式支持高达8Mbps通信速率(Fosc=32MHz),从模式下通信速率须在Fosc /16及Fosc /16以下
在主设备模式中,SS引脚状态关联 SPI 状态寄存器 SPSTAT 中 MODF 标志位以防止多个主设备驱动 MOSI 和 SCK。
下列情况,SS引脚可以作为普通端口或其它功能使用:
(1)设备作为主设备,SPI 控制寄存器 SPCTL 寄存器的 SSIG 位置 1。这种配置仅仅存在于通讯网络中只有一个主设备的情况,因此,SPI 状态寄存器 SPSTA 中 MODF 标志位不会被置 1。
(2)设备配置为从设备,SPI 控制寄存器 SPCTL 的 CPHA 位和 SSIG 位置 1。这种配置情况存在于只有一个主设备一个从设备的通讯网络中,因此,设备总是被选中的,主设备也不需要控制从设备的SS引脚选择其作为通讯目标。
从设备的SS引脚被使能时,其它主设备可通过使该引脚维持低电平,从而选中该从设备。为防止MISO 总线冲突,原则上不允许两个及以上的从设备被选中。
主设备的SS引脚被使能时,若SS被拉低将置模式错误标志 MODF(可中断),且 MSTR 位也将被清 0,从而使该设备强制切换成从设备。
当 MSTR = 0(从模式)及 CPHA = 0 时,SSIG 必须为 0,因为此时数据传送需要SS引脚配合,才能完成多数据传送。
在主模式下,SPI 的速率有 4 级选择,分别是系统时钟的 4、16、64 或 128 分频,可通过 SPCTL寄存器的 SPR[1:0]位进行选择。
SPI 功能框图
二、SPI的工作模式
SPI 可配置为主模式或从模式中的一种。SPI 模块的配置和初始化通过设置相关寄存器来完成。进一步设置相关寄存器即可完成数据传送。
在 SPI 通讯期间,数据同步地被串行的移进移出,串行时钟线(SCK)使两条串行数据线(MOSI&MISO)上数据的移动和采样保持同步。从设备选择线(SS)可以独立地选择从属设备;如果从设备没有被选中,则不能参与 SPI 总线上的活动。
当 SPI 主设备通过 MOSI 线传送数据到从设备时,从设备通过 MISO 线发送数据到主设备作为相应,从而实现在同一时钟下数据发送与接收的同步全双工传输。发送移位寄存器和接收寄存器使用相同的 SFR 地址,对 SPI 数据寄存器 SPDAT 进行写操作将写入发送移位寄存器,对 SPDAT 寄存器进行读操作将获得接收移位寄存器的数据。写入的数据不会影响到需要读出的数据。
全双工工作模式
1、主模式
(1) 模式启动
SPI 主设备控制控制 SPI 总线上的所有数据传送的启动。一个 SPI 总线中只允许一个主设备可以启动传送。
(2) 发送
在 SPI 主模式下,写一个字节数据到 SPI 数据寄存器 SPDAT,数据将会写入发送移位缓冲器。如果发送移位寄存器中已经存在一个数据或正在传送一个数据,那么主 SPI 将产生一个 WCOL 信号以表明写入太快。但是发送移位寄存器中的数据不会受到影响,发送也不会中断。
(3) 接收
当主设备通过 MOSI 线传送数据到从设备时,同时对应的从设备也可以通过 MISO 线将其发送移位寄存器的数据传送给主设备的接收移位寄存器,实现全双工操作。故 SPIF 标志置 1 即表示数据发送完成也表示数据接收完成。本 SPI 模块接收为双缓冲器,即数据可以在 SPIF 置 1 后读出,但必须在下一字节数据接收完成前读出,否则将置接收溢出标志 RXOV,如果发生接收溢出,则后面的数据将不会被移入接收寄存器,接收溢出时,SPIF 可正常置 1。
2、从模式
(1) 模式启动
将 MSTR 置 0(若SS被使能则必须拉低)时,设备处于从模式下运行,数据传送过程中设备模式不能改变(SS引脚必须维持低电平),否则数据传送将失败(SPIF 不会被置 1)。
(2) 发送
SPI 从设备下不能启动数据传送,所以 SPI 从设备必须在主设备开始一次新的数据传送之前将要传送给主设备的数据写入发送移位寄存器。若发送前未写入数据到发送移位寄存器,从设备将传送数据“0x00”给主设备。若写入数据时发送移位寄存器已经存在数据(或发生在传送过程中),那么 SPI从设备的 WCOL 标志位将置 1,表示发生写 SPDAT 冲突。但是移位寄存器的数据不受影响,传送也不会被中断,传送完成 SPIF 将被置 1。
(3) 接收
从模式下,按照主设备控制的 SCK 信号,数据通过 MOSI 引进移入,当计数器计数 SCK 边缘数到 8 时,表示一个字节数据接收完毕,SPIF 将置 1,数据可以通过此时读取 SPDAT 寄存器获得,但必须在下一数据接收完成前被读出,否则将置接收溢出标志 RXOV,如果发生接收溢出,则后面的数据将不会被移入接收寄存器,接收溢出时,SPIF 可正常置 1。
三、传送形式
通过软件设置寄存器的 CPOL 位和 CPHA 位,用户可以选择 SPI 时钟极性和相位的四种组合方式。CPOL 位定义时钟的极性,即空闲时的电平状态。CPHA 位定义时钟相位,即定义允许数据移位采样的时钟边沿。在通信的两个主从设备中,时钟极性相位设置应当保持一致。
如果 CPHA = 0,数据在 SCK 的第一沿就被捕获,所以从设备必须在 SCK 的第一个沿之前就准备好数据,因此,SS引脚的下降沿从设备就开始数据。SS引脚在每次传送完一个字节后必须拉高,在发送下一字节之前重新又被拉低,故 CPHA = 0 时,SSIG 位无效,即SS脚被强制使能。
如果 CPHA = 1,主设备在 SCK 的第一个沿将数据输出到 MOSI 线上,从设备把 SCK 的第一个沿作为开始发送信号。用户必须在第一个 SCK 的前 2 个沿内完成对 SPDAT 完成写操作。传送过程中彼此模式不能改变,否则数据发送接收将失败,模式被改变的寄存器数据(发送数据)及状态(接收为空)不变。这种数据传送形式为单一主从设备间通信的首先形式。
四、出错检测
SPSTA 寄存器中的一些标志位表示 SPI 通信中的通信错误情况:
(1) 模式故障(MODF)
SPI 主模式下的模式故障出错表明SS引脚上的电平状态与实际设备模式不一致,MODF 标志位将被置 1(可产生中断),以来表明 SPI 控制系统中存在多主设备的冲突情况,此时硬件将自动清除 SPEN位,即先关闭 SPI 模块;同时硬件也将自动清除 MSTR 位。需要重启 SPI 模块时,MODF 必须先软件写 1 清 0,再置 SPEN 位。
(2) 写冲突(WCOL)
在数据未发送或发送期间继续对 SPDAT 做写入操作会引起写冲突,WCOL 位会被置 1,但发送不会终止。需软件写 1 清 0
(3) 接收溢出(RXOV)
在接收第二数据完成前仍未清除之前接收数据产生的 SPIF 标志,将置接收溢出标志 RXOV,SPIF被置 1 时,后面的数据将不会被传入接收寄存器,故接收的数据存入 SPDAT 前必须清除 SPIF,RXOV位需软件写 1 清 0。
五、中断
两种 SPI 状态标志 SPIF&MODF 都能产生一个 CPU 中断请求。
串行数据传输完成标志 SPIF:完成一个字节数据发送/接收后由硬件置 1。
故障模式标志 MODF:该位被置 1 是指设备模式(主机)与SS引脚电平不一致,SSIG 位为 1(SS未被使能)时,无 MODF 中断请求。
六、SPI 配置对照
七、和SPI有关的寄存器
1、控制寄存器 SPCTL
2、状态寄存器 SPSTAT
3、数据寄存器