0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

STM32嵌入式开发 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2020-09-24 14:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文主要介绍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);//接收数据

原文标题:STM32CubeMX-HAL库的SPI接口使用

文章出处:【微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2312

    文章

    11189

    浏览量

    374514
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1897

    浏览量

    102081

原文标题:STM32CubeMX-HAL库的SPI接口使用

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    纳芯微磁编码器 SPI 接口硬件接线设计

      纳芯微磁编码器 SPI接口硬件接线设计与工程实现 纳芯微(含原麦歌恩MagnTek)磁编码器(MT68xx/NSM301x系列)的SPI接口是直播云台、伺服电机、机器人关节等高精度
    的头像 发表于 03-26 14:18 633次阅读

    RK 平台 SPI 开发完全指南(驱动 + 配置 + 测试 + 优化)

          在嵌入式 Linux 开发中, SPI (串行外设接口)凭借高速同步通信特性,广泛应用于传感器、存储芯片、显示模块等外设交互场景。瑞芯微( Rockchip )作为主流嵌入式芯片厂商,其
    的头像 发表于 01-30 22:35 1124次阅读
    RK 平台 <b class='flag-5'>SPI</b> 开发完全指南(驱动 + <b class='flag-5'>配置</b> + 测试 + 优化)

    SPI NOR Flash和SPI NAND Flash存储芯片的区别

    SPI NOR Flash与SPI NAND Flash并非相互替代,而是互补关系。SPI NOR胜在读取速度快、使用简单、可靠性高,是代码存储的理想选择。
    的头像 发表于 01-29 16:58 832次阅读
    <b class='flag-5'>SPI</b> NOR Flash和<b class='flag-5'>SPI</b> NAND Flash存储芯片的区别

    瑞芯微(EASY EAI)RV1126B SPI使用

    1.SPI简介SPI是串行外设接口(SerialPeripheralInterface)的缩写,是Motorola公司推出的一种同步串行接口技术,是一种高速、全双工、同步的通信总线在用
    的头像 发表于 01-03 14:00 1909次阅读
    瑞芯微(EASY EAI)RV1126B <b class='flag-5'>SPI</b>使用

    国产SPI NOR Flash接口闪存介绍

    在当今各类电子设备对存储性能要求日益提升的背景下,SPI NOR Flash凭借其高速读取、低功耗及灵活接口等优势,成为嵌入式系统代码存储的关键元件。GT25Q系列SPI NOR Fl
    的头像 发表于 12-26 11:51 617次阅读

    高性能SPI NOR FLASH芯片ZB25VQ系列推荐

    在嵌入式系统、物联网设备及各类存储应用中,SPI NOR FLASH芯片因其接口简单、功耗低、读写速度快等特点,成为代码存储与数据缓存的常见选择。SPI NOR FLASH是一种基于
    的头像 发表于 12-01 14:52 841次阅读

    GPIOB模拟spi的方法及lcd屏幕的接入

    越高,数据传输速率越快。由于spi接口较为简单,同时《RISC-V架构与嵌入式开发快速入门》书中也详细介绍过,在此原理部分介绍从略。 二、spi接口及lcd主要
    发表于 10-30 07:59

    SPI开发实战:硬件电路设计与CH390H应用全攻略

    、Air780EPM的SPI功能支持 在Air780EPM中,SPI接口通过特定GPIO引脚实现,需结合LuatOS的API进行配置。通过合理设计和调试,可高效连接多种外设,扩展物联网
    的头像 发表于 09-18 14:08 1064次阅读
    <b class='flag-5'>SPI</b>开发实战:硬件电路设计与CH390H应用全攻略

    深入剖析SPI协议

    SPI,全称(Serial Peripheral interface)是由摩托罗拉公司首先定义的协议,中文名为串型外围设备接口SPI是一种高速全双工的总线协议。
    的头像 发表于 08-21 15:04 4250次阅读
    深入剖析<b class='flag-5'>SPI</b>协议

    ADUM4150用于SPI高速接口的5kV专用隔离器技术手册

    ADuM4150是一款5kV rms、6通道SPIsolator ^™^ 数字隔离器,针对隔离式串行外设接口(SPI)进行了优化。(提供3.75kV rms型号)。这款器件基于ADI公司
    的头像 发表于 06-04 10:55 1017次阅读
    ADUM4150用于<b class='flag-5'>SPI</b>高速<b class='flag-5'>接口</b>的5kV专用隔离器技术手册

    LTM2895 100MHz隔离型DAC SPI串行接口技术手册

    LTM2895 是一款采用 DAC 控制信号的高速隔离型 μModule ^®^ (微型模块) SPI 接口,该器件专为隔离LTC 的通用型 DAC 系列和隔离通用型 SPI 接口而设
    的头像 发表于 06-03 10:04 1529次阅读
    LTM2895 100MHz隔离型DAC <b class='flag-5'>SPI</b>串行<b class='flag-5'>接口</b>技术手册

    第十七章 SPI

    本篇文章介绍了W55MH32的SPI接口,可工作于SPI或I2S模式,支持半 / 全双工、主从操作,具可编程时钟极性/相位等特征。阐述了主从模式配置、DMA 通信等,介绍
    的头像 发表于 05-28 17:29 1352次阅读
    第十七章 <b class='flag-5'>SPI</b>

    MAX3420E USB外设控制器,SPI接口技术手册

    协议,如错误校验和总线重试。通过工作频率高达26MHz的SPI接口访问寄存器组,可对MAX3420E进行控制。利用简易的3线或4线SPI接口,可为任何
    的头像 发表于 05-23 11:35 1227次阅读
    MAX3420E USB外设控制器,<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>技术手册

    MAX3421E USB外设/主机控制器,SPI接口技术手册

    串行接口引擎(SIE)处理底层USB协议,如错误校验和总线重试。通过频率高达26MHz的SPI接口访问寄存器组,实现MAX3421E的控制。利用简易的3线或4线SPI
    的头像 发表于 05-22 16:39 1770次阅读
    MAX3421E USB外设/主机控制器,<b class='flag-5'>SPI</b><b class='flag-5'>接口</b>技术手册

    基于RK3576开发板的SPI使用说明

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,是 Motorola 公司推出的一种同步串行接口技术,是一种高速、全双工、同步的通信总线在用户空间的应用程序中
    的头像 发表于 05-07 10:31 1715次阅读
    基于RK3576开发板的<b class='flag-5'>SPI</b>使用说明