SPI相关

SPI模块功能框图

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


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

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

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

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

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

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


SPI通信协议

      这里的通信协议,同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位等,收发双发数据帧格式、时钟极性和相位的配置必须相同。对于每帧的具体内容,并不作解释。

SPI配置

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.   数据接收过程

当数据接收完成时:

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

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标志被置位;


特殊配置-单工通信


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时,即为溢出错误。当产生溢出错误时:



### STM32 CubeMX SPI Configuration Functions Usage In the context of configuring SPI using STM32CubeMX, several key functions and configurations are essential to ensure proper setup and operation. The process involves initializing the SPI peripheral along with its associated parameters such as mode (master/slave), data size, clock polarity, phase, etc. The `HAL_SPI_Init` function initializes the SPI according to the specified parameters in the `SPI_HandleTypeDef` structure[^1]. This initialization includes setting up GPIO pins connected to the SPI interface, enabling clocks for these peripherals, and configuring NVIC settings if interrupt-driven communication is desired. For more detailed control over specific aspects like baud rate or frame format, one can use additional API calls provided by HAL libraries: - To set the Baud Rate Prescaler which determines SCK frequency relative to APBx bus speed: ```c __HAL_SPI_SET_BAUDRATEPRESCALER(&hspi1, SPI_BAUDRATEPRESCALER_8); ``` - For adjusting Frame Format including MSB/LSB transmission order: ```c __HAL_SPI_SET_TRANSFER_LSBFIRST(&hspi1, ENABLE); // Send LSB first ``` Moreover, when dealing with DMA transfers alongside SPI operations, it's important that both SPI and DMA handles are correctly initialized within CubeMX before generating code. Ensuring DMATransfer properties align between ADC examples mentioned earlier and SPI contexts ensures seamless integration without conflicts during runtime execution. To facilitate easier management of multiple transactions on a single SPI line while avoiding potential collisions due to concurrent access from different sources, consider implementing software-based arbitration mechanisms outside what’s directly offered through standard library APIs. --related questions-- 1. How does changing SPI modes affect hardware design considerations? 2. What are common pitfalls encountered when integrating DMA with SPI communications? 3. Can you provide an example demonstrating how to implement custom arbitration logic for managing shared SPI resources among various modules? 4. In what scenarios would altering the SPI frame format be necessary?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值