HAL库之硬件SPI配置

一、设置RCC时钟(复位和时钟控制)

设置高速外部时钟HSE 选择外部晶振

  • Disable:内部时钟
  • BYPASS Clock Source:外部旁路时钟源,指无需使用外部晶体时所需的芯片内部时钟驱动组件(%外部晶振起振需要内部有时钟驱动组件,此选项是将其屏蔽,也就意味着外部直接输入时钟信号,如示波器等%),直接从外界输入时钟信号。
  • Crystal/Ceramic Resonator:使用晶振驱动电路,用外部晶振作为时钟源

二、SPI设置

1、配置SPI模式为主机全双工

2、配置NSS为软件控制 

SIP1的片选NSS : SPI1_NSS(PA4),如果片选引脚没有连接 SPI1_NSS(PA4),则需要选择软件片选 。

硬件片选和软件片选的区别
所谓硬件片选指的是SPI本身具有片选信号,当我们通过SPI发送数据时,SPI外设自动拉低CS信号使能从机,发送完成后自动拉高CS信号释放从机,这个过程是不需要软件操作的。而软件片选则是需要使用GPIO作为片选信号,SPI在发送数据之前,需要先通过软件设置作为片选信号的GPIO输出低电平,发送完成之后再设置该GPIO输出高电平。

3、配置SPI的参数

三、SPI函数详解 

在stm32f1xx_hal_spi.h头文件中可以看到spi的操作函数。分别对应轮询,中断和DMA三种控制方式。

  • 轮询: 最基本的发送接收函数,就是正常的发送数据和接收数据
  • 中断: 在SPI发送或者接收完成的时候,会进入SPI回调函数,用户可以编写回调函数,实现设定功能
  • DMA: DMA传输SPI数据

一般使用SPI传输用下面两个函数

//发送数据
HAL_StatusTypeDef  HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
*hspi: 选择SPI1/2,比如&hspi1,&hspi2
*pData : 需要发送的数据,可以为数组
Size: 发送数据的字节数,1 就是发送一个字节数据
Timeout: 超时时间,就是执行发送函数最长的时间,超过该时间自动退出发送函数//接收数据
HAL_StatusTypeDef  HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
*hspi: 选择SPI1/2,比如&hspi1,&hspi2
*pData : 接收发送过来的数据的数组
Size: 接收数据的字节数,1 就是接收一个字节数据
Timeout: 超时时间,就是执行接收函数最长的时间,超过该时间自动退出接收函数

四、 W25Qx部分函数讲解

#define SPI_CS_Enable() 	HAL_GPIO_WritePin(SPI1_CS_Port, SPI1_CS_Pin,GPIO_PIN_RESET)
#define SPI_CS_Disable() 	HAL_GPIO_WritePin((SPI1_CS_Port, SPI1_CS_Pin, GPIO_PIN_SET)#define W25Qx_TIMEOUT_VALUE 1000/*W25QXX读函数时序
函数开始先将要发送的数据(命令和地址)存储在cmd数组中,
拉低片选信号,开始SPI通信
然后后通过HAL_SPI_Transmit()函数发送出去
接着通过HAL_SPI_Receive()接收读取的数据。
拉高片选信号,关闭SPI通信*/
//pData 存放读取到的数据的数组 ;ReadAddr 读取数据的地址 ;Size 读取数据的大小
uint8_t BSP_W25Qx_Read(uint8_t* pData, uint32_t ReadAddr, uint32_t Size)
{uint8_t cmd[4];/* Configure the command */cmd[0] = READ_CMD;cmd[1] = (uint8_t)(ReadAddr >> 16);cmd[2] = (uint8_t)(ReadAddr >> 8);cmd[3] = (uint8_t)(ReadAddr);W25Qx_Enable();/* Send the read ID command */HAL_SPI_Transmit(&hspi1, cmd, 4, W25Qx_TIMEOUT_VALUE);	/* Reception of the data */if (HAL_SPI_Receive(&hspi2, pData,Size,W25Qx_TIMEOUT_VALUE) != HAL_OK){return W25Qx_ERROR;}W25Qx_Disable();return W25Qx_OK;
}/*向FLASH发送0x06 写使能命令
即可开启写使能,首先CS片选拉低,控制写入字节函数写入命令,CS片选拉高。*/
uint8_t BSP_W25Qx_WriteEnable(void)
{uint8_t cmd[] = {WRITE_ENABLE_CMD};uint32_t tickstart = HAL_GetTick();/*Select the FLASH: Chip Select low */W25Qx_Enable();/* Send the read ID command */HAL_SPI_Transmit(&hspi2, cmd, 1, W25Qx_TIMEOUT_VALUE);	/*Deselect the FLASH: Chip Select high */W25Qx_Disable();/* Wait the end of Flash writing */while(BSP_W25Qx_GetStatus() == W25Qx_BUSY);{/* Check for the Timeout */if((HAL_GetTick() - tickstart) > W25Qx_TIMEOUT_VALUE){        return W25Qx_TIMEOUT;}}return W25Qx_OK;
}/*扇区擦除指令,数据写入前必须擦除对应的存储单元,并且使能写操作,该指令先拉低/CS引脚电平,接着传输“20H”指令和要24位要擦除扇区的地址。判断flash是否为忙状态,如果不为忙则擦除操作完成。*/
uint8_t BSP_W25Qx_Erase_Block(uint32_t Address)
{uint8_t cmd[4];uint32_t tickstart = HAL_GetTick();cmd[0] = SECTOR_ERASE_CMD;cmd[1] = (uint8_t)(Address >> 16);cmd[2] = (uint8_t)(Address >> 8);cmd[3] = (uint8_t)(Address);/* Enable write operations */BSP_W25Qx_WriteEnable();/*Select the FLASH: Chip Select low */W25Qx_Enable();/* Send the read ID command */HAL_SPI_Transmit(&hspi2, cmd, 4, W25Qx_TIMEOUT_VALUE);	/*Deselect the FLASH: Chip Select high */W25Qx_Disable();/* Wait the end of Flash writing */while(BSP_W25Qx_GetStatus() == W25Qx_BUSY);{/* Check for the Timeout */if((HAL_GetTick() - tickstart) > W25Q128FV_SECTOR_ERASE_MAX_TIME){        return W25Qx_TIMEOUT;}}return W25Qx_OK;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/325567.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转Mysql 三(权限管理)

一、用户管理 1、登录MySQL服务器 语法示例: mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句" 详细命令中参数说明: -h参数 后面接主机名或者主机IP,hostname为主机,hostIP为主机…

Redis 给集合元素单独设置过期

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、场景 1.1 消费队列 1.2 Redis实现 二、常见的方案 2.1 为单独的 field 设置过期 2.2 设置整体过期时间 2.3 zset 结合 sc…

skimage图像处理(全)

文章目录 一、简介二、安装三、模块简介:API reference四、项目实战4.1、2D图像处理4.1.1、打印图像属性4.1.2、读取 / 显示 / 保存图像:skimage.io.imread() skimage.io.imshow() skimage.io.imsave()4.1.3、颜色空间转换:skimage.color.r…

给Flutter + FireBase 增加 badge 徽章,App启动器 通知红点。

在此之前需要配置好 firebase 在flutter 在项目中。(已经配置好的可以忽略此提示) Firebase 配置教程:flutter firebase 云消息通知教程 (android-安卓、ios-苹果)_flutter firebase_messaging ios环境配置-CSDN博客 由于firebase 提供的消息…

Tecplot 各版本安装指南

Tecplot下载链接 https://pan.baidu.com/s/1XbzjHnho8zIF7eC4KBFmgA?pwd0531 1.鼠标右击【Tecplot 360 EX 2023(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)【解压到 Tecplot 360 EX 2023(64bit)】。①解压前:需要先关闭“所…

x-cmd pkg | pdfcpu - 强大的 PDF 处理工具

目录 简介首次用户多功能支持性能表现安全的加密处理进一步阅读 简介 pdfcpu 是一个用 Go 编写的 PDF 处理库。同时它也提供 API 和 CLI。pdfcpu 提供了丰富的 PDF 操作功能,用户还能自己编写配置文件,用来管理和使用各种自定义字体并存储有效的默认配置…

Spark入门案例

Spark shell简介 启动 Spark shell 进入 Spark 安装目录后执行 spark-shell - -master master就可以提交Spark任务Spark shell 的原理是把每一行Scala代码编译成类,最终交由Spark执行 Master 地址的设置 Master的地址可以有如下几种设置方式 地址解释local[N]使…

【大数据进阶第三阶段之Hive学习笔记】Hive安装

目录 1、环境准备 2、下载安装 3、配置环境变量 4、配置文件 4.1、配置hive-env.sh ​编辑4.2、配置hive-site.xml 5、上传配置jar 6、启动 1、环境准备 安装hadoop 以及 zookeeper、mysql 【大数据进阶第二阶段之Hadoop学习笔记】Hadoop 运行环境搭建-CSDN博客 《z…

pygame学习(二)——绘制线条、圆、矩形等图案

导语 pygame是一个跨平台Python库(pygame news),专门用来开发游戏。pygame主要为开发、设计2D电子游戏而生,提供图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模…

云原生战专题 | 深入浅出分析云原生微服务的技术结构和架构设计

深入浅出分析云原生微服务的技术结构和架构设计 云原生容器技术背景容器编排Kubernetes控制平面的四大组件Kubernetes在容器编排中的设计要点 云原生微服务典型架构第一代微服务架构第二代微服务架构第三代微服务架构第四代微服务架构 未来的云原生架构 — Serverless 云原生容…

thinkphp学习04-控制器定义

控制器,即 controller,控制器文件存放在 controller 目录下; 如果想改变系统默认的控制器文件目录,可以在 config 下 route.php 配置: 将controller修改为controller123,就会报错,说明这个配置…

阿里云迁移AWS视频点播技术攻坚

文章目录 🐷 背景🦥 简述🐥 Aws服务🦜 AWS CloudFormation🐞 问题🐉 落地方案🦉 Aws vs Aliyun🍄 避坑指南 🐷 背景 由于AWS整体成本略低于阿里云,公司决定将…