一、SPI简介
串行外设接口
(SPI)
允许芯片与外部设备以
半/全双工、同步、串行方式通信
。此接口可以被配置成
主模式,并
为外部从设备提供通信时钟(SCK)。接口还能以
多主配置方式工作。它可用于多种用途,包括使用一条双向数据线的双线单工同步传输,还可使用CRC校验的可靠 通信。
SPI特征:
●
3线全双工同步
传输
● 带或不带第三根双向数据线的双线单工同步传输
●
8或16位传输帧
格式选择
●
主或从
操作
● 支持
多主
模式
●
8
个主模式波特率预分频系数
(
最大为
f
PCLK
/2)
● 从模式频率
(
最大为
f
PCLK
/2)
● 主模式和从模式的快速通信
● 主模式和从模式下均可以由
软件或硬件
进行
NSS管理
:主
/
从操作模式的动态改变
● 可编程的
时钟极性和相位
● 可编程的
数据顺序
,
MSB在前或LSB在前
● 可触发
中断
的专用
发送和接收
标志
●
SPI
总线忙
状态标志
● 支持可靠通信的硬件
CRC
─
在发送模式下,
CRC值可以被作为最后一个字节发送
─
在全双工模式中对接收到的最后一个字节自动进行
CRC
校验
● 可触发中断的主模式故障、过载以及
CRC
错误标志
● 支持
DMA
功能的
1字节发送和接收缓冲器
:产生发送和接受请求
SPI框图
通常
SPI
通过
4
个引脚与外部器件相连:
●
MISO
:主设备输入
/
从设备输出引脚。该引脚在
从模式
下
发
送数据,在
主模式
下
接
收数据。
●
MOSI
:主设备输出
/
从设备输入引脚。该引脚在
主模式
下
发
送数据,在
从模式
下
接
收数据。
●
SCK
:串口时钟,作为
主设备的输出
,
从设备的输入
●
NSS
:从设备选择。作为“片选引脚”,
让主设备可以单独地与特定从设备通讯,避免数据线上的冲突,
从设备的NSS引脚可以
由主设备的一个标准
I/O引脚来驱动
例如:单主和单从应用
这里
NSS
引脚设置为
输入。
MOSI脚相互连接,MISO脚相互连接
。这样,数据在主和从之间串行地传输
(MSB
位在前
)
。
通信总是由主设备发起
。
主设备通过MOSI脚把数据发送给从设备,从设备通过MISO引脚回传 数据
。这意味
全双工通信
的数据输出和数据输入是用同一个
时钟信号同步
的;
时钟信号由主设备通过SCK脚提供
。
时钟信号的相位和极性
SPI_CR寄存器的
CPOL
(
时钟
极性
)和
CPHA
(
时钟
相位
)位,
CPOL(时钟极性)位
控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。
如下图所示 : 组合成
四种
可能的
时序
关系:
注意:
1. 在 改变CPOL/CPHA位之前 ,必须清除SPE位将SPI禁止。
2. 主和从必须配置成相同的时序模式。
3. SCK的空闲状态必须和SPI_CR1寄存器指定的极性一致(CPOL为’1’时,空闲时应上拉SCK为
高电平;CPOL为’0’时,空闲时应下拉SCK为低电平)。
二、配置SPI为从模式
在
从模式
下,
SCK
引脚用于
接收从主设备
来的串行
时钟
。
SPI_CR1
寄存器中
BR[2:0]的设置不影响数据传输速率。
注:建议在
主设备发送时钟之前使能SPI从设备,否则可能会发生意外的数据传输。
1、配置步骤:
1)、定义数据帧格式
8或者16位
2)、选择
CPOL和CPHA位定义数据传输和串行时钟之间的相位关系,从和主设备需保持一致
3)、帧格式(
LSB还是MSB在前),需和主设备相同
4)、NSS引脚配置:一般使用
软件模式,在完整的数据帧传输过程中,NSS必须为低电平。
5).、
清除
MSTR
位、设置
SPE
位
(SPI_CR1
寄存器
)
,使相应引脚工作于
SPI
模式下。
在这个配置中,
MOSI引脚是数据输入,MISO引脚是数据输出
。
2、数据发送过程
在写操作中,数据字被并行地写入发送缓冲器。当从设备收到时钟信号,并且在MOSI引脚上出现第一个数据位时,发送过程开始(译注:此时 第一个位被发送出去)。余下的位(对于8位数据帧格式,还有7位;对于16位数据帧格式,还有 15位)被装进移位寄存器。当发送缓冲器中的数据全传输到移位寄存器时,SPI_SR寄存器的TXE (发送缓冲区位空)标志被设置,如果设置了SPI_CR2寄存器的TXEIE位(发送缓冲区空中断使能),将会产生中断。
3、数据接收过程
对于接收器,当数据接收完成时,移位寄存器中的数据传送到接收缓冲器,SPI_SR 寄存器中的RXNE(接收缓冲区非空)标志被设置。如果设置了SPI_CR2寄存器中的RXNEIE(接收缓冲区非空中断使能)位,则产生中断。 在最后一个采样时钟边沿后,RXNE位被置’1’,移位寄存器中接收到的数据字节被传送到接收缓冲器。当读SPI_DR寄存器时,SPI设备返回这个接收缓冲器的数值。 读SPI_DR寄存器时,RXNE位被清除。
三、配置SPI为主模式
在主配置时,在SCK脚产生串行时钟。
1、配置步骤:
1)、定义串行时钟
波特率
2)、定义数据帧格式
8或者16位
3)、选择
CPOL和CPHA位定义数据传输和串行时钟之间的相位关系,从和主设备需保持一致
4)、帧格式(
LSB还是MSB在前),需和主设备相同
5)、NSS引脚配置:一般使用
软件模式
6).、设置
MSTR
位、设置
SPE
位
(SPI_CR1
寄存器
)
,使相应引脚工作于
SPI
模式下。
在这个配置中,
MOSI引脚是数据输出,MISO引脚是数据输入
。
2、数据发送过程
当写入数据至发送缓冲器时,发送过程开始。 在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到 MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位的设置。数据从发送缓冲器传输到移位寄存器时TXE(发送缓冲区为空)标志将被置位,如果设置了SPI_CR1寄存器中的TXEIE(发送缓冲区空中断使能)位,将产生中断。
3、数据接收过程
对于接收器来说,当数据传输完成时。传送移位寄存器里的数据到接收缓冲器,并且RXNE标志被置位。 如果设置了SPI_CR2寄存器中的RXNEIE位,则产生中断。 在最后采样时钟沿,RXNE位被设置,在移位寄存器中接收到的数据字被传送到接收缓冲器。读 SPI_DR寄存器时,SPI设备返回接收缓冲器中的数据。 读SPI_DR寄存器将清除RXNE位。一旦传输开始,如果下一个将发送的数据被放进了发送缓冲器,就可以维持一个连续的传输流。在试图写发送缓冲器之前,需确认TXE标志应该为’1’。
四、主或从模式下并且全双工发送和接收过程模式
1、状态标志:应用程序通过3个状态标志可以完全监控SPI总线的状态
发送缓冲区空闲标志(TXE) :
此标志为’1’时表明发送缓冲器为空,可以写下一个待发送的数据进入缓冲器中。当写入SPI_DR 时,TXE标志被清除。
接收缓冲器非空(RXNE) :
此标志为“1”时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。
忙
(Busy)
标志(BSY):
BSY标志由硬件设置与清除
(
写入此位无效果
)
,此标志表明
SPI
通信层的状态。
当它被设置为
’1’
时,表明
SPI正忙于通信
,但有一个例外:在主模式的双向接收模式下
(MSTR=1
、
BDM=1
并且
BDOE=0)
,在接收期间
BSY
标志保持为低。
在软件要关闭
SPI
模块并进入停机模式
(
或关闭设备时钟
)
之前,可以
使用BSY标志检测传输是否
结束
,这样可以避免破坏最后一次传输,因此需要严格按照下述过程执行。
BSY
标志还可以用于在多主系统中避免写冲突。
除了主模式的双向接收模式
(MSTR=1
、
BDM=1
并且
BDOE=0)
,当传输开始时,
BSY
标志被
置
’1’
。
以下情况时此标志将被清除为
’0’
:
● 当传输结束
(
主模式下,如果是连续通信的情况例外
)
;
● 当关闭
SPI
模块;
● 当产生主模式失效
(MODF=1)
。
如果通信不是连续的,则在每个数据项的传输之间,
BSY
标志为低。
当通信是连续时:
●
主模式下:在整个传输过程中,BSY标志保持为高;
●
从模式下:在每个数据项的传输之间,BSY标志在一个SPI时钟周期中为低。
2、软件必须遵循下述过程,发送和接收数据:
1.
设置
SPE
位为
’1’
,
使能SPI
模块;
2.
在
SPI_DR
寄存器中
写入第一个
要发送的数据,这个操作会
清除TXE标志
;
3.
等待TXE=1
,然后
写入第二个
要发送的数据。
等待RXNE=1
,然后
读出
SPI_DR
寄存器并获得第一个接收到的数据,读SPI_DR
的
同时清除了RXNE
位。
重复
这些操作,
发送
后续的数据
同时接n-1个数据
;
4.
等待RXNE=1
,然后接收
最后一个
数据;
5.
等待TXE=1
,
在BSY=0
之后
关闭SPI
模块。
主模式
、全双工模式下连续传输时,TXE/RXNE/BSY的变化示意图如下:
从模式
、全双工模式下
连续传输时,
TXE/RXNE/BSY 的变化示意图如下:
3、SPI中断请求:
五、利用DMA的SPI通信
为了达到最大通信速度,需要及时往SPI发送缓冲器填数据,同样接收缓冲器中的数据也必须及 时读走以防止溢出。为了方便高速率的数据传输,SPI
实现了一种采用简单的请求
/
应答的
DMA
机制。
SPI_CR2寄存器使能DMA
● 发送时,在每次
TXE
被设置为
’1’
时发出
DMA
请求,
DMA
控制器则写数据至
SPI_DR
寄存
器,
TXE
标志因此而被清除。
● 接收时,在每次
RXNE
被设置为
’1’
时发出
DMA
请求,
DMA
控制器则从
SPI_DR
寄存器读出数
据,
RXNE
标志因此而被清除。
1、使用DMA发送:
2、使用DMA接收: