典型的SPI控制器由如波特率发生器、主控逻辑、收发缓冲、控制部分等几大部分组成。
通常SPI通过4个管脚与外部器件相连:
l MISO:主收从发管脚,仅由从设备控制;单向数据线;
l MOSI:主发从收管理,仅由主设备控制;单向数据线;
l SCK:串口时钟,由主设备控制,仅由主设备控制;用于时钟同步;
l NSS(SEL):从设备选择管脚,对于主机,无用,可配置为GPIO口用于选择从机;仅由主设备控制;用于从机寻址;
从机仅控制MISO管脚,发数据到主机。
MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。
拓扑结构:
主从、一对多、全双工的通信方式;数据输出和数据输入在SCK信号边沿同步。
缺点:信号线的数量较多。
这里的通信协议,同UART,只规定了每一帧数据如何传输,并未对帧结构的组成做介绍。相对而言,IIC不仅指定了位传输协议,还指定了帧的格式。
CPOL和CPHA位组合成四种可能的时序关系。CPOL(时钟极性)位控制在没有数据传输时时钟的空闲状态电平,CPHA位控制数据采样的边沿。所有的采样均同步于SCK。
l CPOL = 0,SCK引脚在空闲状态 = 0;CPOL = 1,SCK引脚在空闲状态 = 1;
l CPHA = 1,接收器接收数据在SCK时钟的第二个边沿(CPOL
= 00时下降沿,CPOL = 1时上升沿)数据采样,第二个时钟边沿被锁存;CPHA = 0,接受器接收数据在SCK时钟的第一边沿(CPOL = 0时下降沿,CPOL = 1时上升沿)采样,数据在第二个时钟边沿被锁存。发送器总是在第二个时钟边沿输出数据。
l CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。
特别注意,当总线上没有SCK时钟信号时,即使从机有数据要发送,从机也会等待SCK信号到来,并在SCK信号的指定边沿将信号输出。
数据帧格式为:MSB/LSB在先,8/16/32位等,收发双发数据帧格式、时钟极性和相位的配置必须相同。对于每帧的具体内容,并不作解释。
在从配置里,SCK引脚用于接收到从主设备来的串行时钟,时钟由主设备提供。
l 定义数据帧格式为8位或16位;帧格式为MSB或LSB为第一位;
l 选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。
l 设备为从模式,使能SPI。
此时,MOSI引脚是数据输入,MISO引脚是数据输出。
只有当从设备收到主设备传到的时钟信号时,才可始发送。在MOSI引脚上出现第一个数据位时,发送过程开始,第一个位被发送出去。余下的位(对于8位数据帧格式,还有7位;对于16位数据帧格式,还有15位)被装进移位寄存器。当发送缓冲器中的数据传输到移位寄存器时, TXE(发送缓冲为空)标志被设置,此时可以产生中断以通知应用程序;
当数据接收完成时:
l 移位寄存器中的数据传送到接收缓冲器,接收移位寄存寄存器中的RXNE(接收缓冲非空)标志被设置;此时,可能产生中断。
在主配置时,串行时钟在SCK脚产生。
l 配置SCK波特率。波特率由主机控制;
l 配置CPOL和CPHA位,和定义8或16位数据帧、LSBFIRST位帧格式。
l 设置为主模式,使能SPI;
l 在这个配置中,MOSI脚是数据输出,而MISO脚是数据输入。
当一字节写进发送缓冲器时,发送过程开始。在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位。数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,同时可能产生中断。
对于接收器来说,当数据传输完成时:
移位寄存器里的数据传送到接收缓冲器,并且RXNE标志被置位;
SPI通常以全双工的方式通信,但也能够以两种配置工作于单工方式:
l 1条时钟线和1条双向数据线
l 1条时钟线和1条数据线(双工模式下只读方式)
设置SPI_CR1寄存器中的BIDIMODE位而启用此模式。在这个模式中,SCK用作时钟,主模式中的MOSI或从模式中的MISO用作数据通信。传输的方向由配置寄存中的特殊位控制:当位是1的时候,数据线是输出,否则是输入。
为了释放一根I/O脚作为它用,可以通过设置禁止SPI输出功能,SPI将运行于只接收模式。 接收脚(主设备的MISO,或者从设备的MOSI)可以当作通用IO口使用。因此读数据寄存器时,读不到接收的值。
应用程序通过3个状态标志可以完全监控SPI总线的状态。
此标志表明SPI通信层的状态。当它被设置时,表明SPI正忙于通信,并且/或者在发送缓冲器里有一个有效的数据字正在等待被发送。此标志的目的是说明在SPI总线上是否有正在进行的通信。以下情况时此标志将被置位:
l 数据被写进主设备的发送数据寄存器上。
l SCK时钟出现在从设备的时钟引脚上。
发送/接收一个字(字节)完成后,BUSY标志立即清除;此标志由硬件设置和清除。监视此标志可以避免写冲突错误。写此标志无效。仅当SPE位被设置时此标志才有意义。
此标志被置位时表明发送缓冲器为空,因此下一个待发送的数据可以写进缓冲器里。当发送缓冲器有一个待发送的数据时,TXE标志被清除。当SPI被禁止时,此标志被清除。
此标志为’1’时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。
主模式故障仅发生在:在片选引脚硬件模式管理下,主设备的NSS脚被拉低;或者在片选引脚软件模式管理下,SSI位被复位时;MODF位被自动置位。主模式故障对SPI设备有以下影响:
l MODF位被置位,如果设置了ERRIE位则产生SPI中断;
l SPE位被复位。这将停止一切输出,并且关闭SPI接口;
l MSTR位被复位,因此强迫此设备进入从模式。
下面的步骤用于清除MODF位:
l 当MODF位被置位时,执行一次对SPI_SR寄存器的读或写操作;
l 然后写SPI_CR1寄存器 。
在有多个MCU的系统中,为了避免出现多个从设备的冲突,必须先拉高该主设备的NSS脚,再对MODF位进行清零。在清零的过程中或者清零完成之后,SPE和MSTR位可以恢复到它们的原始状态。
出于安全的考虑,当MODF位被置位的情况下,硬件不允许设置SPE和MSTR位。
通常配置下,从设备的MODF位不能被置位。然而,在多主配置里,一个设备可以在设置了MODF位的情况下,处于从设备模式;此时,MODF位指示可能出现了多主冲突。中断程序可以执行一个复位或返回到默认状态来从错误状态中恢复。
当主设备已经发送了数据字节,而从设备还没有清除前一个数据字节产生的RXNE时,即为溢出错误。当产生溢出错误时:
用户1847921 2015-8-1 14:22