SPI通讯及STM32SPI原理

简介:

        SPI(Serial Peripheral Interface),串行外围设备接口,一种高速全双工通信总线。由于通讯速度快,被广泛使用在ADC、LCD等设备与MCU间,要求通讯速率较高的场合。

SPI物理层:

        

使用SCK、MOSI、MISO 3条总线及片选线。

1>片选信号线:

        从设备选择线,也称为NSS、CS。

        相对于I2C协议中通过设备地址寻址来选中总线上的某个设备与其通讯,SPI协议则是通过NSS信号线寻址,被选中的从设备的NSS信号线被设为低电平,即片选有效,并且在通讯发过程中以NSS低电平作为开始信号,以NSS高电平作为结束信号,因此,无需关注设备地址。

        由SPI通讯通过片选NSS信号线来选中从设备可知,每个从设备都有独立的一条NSS信号线,且此信号线独占主机的一个引脚,也就是说,有多少个从设备,就有多少条片选信号线。此外,由图可见,无论有多少个从设备,都共用SCK、MOSI、MISO三条总线。

2>SCK(Serial Clock):

        时钟信号线,由通讯主机产生,用于通讯数据同步,并且决定了通讯的速率。不同的设备支持的最高时钟频率不同,如STM32的SPI时钟频率最大为f(pclk)/2,两个设备间通讯时,通讯速率受限于低速设备。

3>MOSI(Master Output,Slave Output):

        主出从如(主设备输出/从设备输出引脚)。

        数据方向为主机到从机。

4>MISO(Master Input,Slave Output):

        主入从出(主设备输入/从输入输出引脚)

        数据方向为从机到主机

        主机和从机都有一个串行移位寄存器,

        主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。

        寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器的内容通过MISO信号线返回给主机。这样两个移位寄存器中的内容就被交换了,且外设的读写操作都是同步完成的。

        如果只进行写操作,主机只需要忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机传输。

协议层  

        

总体而言,由主机控制产生NSS、SCK、MOSI信号,并且主机通过由从机产生的MISO信号读取从机数据。MOSI与MISO的信号只在NSS为低电平的时候才有效,在SCK的每个时钟周期MOSI和MISO传输一位数据。

CPOL/CPHA及通讯模式

        SPI共有四种通讯模式,四种通讯模式的主要区别在于总线空闲SCK的时钟状态(CPOL)以及数据采样时刻(CPHA)。

        CPOL:指SPI通讯设备处于空闲状态时,SCK信号线的电平信号(也就是在SPI通讯开始前、NSS线为高电平时SCK的状态,或者说是未正式启动有效数据传输时的SCK状态)。

                        CPOL=0时,表SCK在空闲状态时为低电平,

                        CPOL=1时,则表SCK在空闲状态时为高电平。

        CPHA(时钟相位):数据的采样时刻。(SPI的采样时刻不是简单的根据高低电平来采样)

                        当CPHA=0时,MOSI或MISO数据线上的信号将会在SCK时钟线的奇数边沿采样。

                        当CPHA=1时,则在偶数边沿采样。

        在采样时刻记录的数是有效数据,而在非采样时刻,MOSI和MISO的有效信号发生切换。

        CPOL/CPHA都有两种表示,两两组合共有4种,就构成了四种通讯模式:

通讯过程:

        当NSS信号由高变低时,从机在自身的NSS线检测到起始信号,表明被主机选中,开始准备与主机通讯。
        当NSS信号为低时,SPI使用的MOSI及MISO数据有效,进行传输数据,同时使用SCK信号线进行数据同步。SCK的每个时钟周期,MOSI及MISO传输一位数,且数据的输入输出同时进行(全双工)

        (数据传输过程中可设置MSB先行或LSB先行(大小端传输方式的选择),SPI每次数据传输可以8位或16位为单位,每次传输的单位数不受限,此外,两个SPI通讯设备之间要使用同样的协定才能保证数据正确的传输。),

        而后根据SPI的通讯模式的选择,在触发时刻发送MOSI和MISO信号线上的电平切换,在采样时刻记录有效数据。

        当NSS信号由低变高,作为SPI通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。

STM32的SPI外设简介:

        STM32的SPI外设可以作为通讯的主机及从机,支持最高的SCK时钟频率为f(pclk)/2,完全支持SPI协议的4种模式,数据帧长度可设置为8位或16位,可设置数据MSB先行或LSB先行。且支持双线全双工、双线单向以及单线模式。

        (双线单向模式:可以同时使用MOSI及MISO数据线向同一方向传输数据,因为是两根线同时同向传输,传输速度加快一倍

            单线模式:可以减少硬件接线,不过速率会受到影响)

时钟控制逻辑:

        由波特率发生器根据“控制寄存器CR1”中的BR[0:2]位控制,该位是对f(pclk)时钟的分频因子,分频结果即为SCK引脚的输出时钟频率。

        提供的各种不同分频因子是可以达到一定范围的降频,如此可以兼容不同最高频率的设备进行SPI通讯。

         此外,通过"控制寄存器CR“的“CPOL位“及“CPHA”位可以进行SPI模式的设置。

数据控制逻辑:

        SPI的MOSI及MISO都连接到数据移位寄存器上。

        当向外发送数据时,数据移位寄存器以“发送缓冲区”为数据源,将数据一位一位通过数据线发送出去;当向外部接收数据时,数据移位寄存器将数据线采集到的数据一位一位通过存储到“接收缓冲区”中。

        通过SPI的“数据寄存器DR”将数据填充到发送缓冲区中,通讯读“数据寄存器DR”,就可以获得接收缓冲区中的内容。

        (此外,数据帧长度可以通过“控制寄存器CR1”的“DFF位”配置为8位及16位模式;配置“LSBFIRST位”可选择MSB先行还是LSB先行)

整体控制逻辑:

        整体控制逻辑负责协调整个SPI外设,通过配置“控制寄存器(CR1/CR2)”的配置可以改变控制逻辑的工作模式。(其中包含SPI模式、波特率、LSB先行、主从模式、单双向模式等等)

        在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR)”,通过读取状态寄存器相关的寄存器位可以了解SPI的工作状态。

        此外,控制逻辑还负责控制产生SPI中断信号、DMA信号及控制NSS信号线。

        在实际应用中,我们一般不使用STM32 SPI外设的标准NSS信号线,而是更简单的使用普通的GPIO,软件控制它的电平输出,从而实现通讯起始及停止信号。

STM32的SPI通讯过程:

        STM32使用SPI外设通讯时,在通讯的不同阶段它会对“状态寄存器SR”的不同数据位写入参数,因此,我们可以通过读取这些寄存器标志来了解通讯状态。

以“主模式”为例:

(1)控制NSS信号线,产生起始信号

(2)将要发送的数据写入到“数据寄存器DR”中,该数据会被存储到发送缓冲区

(3)通讯开始,SCK时钟开始运行。MOSI将发送缓冲区中的数据一位一位地传输出去;MISO则将数据一位一位存储到接收缓冲区中。

(4)当发送完一帧数据时,“状态寄存器SR”中的“TXE标志位”会被置1,表示传输完一帧,发送缓冲区已空;当接收完一帧数据时,“RXNE标志位”被置1,表示传输完一帧,接收缓冲区非空。

(5)待“TXE标志位”为1(即发送完一帧数据时),若还要继续发送数据,则再次往“数据寄存器DR”写入数据即可;待“RXNE标志位”为1时,通过读取“数据寄存器DR”可以获取接收缓冲区中的内容。

(6)若使能了TXE或EXNE中断,TXE或RXNE置1时会产生SPI中断信号,进入同一个中断服务函数,到SPI中断服务程序后,可通过检查寄存器位了解为哪个事件,再分别进行处理。也可以使用DMA方式收发“数据寄存器DR”中的数据。

参考资料:原子和野火的相关资料

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值