flash-W25Q32BV的读写
调试了两天的flash,测试应该是没问题的了。在调试中发现,1、擦除的是时候最小是4k擦除,擦除是擦除我们给的地址所在的4k空间;2、写入数据时,如果地址在4k空间的尾部时,当写入长度跨过了4k空间,到了下一个4k的空间时,写数据不成功(读出来不正确),刚刚想到也有可能是我的下一个4k空间没有擦除,导致我写入数据不正确;3、当我读数据读到当前4k空间的尾部时,如果要读取的长度超出到了下一空间,读出来的数据仍然是正确的。有三个结论:擦除时,擦除我们给的地址所在的4k空间(用4k擦除命令);写数据时,地址过到下一个4k空间时,数据不能正常写入(需要再次验证);读数据时,地址过到下一个4k空间时,数据能正常读出。
W25Q32BV是一款挺强大的flash,我只是弄了最简单的一种读取方式。搜索的时候发现没什么相关代码,我弄好了,就让我分享一下我自己的,让大家见笑了。有不对之处请大家海涵并指出。
下面是代码,我用的板子是AM824,硬件SPI。
/**
* flash检查是否能接收命令,并等待到能接收为止
*/
void check()
{
uint8_t temp;
do {
flash_cs(0);
spi_sent_byte(AMHW_LPC82X_SPI0, 0x05);
temp = spi_sent_byte(AMHW_LPC82X_SPI0, 0x77);
flash_cs(1);
} while (temp & 0x01);
}
/**
* flash写使能,在擦除和写入数据前,要调用写使能
*/
void wri_en()
{
flash_cs(0);
am_udelay(10);
spi_sent_byte(AMHW_LPC82X_SPI0, 0x06);
flash_cs(1);
}
/**
* flash 擦除函数
* addr : 要擦除的地址
*/
void erase(uint32_t addr)
{
uint32_t temp;
wri_en();
temp = addr & 0x00ffffff;
flash_cs(0);
spi_sent_byte(AMHW_LPC82X_SPI0, 0x20);
temp = addr>>16;
spi_sent_byte(AMHW_LPC82X_SPI0, temp);
temp = addr>>8;
spi_sent_byte(AMHW_LPC82X_SPI0, temp);
temp = addr;
spi_sent_byte(AMHW_LPC82X_SPI0, temp);
flash_cs(1);
check();
}
在写数据之前,要先对地址所在的扇区进行擦除,否则数据可能会出错。
/**
* flash写入数据
* addr : 要存放在flash哪个地方
* buff : 要写入flash的数据缓存
* lenth :要写入的数据长度
*/
int write(uint32_t addr,uint8_t *buff, uint8_t lenth)
{
uint8_t temp = 0;
uint8_t i = 0;
if (buff == NULL || lenth == 0) {
return -1;
}
temp = addr & 0x00ffffff;
wri_en();
flash_cs(0);
am_udelay(10);
spi_sent_byte(AMHW_LPC82X_SPI0, 0x02);
temp = addr>>16;
spi_sent_byte(AMHW_LPC82X_SPI0, temp);
temp = addr>>8;
spi_sent_byte(AMHW_LPC82X_SPI0, temp);
temp = addr;
spi_sent_byte(AMHW_LPC82X_SPI0, temp);
for (i = 0; i < lenth; i++) {
spi_sent_byte(AMHW_LPC82X_SPI0, buff[i]);
}
flash_cs(1);
check();
return 0;
}
/**
* flash读数据
* addr : 地址
* buff : 将读出的数据保存在数组里
* lenth :要读出的数据长度
*/
int read(uint32_t addr, uint8_t *buff, uint8_t lenth)
{
uint8_t temp = 0;
uint8_t i = 0;
if (buff == NULL || lenth == 0) {
return -1;
}
temp = addr & 0x00ffffff;
flash_cs(0);
am_udelay(10);
spi_sent_byte(AMHW_LPC82X_SPI0, 0x03);
temp = addr>>16;
spi_sent_byte(AMHW_LPC82X_SPI0, temp);
temp = addr>>8;
spi_sent_byte(AMHW_LPC82X_SPI0, temp);
temp = addr;
spi_sent_byte(AMHW_LPC82X_SPI0, temp);
for (i = 0; i < lenth; i++) {
buff[i] = spi_sent_byte(AMHW_LPC82X_SPI0, 0);
}
flash_cs(1);
check();
return 0;
}
flash-W25Q32BV的读写相关推荐
- 一步一步实现STM32-FOTA系列教程之FLASH静态区读写
一步一步实现STM32-FOTA系列教程之FLASH静态区读写 文章系列链接 <一步一步实现STM32-FOTA系列教程之bin文件生成> <一步一步实现STM32-FOTA系列教程 ...
- 小猫爪:这些年遇过的Bug1-KW36 FLASH模拟EEPROM读写错误
小猫爪:这些年遇过的Bug1-KW36 FLASH模拟EEPROM读写错误 1 背景 2 场景描述 3 分析原因 4 解决方案 1 背景 芯片型号:MKW36A512VFT4(NXP) 操作系统:Fr ...
- STM32:Flash擦除与读写操作(HAL库)
应用平台:STM32F030F4P6 ST官方库:STM32Cube_FW_F0_V1.9.0 背景知识 绝大多数的单片机和微控制器(ARM,x86),地址空间都是以字节为单位的,也就是说一个地址是一 ...
- STM32与Flash AT45DB321D之间读写数据
Flash这种芯片调试,首先必须要读出他的ID来,才能进行读写操作. AT45DB321D 8192pages(512/528Bytes/Pages)大约4M左右,与单片机之间SPI通信. 大体流程就 ...
- 21. GD32F103C8T6入门教程-flash/fmc连续读写操作
gd32f103 的flash操作 1.定义扇区大小 /*对于主存储闪存容量不多于512KB的GD32F10x_CL和GD32F10x_HD,只使用了bank0:对 于 GD32F10x_MD , 闪 ...
- FLASH知识及读写擦除规则
一.FLASH的块/扇区/页关系 每块 每扇区 每页 16扇区 16页 256 Byte(2048 bit) 二.常用FLASH型号大小 型号 W25Q80 W25Q16 W25Q32 块 16 32 ...
- 关于AT25DF041B的flash芯片的读写驱动
一.什么是AT25DF041B 最近公司采购了一批AT25DF041B的外挂FLASH芯片用来存储数据,说让我负责该芯片的驱动程序的编写.但是我拿到芯片发现这芯片的代码资料几乎没有,MD,完全从头摸索 ...
- QCC304x系列开发教程(实战篇) 之 3.16-QCC3040之flash存储管理(读写)
查看全部教程开发请点击:高通蓝牙耳机QCC304x开发详解汇总(持续更新中) 1.应用子系统永久存储管理 对于应用子系统,最多可以使用290个键,从0到289.这些键没有预定义的含义:它们可以用于任何 ...
- STM32F103_SPI读写外部FLASH
目录 1.SPI简介 1. SPI协议简介 2.SPI物理层的特点 2.1.SPI 的内部简明图 2.2.物理层 3.SPI的协议层 3.1.SPI基本通讯过程 3.2. 通讯的起始和停止信号 3.3 ...
- NAND FLASH读写原理
NAND FLASH读写原理 一.结构分析 S3C2410处理器集成了8位Nand Flash控制器.目前市场上常见的8位NandFlash有三星公司的k9f1208.k9f1g08.k9f2g08 ...
最新文章
- Oracle 11g RAC ASM 错误之(1)
- 301重定向怎么进行URL标准化设置?
- 如何手工快速判断目标站是windows还是linux服务器
- 方式程0day MS17-010远程溢出漏洞测试
- HDU2059(DP)
- pygame里面物体闪烁运动_利用自闪烁发光二极管探究小车在倾斜轨道上的运动规律...
- AI赋能案例—阿里云身份证OCR识别助力实现“无接触”式政务服务!
- 如何玩转sortablejs-vuedraggable实现表单嵌套拖拽功能
- Linux基础(13)文本查找利器find的使用方法
- java类型之间的转换_java类型之间的转换
- qt 进度栏_HTML5进度栏
- Flutter 自定义 ImageButton
- 骁龙660鸿蒙系统,骁龙660 AIE是什么意思?高通骁龙660 AIE与660的区别
- Labview八段数码管0—9数字显示
- 聚类算法(4)--Hierarchical clustering层次聚类
- 【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星
- 复制百度文库文字收费内容
- 读书笔记《Linux那些事儿之我是USB》
- Oracle 11g RAC CRS-4535/ORA-15077
- 灯光篇之一【环境光AmbientLight】
热门文章
- 计算机与音乐结合论文,计算机毕业论文:浅谈计算机音乐技术在音乐教学中的应用...
- macbook充电_如何判断MacBook是否正在充电
- oracle中的left函数,Oracle Left Join
- sql查询每天整点时间的数据
- w7计算机新加,win7系统新加硬盘分区的详细步骤
- [BZOJ3669]-[Noi2014]魔法森林-LCT+并查集
- Office project 2013安装
- 全面加速ADSL宽带速度
- 学校教的Python,找工作没企业要,太崩溃了【大四真实求职经历】
- 什么是系统分析师 ?