STM32的SPI接口、cubeMX软件配置SPI接口和分析SPI相关代码

发布时间:2023-09-22  

本文主要介绍STM32的SPI接口、cubeMX软件配置SPI接口和分析SPI相关代码。

STM32之SPI简介:


SPI协议【Serial Peripheral Interface】

串行外围设备接口,是一种高速全双工的通信总线。主要用在MCU与FLASHADCLCD等模块之间的通信。

SPI信号线

SPI 共包含 4 条总线。

SS(Slave Select):片选信号线,当有多个SPI 设备与 MCU 相连时,每个设备的这个片选信号线是与 MCU 单独的引脚相连的,而其他的 SCK、MOSI、MISO 线则为多个设备并联到相同的 SPI 总线上,低电平有效。

SCK (Serial Clock):时钟信号线,由主通信设备产生,不同的设备支持的时钟频率不一样,如 STM32 的 SPI 时钟频率最大为 f PCLK /2。

MOSI (Master Output Slave Input):主设备输出 / 从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入数据,即这条线上数据的方向为主机到从机。

MISO(Master Input Slave Output):主设备输入 / 从设备输出引脚。主机从这条信号线读入数据,从机的数据则由这条信号线输出,即在这条线上数据的方向为从机到主机。

其中SCK,MOSI,MISO是接在一起的,NSS分别接到不同的IO管脚控制。主器件要和从器件通信就先拉低对应从器件的NSS管脚使能。默认状态IO1,IO2,IO3全为高电平,当主器件和从器件1通信时,拉低IO1管脚使能从器件1。而从器件2,3不使能,不作响应。下图是主器件与多个从器件通信图。

SPI特性

单次传输可选择为 8 或 16 位。波特率预分频系数(最大为 fPCLK/2) 。时钟极性(CPOL)和相位(CPHA)可编程设置。数据顺序的传输顺序可进行编程选择,MSB 在前或 LSB 在前。

注:MSB(Most Significant Bit)是“最高有效位”,LSB(Least Significant Bit)是“最低有效位”。

可触发中断的专用发送和接收标志。可以使用 DMA 进行数据传输操作。下图是STM32的SPI框架图。

如上图,MISO数据线接收到的信号经移位寄存器处理后把数据转移到接收缓冲区,然后这个数据就可以由我们的软件从接收缓冲区读出了。当要发送数据时,我们把数据写入发送缓冲区,硬件将会把它用移位寄存器处理后输出到 MOSI数据线。SCK 的时钟信号则由波特率发生器产生,我们可以通过波特率控制位(BR)来控制它输出的波特率。

控制寄存器 CR1掌管着主控制电路,STM32的 SPI模块的协议设置(时钟极性、相位等)就是由它来制定的。而控制寄存器 CR2则用于设置各种中断使能。

最后为 NSS引脚,这个引脚扮演着 SPI协议中的SS片选信号线的角色,如果我们把 NSS引脚配置为硬件自动控制,SPI模块能够自动判别它能否成为 SPI的主机,或自动进入 SPI从机模式。但实际上我们用得更多的是由软件控制某些 GPIO引脚单独作为SS信号,这个 GPIO引脚可以随便选择。

SPI时钟时序

根据时钟极性(CPOL)及相位(CPHA)不同,SPI有四种工作模式。

时钟极性(CPOL)定义了时钟空闲状态电平:

CPOL=0为时钟空闲时为低电平

CPOL=1为时钟空闲时为高电平

时钟相位(CPHA)定义数据的采集时间。

CPHA=0:在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。

CPHA=1:在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。

CubeMX软件配置SPI:

下面继续介绍cubeMX软件配置STM32L152的SPI接口方法。

(1)打开软件,选择对应芯片后,配置好时钟源;

(2)勾选SPI1为全双工,硬件NSS关闭,如下图:

(3)勾选好后,PA5、PA6、PA7如下图,在配置PA4为普通io口,gpio_output

(4)SPI1的参数配置选择默认,如下图所示

(5)生成代码,保存即可。

HAL库的SPI函数分析:

下面具体分析下生成的SPI函数和函数调用。

SPI_HandleTypeDef hspi1; //SPI结构体类定义,下面看其结构体内部的声明。

下面分析SPI的初始化函数:

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi){GPIO_InitTypeDef GPIO_InitStruct;if(hspi->Instance==SPI1){/* USER CODE BEGIN SPI1_MspInit 0 *//* USER CODE END SPI1_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_SPI1_CLK_ENABLE();//使能SPI1时钟/**SPI1 GPIO ConfigurationPA5 ------> SPI1_SCKPA6 ------> SPI1_MISOPA7 ------> SPI1_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);//配置SPI的数据线和时钟线/* USER CODE BEGIN SPI1_MspInit 1 *//* USER CODE END SPI1_MspInit 1 */} static void MX_SPI1_Init(void){hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;//主模式hspi1.Init.Direction = SPI_DIRECTION_2LINES;//全双工hspi1.Init.DataSize = SPI_DATASIZE_8BIT;//数据位为8位hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;//CPOL=0,lowhspi1.Init.CLKPhase = SPI_PHASE_1EDGE;//CPHA为数据线的第一个变化沿hspi1.Init.NSS = SPI_NSS_SOFT;//软件控制NSShspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分频,32M/2=16MHzhspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;//最高位先发送hspi1.Init.TIMode = SPI_TIMODE_DISABLE;//TIMODE模式关闭hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;//CRC关闭hspi1.Init.CRCPolynomial = 10;//默认值,无效if (HAL_SPI_Init(&hspi1) != HAL_OK)//初始化{_Error_Handler(__FILE__, __LINE__);}}

利用SPI接口发送和接收数据主要调用以下两个函数:

HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//发送数据HAL_StatusTypeDefHAL_SPI_Receive(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize,uint32_tTimeout);//接收数据


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    串口父设备 ”,对串口进行配置,一般情况下没有特殊的要求,所有设置不动即可,如图9。 图9 串口配置窗口 配置完“ 通用串口父设备 ”后,双击“ 西门......
    介绍:MCU在出厂前,在芯片中嵌入了BootLoad程序(用FPGA做的?),作用是将做串口转SPI通信,芯片内部的存储芯片FLASH的接口为SPI,这其实是变相的SPI烧录,只是SPI接口配置......
    过采样技术来区别数据和噪音,从而恢复数据。 TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时, TX引脚处于高电平。在单线和智能卡模式里,此I/O口被......
    场景决定是否添加 · 本例中不需要添加 配置MAC地址 · 可选 配置 · 默认即可, 也可以修改 向导接口配置结果 · 创建3个Interface, 每个Port各一个 · 对于二层交换机来说, 只关注MAC地址......
    片机应用中,GPIO 输入输出模式是必不可少的硬件接口之一。本文将介绍 STM32 单片机的 GPIO 输入、输出模式与配置方法。 一、 STM32 单片机 GPIO 简介  GPIO ,全称 General......
    下行峰值可达4.67Gbps,上行峰值1.25Gbps,提升5G NR Sub-6GHz频段的5G宽带体验。FG360可支持两个2.5Gbps SGMII接口,支持多种LAN端口配置,多种Wi-Fi......
    图所示,双击绿色部分(串口配置) 按照下图新型串口配置: 如下图电机视窗左侧的SL1(串行线路)下方的MODBUS依次设置对应的从站号和主站。 注意:这里设置从站的话需要设置从站号 2. 从站......
    STM32F407 串口配置步骤;介绍STM32F407串口配置步骤,完成串口的数据发送与接收、实现中断接收,支持printf重定向。 STM32F407 串口配置说明 STM32F4 的串......
    Receiver/Transmitter)。   配置串口包括三部分内容:   1. I/O口配置:TXD配置为复用推挽输出(GPIO_Mode_AF_PP),RXD配置......
    )   {   RCC_APB2PeriphReadtempyCmd();//外设时钟初始化 //注意外设初始化一定要在GPIO端口配置初始化前面   GPIO_InitStructReadtempCmd......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>