嵌入式底层驱动学习笔记(一) SPI

1.SPI模块简介

1.1 SPI功能特点

SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线。串行设备接口SPI主要用于同步串行通信,它使MCU具备了与外围设备以及其他微处理器进行同步通信的能力,也能够在多主系统中实现处理器间的通信。可连接的设备包括简单的移位寄存器、、LCD显示驱动器或AID转换器的接口。MCU可选择8种不同的位传送频率、两种不同的时钟极性、相位和位传送顺序,因此可直接与各个厂家生产的多种标准的串行外围接口器件连接。在串行外围接口中,数据和时钟线是分开的,在SPI格式中,时钟不包括在数据流中,它必须是另一个独立的信号线。。MC9S12的SPI可定义为主机或从机方式,主要特性如下:
(1)全双工、三线同步传送。
(2)单个数据引脚的双向传送方式。
(3)主机或从机工作方式。
(4)每一晶体频率下可通过程序选择八种不同的主机位传送频率。
(5)主机位传送频率最大4MHz,当MCU总线频率=8MHz时最小为31.25kHz。
(6)从机位传送频率最大4MHz,允许频率范围为0-4MHz。
(7)可程控设置位时钟极性、相位和数据位传送顺序,即可选高位在前或低位在前。
(8)发送完成中断标志。
(9)多主机系统控制冲突保护中断标志。
(10)写冲突标志保护。
(11)可方便地与各种简单扩展器件接口,如PLL、D/A、锁存器、LCD显示驱动器等。

1.2 SPI通信协议及时序

SPI通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
(1)SDO/MOSI – 主设备数据输出,从设备数据输入;
(2)SDI/MISO – 主设备数据输入,从设备数据输出;
(3)SCLK – 时钟信号,由主设备产生;
(4)CS/SS – 从设备使能信号,由主设备控制。当有多个从设备的时候,因为每个从设备上都有一个片选引脚接入到主设备机中,当我们的主设备和某个从设备通信时将需要将从设备对应的片选引脚电平拉低或者是拉高。
在这里插入图片描述
SPI通信有四种不同的模式,不同的设备可能在出厂时就是配置为某种模式,这是不能改变的,但我们的通信双方,即主机与从机必须工作在同一模式下,所以可以对主设备的SPI模式进行配置,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式。
1.时钟极性CPOL是用来配置SCLK的电平初始于哪种状态(是低电平还是高电平)。
2.时钟相位CPHA是用来配置数据采样在第几个边沿。

CPOLCPHA工作模式
00此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿
01此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿
10此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿
11此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿

在这里插入图片描述

2.SPI寄存器简介

2.1 SPI控制寄存器1(SPICR1)

SPI的工作方式主要由该寄存器设置,包括主从方式、单线双向模式选择,时钟及位顺序等,甚至包括引脚工作特性的设置,见表1。其各位意义如下:
表1 SPI控制寄存器1
SPIE:SPI中断允许位
0: 禁止SPI中断。
1: 每次SPRF或MODF状态标志置位时发出硬件中断请求。
SPE:SPI系统允许位。
当MODF=1时,SPE读取结果总是0,SPOCR1的写操作指令必须作为模式故障恢复序列的一部分嵌入其中。
0:SPI内部硬件完成初始化,但SPI系统处于低功耗的禁止状态。
1:SPI使能。
SPTIE
0:SPTEF中断不被允许。
1:SPTEF中断允许。
MSTR:主、从模式选择位,用于设定本机SPI以主器件还是从器件身份出现。
0:从模式。
1:主模式。
CPOL、CPHA: SPI时钟极性、相位选择位,这两位用来指定SPI的时钟格式。当无传输动作且CPOL=0时,主器件的SCK引脚处于低电平,而如果CPOL=1,SCK则闲置在高电平。
SSOE: 从器件选中输出信号(SS)允许位,SS输出功能只有在主模式下通过置位SSOE和DDRS7实现。
0: 禁止SS输出。
1: 允许SS输出,但同时DDRS7必须为1。
LSBF: SPI数据位传输顺序选择位,通常要求LSBF=0,即传输过程高位在先。该位只决定传输过程中各位的先后顺序,不影响数据位在寄存器中的顺序,因此读写操作正常进行,即高位(MSB)在第7位(BIT7)。对于仅由MC9S12构成的互连系统,只要各个SPI的LSBF相同,对传输结果无影响,但在与外围设备或器件连接时,SPI必须根据该设备或器件所要求的位顺序正确设置LSBF。
0: 数据传输高位(MSB)在先。
1: 数据传输低位(LSB)在先。

2.2 SPI控制寄存器2(SPICR2)

在这里插入图片描述MODFEN:模式错误使能位
0:禁止模式错误标志位置位。
1:允许模式错误标志位置位。
BIDIROE:双向模式下输出缓冲使能位
0:双向模式下禁止输出缓冲。
1:双向模式下允许输出缓冲。
SPISWAI:等待模式下SPI工作方式
0:等待模式下停止SPI时钟。
1:等待模式下SPI时钟正常工作。
SPC0:串行引脚控制,该位与MSTR位一起决定串行引脚功能设置

2.3 SPI波特率选择寄存器3(SPIBDR)

在这里插入图片描述
该寄存器只有六个有效位SPPR2~SPPR0和SPR2~SPR0,用来确定SPI系统工作时钟SCK的频率,即波特率。复位默认值为0。
SPPR2-SPPR0:波特率预选位;
SPR2-SPR0:波特率选择位。
波特率分频因子表达式为:
在这里插入图片描述

2.4 SPI状态寄存器(SPISR)

该寄存器反映SPI的工作状态,其中包括传输结束、写冲突和模式故障三个标志位,程序可以检查各位的状态,也可以通过特定的寄存器访问序列将标志位清0,见下表。其各位意义如下:
在这里插入图片描述
SPIF:SPI中断请求位,在数据传输过程中,SPRF在第8个SCK周期后置位,通过读SPISR寄存器并随后读或写数据寄存器SPIDR清0。
0:传输正在进行或者根本没有传输。
1:一次传输已经结束。
SPTEF: 当SPIDR中的值送入移位寄存器中是,该位置1。同时如果SPTIE位为1,则向CPU发出中断请求。读SPISR然后写SPIDR将清除该位。
0:SPI数据寄存器非空。
1:SPI数据寄存器空。
MODF:SPI模式错误中断状态位。当MSTR=1时,如果从选择引脚SS在外部被拉低成逻辑0,该位由SPI硬件自动置1。这时本机SPI已经不能成功设定为主机,显然这种情况在正常情况下是不允许的。当DDRS7=1时,PS7是通用输出或SS输出引脚,而不是专用于SPI系统的SS输入引脚,在这种特殊情况下,模式故障功能被禁止,MODF保持为0。读SPOSR随后写入SPOCR1将清0该位。
0:无异常。
1:系统中已经出现另一个主机,并正在选中从器件。

2.5 SPI数据寄存器(SPIDR)

在这里插入图片描述
该8位寄存器是SPI数据寄存器,具有输入、输出双重功能,见上表。对该寄存器进行读操作时所访问的输入部分是双缓冲的,但写操作则直接将数据送到串行移位器。注意:某些简单的从器件可能只有发送功能,只向主器件发送数据而不向主器件请求数据,例如并行输入串行输出的TTL逻辑电路:或者只有接收功能,只从主器件接收而不返回数据,例如串行输入并行输出的TTL逻辑电路。由于SPI的传输是一次交换过程,对于只发送数据的从器件,交换前主机可向SPODR写入任何数据;对于只接收数据的从器件,交换后主机 SPODR中的数据无意义。

3.SPI应用实例

3.1 硬件驱动初始化

3.2 硬件驱动函数

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值