调试了两天的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的读写相关推荐

  1. 一步一步实现STM32-FOTA系列教程之FLASH静态区读写

    一步一步实现STM32-FOTA系列教程之FLASH静态区读写 文章系列链接 <一步一步实现STM32-FOTA系列教程之bin文件生成> <一步一步实现STM32-FOTA系列教程 ...

  2. 小猫爪:这些年遇过的Bug1-KW36 FLASH模拟EEPROM读写错误

    小猫爪:这些年遇过的Bug1-KW36 FLASH模拟EEPROM读写错误 1 背景 2 场景描述 3 分析原因 4 解决方案 1 背景 芯片型号:MKW36A512VFT4(NXP) 操作系统:Fr ...

  3. STM32:Flash擦除与读写操作(HAL库)

    应用平台:STM32F030F4P6 ST官方库:STM32Cube_FW_F0_V1.9.0 背景知识 绝大多数的单片机和微控制器(ARM,x86),地址空间都是以字节为单位的,也就是说一个地址是一 ...

  4. STM32与Flash AT45DB321D之间读写数据

    Flash这种芯片调试,首先必须要读出他的ID来,才能进行读写操作. AT45DB321D 8192pages(512/528Bytes/Pages)大约4M左右,与单片机之间SPI通信. 大体流程就 ...

  5. 21. GD32F103C8T6入门教程-flash/fmc连续读写操作

    gd32f103 的flash操作 1.定义扇区大小 /*对于主存储闪存容量不多于512KB的GD32F10x_CL和GD32F10x_HD,只使用了bank0:对 于 GD32F10x_MD , 闪 ...

  6. FLASH知识及读写擦除规则

    一.FLASH的块/扇区/页关系 每块 每扇区 每页 16扇区 16页 256 Byte(2048 bit) 二.常用FLASH型号大小 型号 W25Q80 W25Q16 W25Q32 块 16 32 ...

  7. 关于AT25DF041B的flash芯片的读写驱动

    一.什么是AT25DF041B 最近公司采购了一批AT25DF041B的外挂FLASH芯片用来存储数据,说让我负责该芯片的驱动程序的编写.但是我拿到芯片发现这芯片的代码资料几乎没有,MD,完全从头摸索 ...

  8. QCC304x系列开发教程(实战篇) 之 3.16-QCC3040之flash存储管理(读写)

    查看全部教程开发请点击:高通蓝牙耳机QCC304x开发详解汇总(持续更新中) 1.应用子系统永久存储管理 对于应用子系统,最多可以使用290个键,从0到289.这些键没有预定义的含义:它们可以用于任何 ...

  9. STM32F103_SPI读写外部FLASH

    目录 1.SPI简介 1. SPI协议简介 2.SPI物理层的特点 2.1.SPI 的内部简明图 2.2.物理层 3.SPI的协议层 3.1.SPI基本通讯过程 3.2. 通讯的起始和停止信号 3.3 ...

  10. NAND FLASH读写原理

    NAND FLASH读写原理 一.结构分析  S3C2410处理器集成了8位Nand Flash控制器.目前市场上常见的8位NandFlash有三星公司的k9f1208.k9f1g08.k9f2g08 ...

最新文章

  1. Oracle 11g RAC ASM 错误之(1)
  2. 301重定向怎么进行URL标准化设置?
  3. 如何手工快速判断目标站是windows还是linux服务器
  4. 方式程0day MS17-010远程溢出漏洞测试
  5. HDU2059(DP)
  6. pygame里面物体闪烁运动_利用自闪烁发光二极管探究小车在倾斜轨道上的运动规律...
  7. AI赋能案例—阿里云身份证OCR识别助力实现“无接触”式政务服务!
  8. 如何玩转sortablejs-vuedraggable实现表单嵌套拖拽功能
  9. Linux基础(13)文本查找利器find的使用方法
  10. java类型之间的转换_java类型之间的转换
  11. qt 进度栏_HTML5进度栏
  12. Flutter 自定义 ImageButton
  13. 骁龙660鸿蒙系统,骁龙660 AIE是什么意思?高通骁龙660 AIE与660的区别
  14. Labview八段数码管0—9数字显示
  15. 聚类算法(4)--Hierarchical clustering层次聚类
  16. 【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星
  17. 复制百度文库文字收费内容
  18. 读书笔记《Linux那些事儿之我是USB》
  19. Oracle 11g RAC CRS-4535/ORA-15077
  20. 灯光篇之一【环境光AmbientLight】

热门文章

  1. 计算机与音乐结合论文,计算机毕业论文:浅谈计算机音乐技术在音乐教学中的应用...
  2. macbook充电_如何判断MacBook是否正在充电
  3. oracle中的left函数,Oracle Left Join
  4. sql查询每天整点时间的数据
  5. w7计算机新加,win7系统新加硬盘分区的详细步骤
  6. [BZOJ3669]-[Noi2014]魔法森林-LCT+并查集
  7. Office project 2013安装
  8. 全面加速ADSL宽带速度
  9. 学校教的Python,找工作没企业要,太崩溃了【大四真实求职经历】
  10. 什么是系统分析师 ?