历史上的今天
返回首页

历史上的今天

今天是:2025年02月12日(星期三)

正在发生

2019年02月12日 | STM32—cubeMX+HAL库的SPI接口使用

2019-02-12 来源:eefocus

摘要:

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


STM32之SPI简介:

(1)SPI协议【Serial Peripheral Interface】

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


(2)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不使能,不作响应。



(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引脚可以随便选择。


(4)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 Configuration    

    PA5     ------> SPI1_SCK

    PA6     ------> SPI1_MISO

    PA7     ------> 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,low

  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;//CPHA为数据线的第一个变化沿

  hspi1.Init.NSS = SPI_NSS_SOFT;//软件控制NSS

  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;//2分频,32M/2=16MHz

  hspi1.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_StatusTypeDef  HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);//接收数据

 


推荐阅读

史海拾趣

API Technologies公司的发展小趣事

API Technologies一直注重技术创新和研发投入。公司不断引进先进的生产设备和技术人才,加大对新产品、新技术的研发力度。通过不断的技术创新,API Technologies成功推出了一系列具有自主知识产权的高性能产品,不仅提升了公司的核心竞争力,也为公司的持续发展注入了新的动力。

Everett Charles Technologies (ECT)公司的发展小趣事

2001年,Everett Charles Technologies (Shenzhen) Limited(ECT深圳)正式成立,成为Dover集团在中国的全资子公司。ECT深圳的成立,不仅为ECT在中国市场的业务拓展提供了有力支持,也为公司进一步拓展亚洲市场奠定了基础。多年来,ECT深圳凭借卓越的产品质量和服务水平,赢得了众多客户的信赖和支持,成为ECT在亚洲地区的重要生产基地。

Antelec公司的发展小趣事

Antelec公司创立于XXXX年,由一群富有远见和热情的电子工程师组成。创立初期,公司专注于研发先进的电子测量与分析技术,成功开发出一种具有高精度和稳定性的测量仪器,填补了市场上的空白。这一技术突破不仅赢得了客户的青睐,也为公司的后续发展奠定了坚实的基础。

Advanced Optoelectronic Technology Corp公司的发展小趣事

AOTC公司起源于一个由几位电子工程专家组成的小团队,他们共同研发出了一种新型的光电转换器,具有更高的转换效率和更小的体积。这一技术突破迅速吸引了风险投资家的注意,公司得到了初始的资金支持,并开始了正式的商业化进程。

Gilway Technical Lamp公司的发展小趣事
检查压缩机与电气控制电路之间的连接是否牢固可靠,有无松动或脱落现象。
安路科技(Anlogic)公司的发展小趣事

随着技术的不断积累和市场的逐步开拓,安路科技在XXXX年成功推出了其首款高性能FPGA产品。这款产品以其优异的性能、稳定的品质和良好的性价比,迅速赢得了市场的青睐。此后,安路科技的产品线不断丰富,逐渐覆盖了更多应用领域,公司的市场份额也逐年攀升。

问答坊 | AI 解惑

最新版本的keil软件--uvision4beta1及其使用手记

上传一份最新版本的KEIL 51 软件vision4beta1,看起来很不错的,这个是没有PJ的版本,如果你的机子上装有注册过的uvision3,那直接安装就可以使用,无需另外注册!!刚下载下来,简单打开看了下,就拿出来和大家分享了,里边有一份网上找的使用手记 ...…

查看全部问答>

创建SQLCE数据库

能不能用VS2003在PC机上创建一个SQLCE数据库并操作SQLCE数据库??救救命啊…

查看全部问答>

关于BOOTlLOADER写数据命令的问题

                                 写两个以上的数据时他的校验和是他们依次异或的结果,那要是写一个数据时校验和是什么呢?…

查看全部问答>

cortex-m0社区热闹程度大减!

关于M0的讨论不是很热闹呀! 发帖顶一下!…

查看全部问答>

求助啊,去明尼苏达的事

首先我一直关注学校有个2+2的项目,是去明尼苏达双城校区的。不过我大概了解到,一年所有的费用大概在20万左右,不知道你觉得是大概一个怎样的数目? 然后我家的情况不是特别好,只能这样说,最多够支付我一年的学费,也就是20万。而且我估计是家 ...…

查看全部问答>

stm32 CAN通信遇到问题

    我用的stm32F103VC控制器外接一个TJA1050CAN收发器,加一个CAN分析仪(确定可用USBCAN-II(iTEK公司的))进行测试,至于stm32的CAN测试程序,首先采用回环模式,使能CAN接收中断,调试发现,可以进入接收中断,而且接收的数据与发送的数 ...…

查看全部问答>

同时有12V、5V、3.3V的系统,TI有没有单片电源器件?

有个东东,需要的电源有12V(或15V)、5V、3.3V,TI的电源IC有没有单片解决方案?…

查看全部问答>

【PSoC4心得】对PSoC的一些感受

收到板子后就开始装软件,软件装了两次,第一次不知道为什么没装成功,第二次直接安装到C盘 ,安装类型选的全部,装好后可以用了。 我是听大学的老师说起PSoC的,感觉挺不错的就申请了一套板子,打算用到公司的方案上。       &n ...…

查看全部问答>

2014 C2000研讨会课程汇总 带有DSP灵魂的MCU

2014 C2000研讨会课程汇总 https://www.eeworld.com.cn/traini ... ex&a=lists&catid=25 TI C2000是业界公认的最适合各种对实时性要求高的场合 工业应用是TI近几年明确的最重要的发展应用,即把工业应用作为其公司发展战略的重中之重, 因此C20 ...…

查看全部问答>