分析STM32G0 SPI外设不能触发RXNE接收标志的原因

news/2024/12/2 17:38:55/

今天准备移植STM32F030R8T6的程序到STM32G030C8T6上,程序中用到了硬件SPI外设,因为STM32G0用的HAL+LL库而不是不是标准库,所以我用STM32Cube MX生成了SPI的LL库代码,但是使能SPI后发现硬件怎么都不能触发RXNE接收标志,生成代码如下:

void MX_SPI1_Init(void)
{/* USER CODE BEGIN SPI1_Init 0 *//* USER CODE END SPI1_Init 0 */LL_SPI_InitTypeDef SPI_InitStruct = {0};LL_GPIO_InitTypeDef GPIO_InitStruct = {0};/* Peripheral clock enable */LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SPI1);LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA);/**SPI1 GPIO ConfigurationPA5   ------> SPI1_SCKPA6   ------> SPI1_MISOPA7   ------> SPI1_MOSI*/GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;GPIO_InitStruct.Alternate = LL_GPIO_AF_0;GPIO_InitStruct.Pin = SPI_SCK_PIN;LL_GPIO_Init(SPI_SCK_PORT, &GPIO_InitStruct);GPIO_InitStruct.Pin = SPI_MISO_PIN;LL_GPIO_Init(SPI_MISO_PORT, &GPIO_InitStruct);GPIO_InitStruct.Pin = SPI_MOSI_PIN;LL_GPIO_Init(SPI_MOSI_PORT, &GPIO_InitStruct);/* USER CODE BEGIN SPI1_Init 1 *//* USER CODE END SPI1_Init 1 */SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX;SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_HIGH;SPI_InitStruct.ClockPhase = LL_SPI_PHASE_2EDGE;SPI_InitStruct.NSS = LL_SPI_NSS_SOFT;SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV4;SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;SPI_InitStruct.CRCPoly = 7;LL_SPI_Init(SPI1, &SPI_InitStruct);LL_SPI_SetStandard(SPI1, LL_SPI_PROTOCOL_MOTOROLA);LL_SPI_DisableNSSPulseMgt(SPI1);/* USER CODE BEGIN SPI1_Init 2 */LL_SPI_Enable(SPI1); //用户手动使能SPI/* USER CODE END SPI1_Init 2 */}

程序正常运行后,通过在线DEBUG并调出SPI外设后,查看相关寄存器,可以看出SPI能正常发送,但是因为CR2寄存器的RXNE标志一直不能被触发,导致接收不到数据,如下图所示:

在这里插入图片描述
但是相同的设置在STM32F0的标准库上是可以正常运行了,模式配置都一样,但是用LL库的STM32G0上就不能运行,后来查看STM32G031K LL库的使用 - SPI这篇文章,发现代码中额外添加了以下语句:

/* Configure the SPI2 FIFO Threshold */LL_SPI_SetRxFIFOThreshold(SPI2, LL_SPI_RX_FIFO_TH_QUARTER);//设置RX非空事件产生的FIFO阈值,根据通信时最小数据的大小设置,我这边最小为8位,所以设置为四分之一

通过查看STM32G0x0官方数据手册的24.6.2 SPI control register 2 (SPIx_CR2)小节,可以看到设置外设接收8位数据,RX FIFO阈值要设置为1/4,但因为Cube MX生成的代码没有设置FIFO阈值,并且LL_SPI_Init()函数也并没有直接对CR2寄存器的FRXTH位进行设置,导致了代码中虽然设置的是接收8位数据,但寄存器为默认16位的阈值,所以RXNE标志就一直不能触发,也就接收不到任何数据。
在这里插入图片描述

反观用了标准库函数的STM32F0,同样的设置为什么就可以正常运行呢???通过查看标准库函数SPI_Init(),可以发现函数中对CR2进行了赋值操作,而对应值正是SPI_DataSize_8b这个宏,该宏的值为0x0700,Bit12 FRXTH=1,该值对应FRXTH接收阈值为1/4,所以程序能正常运行,RXNE可以正常触发,这也就解释了为什么同样的配置在标准库上SPI能正常运行,但是在LL库上却不能正常运行的问题所在。

void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct)
{......./* Configure SPIx: Data Size */tmpreg |= (uint16_t)(SPI_InitStruct->SPI_DataSize); //SPI发送接收的数据为8位/* Write to SPIx CR2 */SPIx->CR2 = tmpreg; ......

http://www.ppmy.cn/news/307044.html

相关文章

为什么JVM不建议超过32G内存

在学习ES发现JVM内存不要超过32G的建议,故查找了一下原因。 java -Xmx32766m -Xms32766m -XX:PrintFlagsFinal 2> /dev/null | grep UseCompressedOops bool UseCompressedOops : true {lp64_product}查…

<STC32G12K128入门第五节>Time定时器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、timer是什么?二、相关寄存器1.2. THx & TLx3.案例总结前言 今天无聊的搞了一下stc32G12k128的timer定时器 一、timer是什么? 这里就是我们使用的开发板上面的timer资源 二、相关寄…

32g服务器做成虚拟,服务器32g内存 tomcat设置多大

服务器32g内存 tomcat设置多大 内容精选 换一换 目的调整系统配置选项,充分发挥系统硬件性能。调整系统配置选项,充分发挥系统硬件性能。方法具体优化项详见表1。OS配置参数参数名称参数含义优化建议配置方法vm.swappinessswap为系统虚拟内存,使用虚拟内存会导致性能下降,应…

STC32G 单片机EEPROM 操作实例

一 STC32G 单片机EEPROM简介 STC32G系列单片机内部集成了大量的EEPROM,特别是STC32G12K128集成多达128K EEPROM。 STC32G内部EEPROM可擦写10万次,分若干扇区,每个扇区512字节。EEPROM的写操作只能将1写为0。要将0写为1,必须擦除…

[STM32爬坑]STM32G431ADC工作不正常:

近期收到了一块STM32G4系列的开发板,作为试用开发板,尝试使用G4做电源类项目,在使用G4系列开发板的时候,碰到了ADC工作不正常的情况,具体情况如下所示: 由于项目需要,主频限定在20Mhz&#xff0…

STM32G0开发笔记-Platformio+libopencm3-按键和外部中断

【原文】https://makerinchina.cn/article_12434df0dc1e.html title: STM32G0开发笔记-Platformiolibopencm3-按键和外部中断 tags: STM32MCUSTM32G070libopencm3MonkeyPiexti categories: STM32 date: 2022-9-8 09:33:05 使用Platformio平台的libopencm3开发框架来开发STM32…

STM32G4系列MCU学习笔记:按键模块

第一次以写博客的方式记录自己在嵌入式学习过程中的学习经历和踩的那些坑~ Day1 那么开始叭! STM32G4系列MCU学习笔记:按键模块 前言一、硬件操作1. 原理图2. 硬件分析3. 初始化代码 二、按键模块的驱动层实现1. 硬件框图2. 按键驱动层代码实现3. 计时操…

服务器32g系统为什么显示3g,使用32G内存的电脑是什么样的体验?

以前因为工作关系接触过很多大内存服务器。也帮土豪朋友配32G的电脑(一个主机加过近万元) 32G内存电脑和16G差别大么? 相同的配置下,区别不会很大。16G内存目前完全可以满足一般家庭对电脑的99%的需求。 个人用的pc最吃配置的还是游戏和设计类用户。但无…