咚咚咚————【封装驱动】W25QXX全系列驱动程序,分享交流自己编写的程序。

/********************************************
主控芯片:STM32 Controller
模块型号:W25QXX全系列芯片
通讯方式:SPI串口通信
作者:苏夏雨
授权:未经作者允许,禁止转载
********************************************/
#ifndef __W25QXX_H
#define __W25QXX_H
#include "sys.h"
/************W25QXX芯片IO引脚************/
#define W25QXX_CSL HAL_GPIO_WritePin(GPIOF,GPIO_PIN_6,GPIO_PIN_RESET);
#define W25QXX_CSH HAL_GPIO_WritePin(GPIOF,GPIO_PIN_6,GPIO_PIN_SET);
/************W25QXX芯片识别码************/
extern u16 W25QXX_TYPE;     //W25QXX器件ID
#define W25QXX_SSZIE 4096   //W25QXX扇区大小
#define W25QXX_PSZIE 256    //W25QXX页大小
#define W25Q80  0XEF13  //容量1M字节
#define W25Q16  0XEF14  //容量2M字节
#define W25Q32  0XEF15  //容量4M字节
#define W25Q64  0XEF16  //容量8M字节
#define W25Q128 0XEF17  //容量16M字节
#define W25Q256 0XEF18  //容量32M字节
/************W25QXX操作指令表************/
#define W25X_WriteEnable            0x06
#define W25X_WriteDisable           0x04
#define W25X_ReadStatusReg1     0x05
#define W25X_ReadStatusReg2     0x35
#define W25X_ReadStatusReg3     0x15
#define W25X_WriteStatusReg1  0x01
#define W25X_WriteStatusReg2  0x31
#define W25X_WriteStatusReg3  0x11
#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
#define W25X_Enable4ByteAddr  0xB7
#define W25X_Exit4ByteAddr    0xE9
#define W25X_SetReadParam           0xC0
#define W25X_EnterQPIMode     0x38
#define W25X_ExitQPIMode      0xFF
/************W25QXX操作函数表************/
void W25QXX_Init(void);                             //初始化W25QXX
u16  W25QXX_ReadID(void);                   //读取器件ID
void W25QXX_Write_Enable(void);             //写使能
void W25QXX_Write_Disable(void);            //写保护
u8   W25QXX_Read_SR(u8 cmd);          //读状态寄存器
void W25QXX_Write_SR(u8 cmd,u8 data); //写状态寄存器
void W25QXX_Erase_Chip(void);           //整片擦除
void W25QXX_Erase_Sector(u32 addr);     //扇区擦除
void W25QXX_Wait_Busy(void);          //等待空闲
void W25QXX_Down(void);                             //芯片休眠
void W25QXX_WakeUP(void);                       //芯片唤醒
void W25QXX_Read_Byte(u32 addr,u8* buf,u16 length);     //W25QXX读取数据
void W25QXX_Write_Byte(u32 addr,u8* buf,u16 length);    //W25QXX写入数据,不自动擦除,不自动换页
void W25QXX_Write_Page(u32 addr,u8* buf,u16 length);    //W25QXX写入数据,不自动擦除,可自动换页
/************W25QXX的SPI配置************/
//SPI_DIRECTION_2LINES  SPI两线模式
//SPI_POLARITY_HIGH         SPI时钟极性高
//SPI_DATASIZE_8BIT         SPI数据长度8位
//SPI_FIRSTBIT_MSB          SPI最高位开始发送
//SPI_PHASE_2EDGE               SPI第二个跳变沿读数据
#endif
/********************************************
主控芯片:STM32 Controller
模块型号:W25QXX全系列芯片
通讯方式:SPI串口通信
作者:苏夏雨
授权:未经作者允许,禁止转载
********************************************/
#include "w25qxx.h"
#include "qspi.h"
u16 W25QXX_TYPE=W25Q256;   //W25QXX器件ID
void W25QXX_Init(void)
{//W25QXX芯片初始化GPIO_InitTypeDef GPIO_Initure;                    //GPIO配置句柄__HAL_RCC_GPIOF_CLK_ENABLE();             //使能GPIOF时钟GPIO_Initure.Pin=GPIO_PIN_6;            //W25QXX_CS片选GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速HAL_GPIO_Init(GPIOF,&GPIO_Initure);           //初始化GPIOW25QXX_CSH;                                            //失能片选SPI_Init();                                               //初始化SPISPI_SetSpeed(SPI_BAUDRATEPRESCALER_4);  //设置分频系数W25QXX_TYPE=W25QXX_ReadID();   //读取W25QXX器件IDif(W25QXX_TYPE==W25Q256)            //如果是【W25Q256】{//因为3字节地址只能映射到16M字节空间W25QXX_CSL;                                                     //使能片选SPI_ReadWriteByte(W25X_Enable4ByteAddr);  //发送进入4字节地址模式指令   W25QXX_CSH;                                               //失能片选   }
}
void W25QXX_Write_Enable(void)
{//W25QXX允许写入模式W25QXX_CSL;                            //使能器件   SPI_ReadWriteByte(W25X_WriteEnable);   //发送写使能  W25QXX_CSH;                            //取消片选
}
void W25QXX_Write_Disable(void)
{  //W25QXX禁止写入模式W25QXX_CSL;                            //使能器件   SPI_ReadWriteByte(W25X_WriteDisable);  //发送写禁止指令    W25QXX_CSH;                            //取消片选
}
u8 W25QXX_Read_SR(u8 cmd)
{//W25QXX读状态寄存器u8 temp;u8 data;if(cmd==1){temp=W25X_ReadStatusReg1;};if(cmd==2){temp=W25X_ReadStatusReg2;};if(cmd==3){temp=W25X_ReadStatusReg3;};  W25QXX_CSL;                      //使能器件   SPI_ReadWriteByte(temp);         //发送读取状态寄存器命令    data=SPI_ReadWriteByte(0Xff);    //读取一个字节  W25QXX_CSH;                      //取消片选     return data;
}
void W25QXX_Write_SR(u8 cmd,u8 data)
{   //W25QXX写状态寄存器u8 temp;if(cmd==1){temp=W25X_WriteStatusReg1;};if(cmd==2){temp=W25X_WriteStatusReg2;};if(cmd==3){temp=W25X_WriteStatusReg3;};    W25QXX_CSL;               //使能器件   SPI_ReadWriteByte(temp);  //发送读取状态寄存器命令    SPI_ReadWriteByte(data);  //读取一个字节  W25QXX_CSH;               //取消片选
}
u16  W25QXX_ReadID(void)
{//W25QXX读取器件ID//先发送读取ID命令//再发送0x000000//芯片返回两个字节IDu16 temp=0;   W25QXX_CSL;                   SPI_ReadWriteByte(W25X_ManufactDeviceID);//发送读取ID命令     SPI_ReadWriteByte(0x00);        SPI_ReadWriteByte(0x00);        SPI_ReadWriteByte(0x00); temp|=SPI_ReadWriteByte(0xFF)<<8;  temp|=SPI_ReadWriteByte(0xFF);   W25QXX_CSH;                    return temp;
}
void W25QXX_Erase_Chip(void)
{       //W25Q256全片擦除45秒//换算下来擦除1M字节大概1.5秒W25QXX_Write_Enable();               //SET WEL W25QXX_Wait_Busy();                         //等待芯片空闲 W25QXX_CSL;                          //使能器件   SPI_ReadWriteByte(W25X_ChipErase);   //发送片擦除命令  W25QXX_CSH;                          //取消片选               W25QXX_Wait_Busy();                            //等待芯片空闲
}
void W25QXX_Erase_Sector(u32 addr)
{//W25QXX擦除扇区//地址需要对奇扇区大小//也就是扇区大小的整数倍addr*=W25QXX_SSZIE;W25QXX_Write_Enable();               //SET WEL     W25QXX_Wait_Busy();                         //等待芯片空闲    W25QXX_CSL;                          //使能器件   SPI_ReadWriteByte(W25X_SectorErase); //发送扇区擦除指令 if(W25QXX_TYPE==W25Q256)//如果是【W25Q256】地址为4字节{SPI_ReadWriteByte((u8)((addr)>>24));  //第4字节地址  }SPI_ReadWriteByte((u8)((addr)>>16));   //第3字节地址    SPI_ReadWriteByte((u8)((addr)>>8));    //第2字节地址 SPI_ReadWriteByte((u8)addr);                 //第1字节地址 W25QXX_CSH;                            //取消片选               W25QXX_Wait_Busy();                                //等待芯片空闲
}
void W25QXX_Read_Byte(u32 addr,u8* buf,u16 length)
{//在指定地址开始读取指定长度的数据//buf:数据存储区//addr:开始读取的地址(24bit或者32bit)//length:要读取的字节数(最大65535)u16 i;                                               W25QXX_CSL;                            //使能器件   SPI_ReadWriteByte(W25X_ReadData);      //发送读取命令  if(W25QXX_TYPE==W25Q256)//如果是【W25Q256】地址为4字节{SPI_ReadWriteByte((u8)((addr)>>24)); //第4字节地址  }SPI_ReadWriteByte((u8)((addr)>>16));   //第3字节地址    SPI_ReadWriteByte((u8)((addr)>>8));    //第2字节地址 SPI_ReadWriteByte((u8)addr);                //第1字节地址 for(i=0;i<length;i++){buf[i]=SPI_ReadWriteByte(0XFF);  //循环读数  }W25QXX_CSH;                            //取消片选
}
void W25QXX_Write_Byte(u32 addr,u8* buf,u16 length)
{//在指定地址开始写入指定长度的数据//不能自动擦除,不能自动换页//请确保该区域数据为0XFF//buf:数据存储区//addr:开始读取的地址//length:要写入的字节数,不允许超过该页的字节数//因为W25QXX不能跨页写入,指针会在页内不停循环u16 i;W25QXX_Write_Enable();                 //SET WEL W25QXX_CSL;                            //使能器件   SPI_ReadWriteByte(W25X_PageProgram);   //发送写页命令  if(W25QXX_TYPE==W25Q256)//如果是【W25Q256】地址为4字节{SPI_ReadWriteByte((u8)((addr)>>24)); //第4字节地址  }SPI_ReadWriteByte((u8)((addr)>>16));   //第3字节地址    SPI_ReadWriteByte((u8)((addr)>>8));    //第2字节地址 SPI_ReadWriteByte((u8)addr);                 //第1字节地址  for(i=0;i<length;i++)SPI_ReadWriteByte(buf[i]);//循环写数  W25QXX_CSH;                            //取消片选 W25QXX_Wait_Busy();                                //等待芯片空闲
}
void W25QXX_Write_Page(u32 addr,u8* buf,u16 length)
{//在指定地址开始写入指定长度的数据//不能自动擦除,可以自动换页//请确保该区域数据为0XFF//buf:数据存储区//addr:开始读取的地址//length:要写入的字节数(最大65535)u16 temp;temp=W25QXX_PSZIE-addr%W25QXX_PSZIE; //页剩余字节数               if(length<=temp)temp=length;                while(length>0){W25QXX_Write_Byte(addr,buf,temp);    //写入一页数据buf+=temp;           //数据指针递增addr+=temp;           //地址指针递增length-=temp;      //计算剩余长度if(length>W25QXX_PSZIE)temp=W25QXX_PSZIE; //可以写一整页if(length<W25QXX_PSZIE)temp=length;           //不够写一整页}
}
void W25QXX_Wait_Busy(void)
{//读取W25QXX状态寄存器的BUSY位while((W25QXX_Read_SR(1)&0x01)==0x01); //等待BUSY位清空
}
void W25QXX_Down(void)
{//W25QXX芯片进入掉电模式W25QXX_CSL;                            //使能器件   SPI_ReadWriteByte(W25X_PowerDown);     //发送命令  W25QXX_CSH;                            //取消片选
}
void W25QXX_WakeUP(void)
{  //W25QXX芯片离开掉电模式W25QXX_CSL;                                //使能器件   SPI_ReadWriteByte(W25X_ReleasePowerDown);  //发送命令     W25QXX_CSH;                                //取消片选
}

咚咚咚————【封装驱动】W25QXX全系列驱动程序,分享交流自己编写的程序。相关推荐

  1. 咚咚咚————【封装驱动】DS3231时钟芯片读写程序,分享交流自己编写的程序。

    咚咚咚----[封装驱动]DS3231时钟芯片读写程序,分享交流自己编写的程序. /******************************************** 主控芯片:STM32 Co ...

  2. 咚咚咚————【封装驱动】MAX6675热电偶温度传感器,分享交流自己编写的程序。

    咚咚咚----[封装驱动]MAX6675热电偶温度传感器,分享交流自己编写的程序. /******************************************** 主控芯片:STM32 C ...

  3. 咚咚咚————【封装驱动】MLX90614医用级红外温度传感器,分享交流自己编写的程序。

    咚咚咚----[封装驱动]MLX90614医用级红外温度传感器,自己编写封装的驱动程序. /******************************************** 主控芯片:STM3 ...

  4. 磊科(NetCore)全系列路由器中的“疑似后门”程序

    看近年来的路由器后门,多数是内置了超级密码,可直接登录路由管理后台,或是后台开启了FTP,可以任意文件上传下载等,再有就是存在一些很明显的"漏洞",这些勉强也说得过去.但如果直接监 ...

  5. Pandas 全系列教程分享

    偶然间发现的感觉很不错,分享以下 源地址:https://www.gairuo.com/p/pandas-overview - 入门 pandas ~ pandas 中文简介 ~ 安装及环境搭建 ~ ...

  6. LinuxUSB驱动程序调试--009:编写应用程序---验证协议【转】

    转自:http://biancheng.dnbcw.info/linux/257411.html [1] 如何编译X86下的 uBuntu APP---非常简单:             gcc -o ...

  7. usb扫描枪驱动下载 wince_WinCE系列全站仪USB驱动程序

    WinCE系列全站仪usb驱动程序是一款WinCE系列全站仪连接USB驱动同步软件,适合全系列Windows操作系统,支持早期的WIN9X和当前主流操作系统XP/WIN7,支持WINSERVER2K3 ...

  8. usb扫描枪驱动下载 wince_WinCE系列全站仪USB驱动程序(WinCE全站仪USB驱动) 最新中文版...

    WinCE系列全站仪USB驱动程序(WinCE全站仪USB驱动) 最新中文版 WinCE系列全站仪usb驱动程序是一款WinCE系列全站仪连接USB驱动同步软件,适合全系列Windows操作系统,支持 ...

  9. Linux系统驱动全吗,linux系统需要给硬件安装驱动程序么?谁推荐一下linux系统阿~要驱动最全...

    需要,不过大部分linux都自带,少量的也都有自动安装文件 比如ati的显卡驱动什么的. 之前还自己写过驱动,linux的驱动比windows的驱动透明度高很多 大部分硬件基本上 都可以识别的 也可以 ...

最新文章

  1. 【转载】Real6410 Linux 常见问题总结(截至2010/07/26)
  2. Linux 光盘的挂载和解挂
  3. python矩阵旋转函数_Python3算法之十:矩阵旋转
  4. SQL Server表分区【转】
  5. iOS.Dev.Support.MultiVersions
  6. (12)Node.js核心模块fs—实现文件复制和压缩
  7. 三种前端手机开发(uni-app、vant、mui)
  8. windows安装adb工具
  9. 用eXeScope个性化自己的Win7
  10. 20道你必须要背会的微服务面试题,面试一定会被问到
  11. 利用Python处理Excel数据
  12. [re入门]一个简单的加密程序的逆向破解与解密
  13. XTU OJ 1395
  14. 修改飞秋2013~随便改,瞬间提升你的逼格
  15. (10.3.5.6)软件验收报告文档模版
  16. 线上盲盒电商模式运营
  17. Unity项目 - 捡苹果 Apple Picker
  18. 【CSS-定位和浮动】
  19. C语言:va_list的用法
  20. Rust的前景怎么样?值不值的学—Rust对比、特色和理念

热门文章

  1. 最小生成树普里姆算法c语言代码,普里姆算法生成最小生成树-C语言描述.doc
  2. git 和 svn 学习
  3. 西米支付:扫码支付的介绍
  4. Vue非父子组件传值
  5. 不用@微信官网了,用python给自己的微信头像加个小国旗
  6. 大数据系统——Storm @Twitter论文分享
  7. 迅雷“潮好玩计划”数字藏品超额预约 今日开抢
  8. android 静态图片initlogo.bmp的大小要求,xboot-开机logo.bmp图片到initlogo.rle切换 - Powered by Discuz!...
  9. MFC绘制三次Cardinal曲线
  10. 儿童玩乐场所如何运营?