简单的记录一下使用HAL库的SPI外挂W25Q32

抽筋了,想记录一下。

  1. cubeMX配置SPI

  2. CS脚

  3. 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
    
  4. 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 */
    
  5. 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相关推荐

  1. 单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕

    单片机:STM32F4x HAL库软硬SPI驱动ST7735s 1.8寸LCD屏幕 说明:此篇为学习记录.可能存在错误或者不足.如有问题请指出. 硬件环境 主控芯片:STM32F411CEU6 主控开 ...

  2. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  3. STM32 HAL库 STM32CubeMX -- SPI

    文章目录 一.SPI 协议简介 SPI 物理层 SPI 协议层 二.SPI 的架构 三.通讯过程 四.STM32Cube MX配置 五.SPI HAL库函数 一.SPI 协议简介 SPI (Seria ...

  4. STM32F030 HAL库硬件SPI操作W25Q16存储芯片(二)

    上篇文章介绍了W25Q16芯片的一些基本信息,这篇主要介绍编程操作. /*封装读写操作 SPI 读写一个字节 //TxData:要写入的字节 //返回值:读取到的字节 */ uint8_t SPI_R ...

  5. HAL库的SPI 发送16位

    配置 配置为16位数据位 发送与读取 以下面代码为例说明 void Adxl_Read(uint16_t code,uint16_t * value) {uint16_t pdata;pdata = ...

  6. STM32F4 HAL库开发 -- SPI Flash

    一.驱动 bsp_spi_flash.c #include "THC_Board_include_h.h"/* Private define ------------------- ...

  7. 16.HAL库之SPI和QSPI

    1.SPI协议(以RN8302为例) SPI是串行外设接口(Serial Peripheral Interface)的缩写.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线 ...

  8. STM32F030 HAL库硬件SPI操作W25Q16存储芯片(一)

    芯片:华邦W25Q16JV W25Q16JV (16m位)串行闪存为有限空间.引脚和电源的系统提供了存储解决方案.25Q系列提供了超越普通串行闪存设备的灵活性和性能.它们非常适合代码跟踪到RAM,直接 ...

  9. 【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器

    大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片--AD9833. AD9833是AD公司出品的一款DDS波形发生器,能够产生正弦波.三角波和方波输出. 1)什么是DDS 通俗来讲,DDS ...

最新文章

  1. python解压到指定文件夹_Python:将文件解压缩到当前工作目录,但不保存zip中的目录结构...
  2. 线性表的表示和实现方式之链式表示和实现
  3. 为什么越来越多的程序员开始学机器学习的原因
  4. csapp bufbomb实验
  5. 从事7年前端开发,有些经验想对转行学习前端的伙伴说说!
  6. nginx php 扩展,源码安装Nginx+PHP-FPM及扩展
  7. php删除图片按钮代码,jquery 按钮预览图片功能的代码,我看不太懂。应该怎么学...
  8. 搭建 sock5代理服务器
  9. Http-Only Cookie
  10. 设为首页 和 收藏本页
  11. Hive MetaStore 配置
  12. 测试mysql主从_MySQL主从介绍、配置主从、测试主从同步
  13. Q-Fish 升级技嘉主板BIOS
  14. 如何使用计算机中的导出,解决方案:如何使用Canon 2525i复印机将文档扫描到计算机中并生成PDF格式?...
  15. 结合使用Canvas API与History API——模拟绘图
  16. 日语 敬体 简体 作文 对话
  17. R包minfi处理DNA甲基化芯片数据
  18. 74HC245芯片简析
  19. 第三方互联网支付的主要类型
  20. 《Metasploit渗透测试魔鬼训练营》学习笔记

热门文章

  1. java实现can通信_[MicroPython]TPYBoard v102 CAN总线通信
  2. Dango搭建个人博客:前言
  3. 换位思考的反思与总结
  4. 32.我的wafBypass之道
  5. CyberSecurity Knowledge Base笔记
  6. 高级查询组件下拉框联动(三)
  7. Java面试常考之 单例设计模式(饿汉式单例、 懒汉式单例)
  8. 迅雷快车旋风链接转换成普通链接工具
  9. VehicleNet: Learning Robust Visual Representation for Vehicle Re-identification(车辆网络:学习用于车辆再识别的鲁棒视觉)
  10. 【​观察】英特尔傲腾DC P4800X有哪些适用场景?