咚咚咚————【封装驱动】W25QXX全系列驱动程序,分享交流自己编写的程序。
咚咚咚————【封装驱动】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全系列驱动程序,分享交流自己编写的程序。相关推荐
- 咚咚咚————【封装驱动】DS3231时钟芯片读写程序,分享交流自己编写的程序。
咚咚咚----[封装驱动]DS3231时钟芯片读写程序,分享交流自己编写的程序. /******************************************** 主控芯片:STM32 Co ...
- 咚咚咚————【封装驱动】MAX6675热电偶温度传感器,分享交流自己编写的程序。
咚咚咚----[封装驱动]MAX6675热电偶温度传感器,分享交流自己编写的程序. /******************************************** 主控芯片:STM32 C ...
- 咚咚咚————【封装驱动】MLX90614医用级红外温度传感器,分享交流自己编写的程序。
咚咚咚----[封装驱动]MLX90614医用级红外温度传感器,自己编写封装的驱动程序. /******************************************** 主控芯片:STM3 ...
- 磊科(NetCore)全系列路由器中的“疑似后门”程序
看近年来的路由器后门,多数是内置了超级密码,可直接登录路由管理后台,或是后台开启了FTP,可以任意文件上传下载等,再有就是存在一些很明显的"漏洞",这些勉强也说得过去.但如果直接监 ...
- Pandas 全系列教程分享
偶然间发现的感觉很不错,分享以下 源地址:https://www.gairuo.com/p/pandas-overview - 入门 pandas ~ pandas 中文简介 ~ 安装及环境搭建 ~ ...
- LinuxUSB驱动程序调试--009:编写应用程序---验证协议【转】
转自:http://biancheng.dnbcw.info/linux/257411.html [1] 如何编译X86下的 uBuntu APP---非常简单: gcc -o ...
- usb扫描枪驱动下载 wince_WinCE系列全站仪USB驱动程序
WinCE系列全站仪usb驱动程序是一款WinCE系列全站仪连接USB驱动同步软件,适合全系列Windows操作系统,支持早期的WIN9X和当前主流操作系统XP/WIN7,支持WINSERVER2K3 ...
- usb扫描枪驱动下载 wince_WinCE系列全站仪USB驱动程序(WinCE全站仪USB驱动) 最新中文版...
WinCE系列全站仪USB驱动程序(WinCE全站仪USB驱动) 最新中文版 WinCE系列全站仪usb驱动程序是一款WinCE系列全站仪连接USB驱动同步软件,适合全系列Windows操作系统,支持 ...
- Linux系统驱动全吗,linux系统需要给硬件安装驱动程序么?谁推荐一下linux系统阿~要驱动最全...
需要,不过大部分linux都自带,少量的也都有自动安装文件 比如ati的显卡驱动什么的. 之前还自己写过驱动,linux的驱动比windows的驱动透明度高很多 大部分硬件基本上 都可以识别的 也可以 ...
最新文章
- 【转载】Real6410 Linux 常见问题总结(截至2010/07/26)
- Linux 光盘的挂载和解挂
- python矩阵旋转函数_Python3算法之十:矩阵旋转
- SQL Server表分区【转】
- iOS.Dev.Support.MultiVersions
- (12)Node.js核心模块fs—实现文件复制和压缩
- 三种前端手机开发(uni-app、vant、mui)
- windows安装adb工具
- 用eXeScope个性化自己的Win7
- 20道你必须要背会的微服务面试题,面试一定会被问到
- 利用Python处理Excel数据
- [re入门]一个简单的加密程序的逆向破解与解密
- XTU OJ 1395
- 修改飞秋2013~随便改,瞬间提升你的逼格
- (10.3.5.6)软件验收报告文档模版
- 线上盲盒电商模式运营
- Unity项目 - 捡苹果 Apple Picker
- 【CSS-定位和浮动】
- C语言:va_list的用法
- Rust的前景怎么样?值不值的学—Rust对比、特色和理念
热门文章
- 最小生成树普里姆算法c语言代码,普里姆算法生成最小生成树-C语言描述.doc
- git 和 svn 学习
- 西米支付:扫码支付的介绍
- Vue非父子组件传值
- 不用@微信官网了,用python给自己的微信头像加个小国旗
- 大数据系统——Storm @Twitter论文分享
- 迅雷“潮好玩计划”数字藏品超额预约 今日开抢
- android 静态图片initlogo.bmp的大小要求,xboot-开机logo.bmp图片到initlogo.rle切换 - Powered by Discuz!...
- MFC绘制三次Cardinal曲线
- 儿童玩乐场所如何运营?