原创 SPI协议工作原理

2011-8-1 19:35 8941 8 9 分类: MCU/ 嵌入式
转载请注明出处:http://blog.ednchina.com/lstzixing  By:lstzixing

1.1   SPI模块功能框图


典型的SPI控制器由如波特率发生器、主控逻辑、收发缓冲、控制部分等几大部分组成。


6f4ee037-a96a-4607-8d99-e6a873bf0fc5.JPG


通常SPI通过4个管脚与外部器件相连:


l        MISO:主收从发管脚,仅由从设备控制;单向数据线;


l        MOSI:主发从收管理,仅由主设备控制;单向数据线;


l        SCK:串口时钟,由主设备控制,仅由主设备控制;用于时钟同步


l        NSS(SEL):从设备选择管脚,对于主机,无用,可配置为GPIO口用于选择从机;仅由主设备控制;用于从机寻址;


从机仅控制MISO管脚,发数据到主机。


1.2        典型应用


1451b127-deab-467b-82da-410c6df759c1.JPG


MOSI脚相互连接,MISO脚相互连接。这样,数据在主和从之间串行地传输(MSB位在前)。


拓扑结构:


主从、一对多、全双工的通信方式数据输出和数据输入在SCK信号边沿同步


缺点:信号线的数量较多。


1.3        通信协议


  这里的通信协议,同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时钟相位的组合选择数据捕捉的时钟边沿。


a6d5df20-97e7-4911-adff-453daf433dfb.JPG


    特别注意,当总线上没有SCK时钟信号时,即使从机有数据要发送,从机也会等待SCK信号到来,并在SCK信号的指定边沿将信号输出。


   数据帧格式为:MSB/LSB在先,8/16/32位等,收发双发数据帧格式、时钟极性和相位的配置必须相同。对于每帧的具体内容,并不作解释。


1.4        SPI配置

1.4.1   SPI从模式


在从配置里,SCK引脚用于接收到从主设备来的串行时钟,时钟由主设备提供。


1.   配置步骤

l        定义数据帧格式为8位或16位;帧格式为MSB或LSB为第一位;

l        选择CPOL和CPHA位来定义数据传输和串行时钟之间的相位关系,从设备和主设备的CPOL和CPHA位必须配置成相同的方式。

l        设备为从模式,使能SPI。


此时,MOSI引脚是数据输入,MISO引脚是数据输出。


2.   数据发送过程


    只有当从设备收到主设备传到的时钟信号时,才可始发送。在MOSI引脚上出现第一个数据位时,发送过程开始,第一个位被发送出去。余下的位(对于8位数据帧格式,还有7位;对于16位数据帧格式,还有15位)被装进移位寄存器。当发送缓冲器中的数据传输到移位寄存器时, TXE(发送缓冲为空)标志被设置,此时可以产生中断以通知应用程序;


3.   数据接收过程


当数据接收完成时:


l        移位寄存器中的数据传送到接收缓冲器,接收移位寄存寄存器中的RXNE(接收缓冲非空)标志被设置;此时,可能产生中断。


1.4.2   SPI主模式

在主配置时,串行时钟在SCK脚产生。


1.   配置步骤

l        配置SCK波特率。波特率由主机控制;

l        配置CPOL和CPHA位,和定义8或16位数据帧、LSBFIRST位帧格式。

l        设置为主模式,使能SPI;

l        在这个配置中,MOSI脚是数据输出,而MISO脚是数据输入。

2.   数据发送过程

    当一字节写进发送缓冲器时,发送过程开始。在发送第一个数据位时,数据字被并行地(通过内部总线)传入移位寄存器,而后串行地移出到MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位。数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,同时可能产生中断。

3.   数据接收过程


对于接收器来说,当数据传输完成时:
移位寄存器里的数据传送到接收缓冲器,并且RXNE标志被置位;


1.4.3   特殊配置-单工通信


SPI通常以全双工的方式通信,但也能够以两种配置工作于单工方式:


l        1条时钟线和1条双向数据线


l        1条时钟线和1条数据线(双工模式下只读方式)


1.   1条时钟线和1条双向数据线


设置SPI_CR1寄存器中的BIDIMODE位而启用此模式。在这个模式中,SCK用作时钟,主模式中的MOSI或从模式中的MISO用作数据通信。传输的方向由配置寄存中的特殊位控制:当位是1的时候,数据线是输出,否则是输入。


2.   1条时钟和1条数据线(双工模式下只读方式)


为了释放一根I/O脚作为它用,可以通过设置禁止SPI输出功能,SPI将运行于只接收模式。 接收脚(主设备的MISO,或者从设备的MOSI)可以当作通用IO口使用。因此读数据寄存器时,读不到接收的值。


1.4.4   常见SPI控制器的状态标志


应用程序通过3个状态标志可以完全监控SPI总线的状态。


1.   忙(Busy)标志


此标志表明SPI通信层的状态。当它被设置时,表明SPI正忙于通信,并且/或者在发送缓冲器里有一个有效的数据字正在等待被发送。此标志的目的是说明在SPI总线上是否有正在进行的通信。以下情况时此标志将被置位:

l        数据被写进主设备的发送数据寄存器上。

l        SCK时钟出现在从设备的时钟引脚上。

发送/接收一个字(字节)完成后,BUSY标志立即清除;此标志由硬件设置和清除。监视此标志可以避免写冲突错误。写此标志无效。仅当SPE位被设置时此标志才有意义。


2.   发送缓冲器空闲标志(TXE)

此标志被置位时表明发送缓冲器为空,因此下一个待发送的数据可以写进缓冲器里。当发送缓冲器有一个待发送的数据时,TXE标志被清除。当SPI被禁止时,此标志被清除。

3.   接收缓冲器非空(RXNE)

此标志为’1’时表明在接收缓冲器中包含有效的接收数据。读SPI数据寄存器可以清除此标志。


1.4.5   错误标志

1.   主模式错误(MODF)

主模式故障仅发生在:在片选引脚硬件模式管理下,主设备的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位指示可能出现了多主冲突。中断程序可以执行一个复位或返回到默认状态来从错误状态中恢复。

2.   溢出错误

当主设备已经发送了数据字节,而从设备还没有清除前一个数据字节产生的RXNE时,即为溢出错误。当产生溢出错误时:

文章评论1条评论)

登录后参与讨论

用户1847921 2015-8-1 14:22

您好,请问你有SPI和IIC的代码吗?
相关推荐阅读
用户403611 2014-01-20 07:28
与TKScope仿真器同行(1) - 看门狗会让你无法调试
  前几日,中矿龙科的李工向我反映了一个有意思的问题: 在使用TKScope仿真器(型号AK100pro)调试STM32时,出现了一个非常奇怪的现像。在Keil环境中的源代码设置了一...
用户403611 2013-02-27 13:41
ARM指令仿真项目经历纪录一
这两天接了个新项目-ARM指令仿真项目,开发时间预期在两个月左右。这次将继承沿续自己以前做Cortex-A8、A9内核仿真项目时的方法,用日志纪录在开发过程中的各种问题解决方案和体会。限于某些原因...
用户403611 2013-02-27 13:39
电子工程师应尝试产品经理的角色
做技术两三年了,发现自己一直陷入到技术细节当中,而从来没有尝试跳出来去从整个产品的角度进行观察。这其中可能是因为需要了解的技术细节太多,没有闲暇去关注技术之外的东西。另一方面也与个人的视野不够开阔...
用户403611 2011-11-13 20:05
EDNChina的博客已经改得面目全面了
 之前有些日子没去ENDChina了。从08年起,断断续续地在这上面写一些技术类的Blog,到现在已经有快4年,虽然文章写的不多,但挺有感情的。   这两天回去看看,访问http://blog...
用户403611 2011-10-14 22:02
TKScope仿真器使用入门视频教程
  相对来说,看视频肯定要比看PDF文档要容易的多吧。部门之前仅在网上发布了TKScope仿真器使用的PDF文档。虽然文档写的很详细,但实际真正愿意去看的不多。前些日子自己录制了TKScope仿真AR...
用户403611 2011-09-18 23:00
尝试建立一个部门内部的知识库站点
前些天有事直接去找了下戚工反映TKScope仿真器方面的几个问题。问题解决之后闲聊了几句,其中就提及了建立一个共享的内部网络站点。当时我听了很兴奋,因为这个想法与我的不谋而合。早在刚进入这个部门不久,...
我要评论
1
8
关闭 站长推荐上一条 /3 下一条