简单的记录一下使用HAL库的SPI外挂W25Q32
简单的记录一下使用HAL库的SPI外挂W25Q32
抽筋了,想记录一下。
cubeMX配置SPI
CS脚
spi.h 里添加
#define FLASH_ID 0XEF14//指令表#define W25X_WriteEnable 0x06 #define W25X_WriteDisable 0x04 #define W25X_ReadStatusReg 0x05 #define W25X_WriteStatusReg 0x01 #define W25X_ReadData 0x03 #define W25X_FastReadData 0x0B #define W25X_FastReadDual 0x3B #define W25X_PageProgram 0x02 #define W25X_BlockErase 0xD8 #define W25X_SectorErase 0x20 #define W25X_ChipErase 0xC7 #define W25X_PowerDown 0xB9 #define W25X_ReleasePowerDown 0xAB #define W25X_DeviceID 0xAB #define W25X_ManufactDeviceID 0x90 #define W25X_JedecDeviceID 0x9F
spi.c里添加
/* USER CODE BEGIN 1 */#define SPI_FLASH_CS_H() HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET) #define SPI_FLASH_CS_L() HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET) uint8_t SPI4_ReadByte(void){ uint8_t RxData; HAL_SPI_Receive(&hspi4, &RxData, 1, 20);return RxData; //返回通过SPIx最近接收的数据 }void SPI4_WriteByte(uint8_t TxData){ HAL_SPI_Transmit(&hspi4, &TxData, 1, 20); //通过外设SPIx发送一个数据 }//SPI_FLASH写使能 //将WEL置位 void SPI_FLASH_Write_Enable(void) {SPI_FLASH_CS_L(); //使能器件 SPI4_WriteByte(W25X_WriteEnable); //发送写使能 SPI_FLASH_CS_H(); //取消片选 } //SPI_FLASH写禁止 //将WEL清零 void SPI_FLASH_Write_Disable(void) { SPI_FLASH_CS_L(); //使能器件 SPI4_WriteByte(W25X_WriteDisable); //发送写禁止指令 SPI_FLASH_CS_H(); //取消片选 } //读取SPI_FLASH的状态寄存器//BIT7 6 5 4 3 2 1 0//SPR RV TB BP2 BP1 BP0 WEL BUSY//SPR:默认0,状态寄存器保护位,配合WP使用//TB,BP2,BP1,BP0:FLASH区域写保护设置//WEL:写使能锁定//BUSY:忙标记位(1,忙;0,空闲)//默认:0x00uint8_t SPI_Flash_ReadSR(void) { uint8_t byte=0; SPI_FLASH_CS_L(); //使能器件 SPI4_WriteByte(W25X_ReadStatusReg); //发送读取状态寄存器命令 byte = SPI4_ReadByte(); //读取一个字节 SPI_FLASH_CS_H(); //取消片选 return byte; } //等待空闲void SPI_Flash_Wait_Busy(void) { while ((SPI_Flash_ReadSR()&0x01)==0x01); // 等待BUSY位清空} //读取芯片ID W25X16的ID:0XEF14uint16_t SPI_Flash_ReadID(void){uint16_t Temp = 0; SPI_FLASH_CS_L(); SPI4_WriteByte(0x90);//发送读取ID命令 SPI4_WriteByte(0x00); SPI4_WriteByte(0x00); SPI4_WriteByte(0x00); Temp|=SPI4_ReadByte()<<8; Temp|=SPI4_ReadByte(); SPI_FLASH_CS_H(); return Temp;} //擦除整个芯片//整片擦除时间://W25X16:25s //W25X32:40s //W25X64:40s //等待时间超长...void SPI_Flash_Erase_Chip(void) { SPI_FLASH_Write_Enable(); //SET WEL SPI_Flash_Wait_Busy(); SPI_FLASH_CS_L(); //使能器件 SPI4_WriteByte(W25X_ChipErase); //发送片擦除命令 SPI_FLASH_CS_H(); //取消片选 SPI_Flash_Wait_Busy(); //等待芯片擦除结束} //读取SPI FLASH //在指定地址开始读取指定长度的数据//pBuffer:数据存储区//ReadAddr:开始读取的地址(24bit)//NumByteToRead:要读取的字节数(最大65535)void SPI_Flash_Read(uint32_t ReadAddr,uint16_t NumByteToRead,uint8_t* pBuffer) { uint16_t i; SPI_FLASH_CS_L(); //使能器件 SPI4_WriteByte(W25X_ReadData); //发送读取命令 SPI4_WriteByte((uint8_t)((ReadAddr)>>16)); //发送24bit地址 SPI4_WriteByte((uint8_t)((ReadAddr)>>8));SPI4_WriteByte((uint8_t)ReadAddr);for(i=0;i<NumByteToRead;i++){ pBuffer[i] = SPI4_ReadByte(); //循环读数 }SPI_FLASH_CS_H();//取消片选}//SPI在一页(0~65535)内写入少于256个字节的数据//在指定地址开始写入最大256字节的数据//pBuffer:数据存储区//WriteAddr:开始写入的地址(24bit)//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!void SPI_Flash_Write_Page(uint32_t WriteAddr,uint16_t NumByteToWrite,uint8_t* pBuffer){uint16_t i;SPI_FLASH_Write_Enable(); //SET WELSPI_FLASH_CS_L(); //使能器件SPI4_WriteByte(W25X_PageProgram); //发送写页命令SPI4_WriteByte((uint8_t)((WriteAddr)>>16)); //发送24bit地址SPI4_WriteByte((uint8_t)((WriteAddr)>>8));SPI4_WriteByte((uint8_t)WriteAddr);for(i=0;i<NumByteToWrite;i++) SPI4_WriteByte(pBuffer[i]);//循环写数SPI_FLASH_CS_H(); //取消片选 SPI_Flash_Wait_Busy(); //等待写入结束} /* USER CODE END 1 */
spi.h里添加调用函数
/* USER CODE BEGIN Prototypes */uint16_t SPI_Flash_ReadID(void);void SPI_Flash_Erase_Chip(void);void SPI_Flash_Read(uint32_t ReadAddr,uint16_t NumByteToRead,uint8_t* pBuffer);void SPI_Flash_Write_Page(uint32_t WriteAddr,uint16_t NumByteToWrite,uint8_t* pBuffer);/* USER CODE END Prototypes */
简单的记录一下使用HAL库的SPI外挂W25Q32相关推荐
- 单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕
单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕 说明:此篇为学习记录.可能存在错误或者不足.如有问题请指出. 硬件环境 主控芯片:STM32F411CEU6 主控开 ...
- STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片
STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...
- STM32 HAL库 STM32CubeMX -- SPI
文章目录 一.SPI 协议简介 SPI 物理层 SPI 协议层 二.SPI 的架构 三.通讯过程 四.STM32Cube MX配置 五.SPI HAL库函数 一.SPI 协议简介 SPI (Seria ...
- STM32F030 HAL库硬件SPI操作W25Q16存储芯片(二)
上篇文章介绍了W25Q16芯片的一些基本信息,这篇主要介绍编程操作. /*封装读写操作 SPI 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 */ uint8_t SPI_R ...
- HAL库的SPI 发送16位
配置 配置为16位数据位 发送与读取 以下面代码为例说明 void Adxl_Read(uint16_t code,uint16_t * value) {uint16_t pdata;pdata = ...
- STM32F4 HAL库开发 -- SPI Flash
一.驱动 bsp_spi_flash.c #include "THC_Board_include_h.h"/* Private define ------------------- ...
- 16.HAL库之SPI和QSPI
1.SPI协议(以RN8302为例) SPI是串行外设接口(Serial Peripheral Interface)的缩写.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线 ...
- STM32F030 HAL库硬件SPI操作W25Q16存储芯片(一)
芯片:华邦W25Q16JV W25Q16JV (16m位)串行闪存为有限空间.引脚和电源的系统提供了存储解决方案.25Q系列提供了超越普通串行闪存设备的灵活性和性能.它们非常适合代码跟踪到RAM,直接 ...
- 【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器
大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片--AD9833. AD9833是AD公司出品的一款DDS波形发生器,能够产生正弦波.三角波和方波输出. 1)什么是DDS 通俗来讲,DDS ...
最新文章
- python解压到指定文件夹_Python:将文件解压缩到当前工作目录,但不保存zip中的目录结构...
- 线性表的表示和实现方式之链式表示和实现
- 为什么越来越多的程序员开始学机器学习的原因
- csapp bufbomb实验
- 从事7年前端开发,有些经验想对转行学习前端的伙伴说说!
- nginx php 扩展,源码安装Nginx+PHP-FPM及扩展
- php删除图片按钮代码,jquery 按钮预览图片功能的代码,我看不太懂。应该怎么学...
- 搭建 sock5代理服务器
- Http-Only Cookie
- 设为首页 和 收藏本页
- Hive MetaStore 配置
- 测试mysql主从_MySQL主从介绍、配置主从、测试主从同步
- Q-Fish 升级技嘉主板BIOS
- 如何使用计算机中的导出,解决方案:如何使用Canon 2525i复印机将文档扫描到计算机中并生成PDF格式?...
- 结合使用Canvas API与History API——模拟绘图
- 日语 敬体 简体 作文 对话
- R包minfi处理DNA甲基化芯片数据
- 74HC245芯片简析
- 第三方互联网支付的主要类型
- 《Metasploit渗透测试魔鬼训练营》学习笔记
热门文章
- java实现can通信_[MicroPython]TPYBoard v102 CAN总线通信
- Dango搭建个人博客:前言
- 换位思考的反思与总结
- 32.我的wafBypass之道
- CyberSecurity Knowledge Base笔记
- 高级查询组件下拉框联动(三)
- Java面试常考之 单例设计模式(饿汉式单例、 懒汉式单例)
- 迅雷快车旋风链接转换成普通链接工具
- VehicleNet: Learning Robust Visual Representation for Vehicle Re-identification(车辆网络:学习用于车辆再识别的鲁棒视觉)
- 【​观察】英特尔傲腾DC P4800X有哪些适用场景?