读取厂家\设备 ID

发送 90H 指令,再发送 00h 的地址,然后接收即可。

代码如下:

  1. void SPIFlashReadID(int *pMID, int *pDID)
  2. {
  3. SPIFlash_Set_CS(0); /* 选中SPI FLASH */
  4. SPISendByte(0x90);
  5. SPIFlashSendAddr(0);
  6. *pMID = SPIRecvByte();
  7. *pDID = SPIRecvByte();
  8. SPIFlash_Set_CS(1);
  9. }

两个状态寄存器

通过状态寄存器可以查询芯片此时是否忙碌、解除各种保护操作等。

写状态寄存器

  1. /* 通过 BUSY 位得知芯片是否忙碌 */
  2. static void SPIFlashWaitWhenBusy(void)
  3. {
  4. while (SPIFlashReadStatusReg1() & 1);
  5. }
  6. /* 使能操作 */
  7. static void SPIFlashWriteEnable(int enable)
  8. {
  9. if (enable)
  10. {
  11. SPIFlash_Set_CS(0);
  12. SPISendByte(0x06);
  13. SPIFlash_Set_CS(1);
  14. }
  15. else
  16. {
  17. SPIFlash_Set_CS(0);
  18. SPISendByte(0x04);
  19. SPIFlash_Set_CS(1);
  20. }
  21. }
  22. /* 写状态寄存器 */
  23. static void SPIFlashWriteStatusReg(unsigned char reg1, unsigned char reg2)
  24. {
  25. SPIFlashWriteEnable(1);
  26. SPIFlash_Set_CS(0);
  27. SPISendByte(0x01);
  28. SPISendByte(reg1);
  29. SPISendByte(reg2);
  30. SPIFlash_Set_CS(1);
  31. SPIFlashWaitWhenBusy();
  32. }

擦除操作

  1. /* erase 4K */
  2. void SPIFlashEraseSector(unsigned int addr)
  3. {
  4. SPIFlashWriteEnable(1);
  5. SPIFlash_Set_CS(0);
  6. SPISendByte(0x20);
  7. SPIFlashSendAddr(addr);
  8. SPIFlash_Set_CS(1);
  9. SPIFlashWaitWhenBusy();
  10. }

读写数据

  1. /* program */
  2. void SPIFlashProgram(unsigned int addr, unsigned char *buf, int len)
  3. {
  4. int i;
  5. SPIFlashWriteEnable(1);
  6. SPIFlash_Set_CS(0);
  7. SPISendByte(0x02);
  8. SPIFlashSendAddr(addr);
  9. for (i = 0; i < len; i++)
  10. SPISendByte(buf[i]);
  11. SPIFlash_Set_CS(1);
  12. SPIFlashWaitWhenBusy();
  13. }
  14. /* read */
  15. void SPIFlashRead(unsigned int addr, unsigned char *buf, int len)
  16. {
  17. int i;
  18. SPIFlash_Set_CS(0);
  19. SPISendByte(0x03);
  20. SPIFlashSendAddr(addr);
  21. for (i = 0; i < len; i++)
  22. buf[i] = SPIRecvByte();
  23. SPIFlash_Set_CS(1);
  24. }

芯片的操作指令表

下一篇文章写出 Flash 在 Linux 上的驱动程序。

SPI Flash(W25Q16DV) 基本操作的更多相关文章

  1. SPI Flash(W25Q16DV) 驱动

    大体上可分为以下几个部分: 1.注册设备驱动 spi_register_driver 2.分配 mtd_info 结构体 3.配置 mtd_info 结构体 4.注册 mtd_info 结构体 构建 ...

  2. Nand Flash,Nor Flash,CFI Flash,SPI Flash 之间的关系

    前言:    在嵌入式开发中,如uboot的移植,kernel的移植都需要对Flash 有基本的了解.下面细说一下标题中的中Flash中的关系 一,Flash的内存存储结构    flash按照内部存 ...

  3. 【iCore、iCore2 双核心板】EPCS 实验(SPI Flash)(基于Verilog语言)

    _____________________________________ 深入交流QQ群: A: 204255896(1000人超级群,可加入) B: 165201798(500人超级群,满员) C ...

  4. nand flash,nor flash,spi flash,片上RAM,片外RAM

    Flash有掉电数据保存的特点,RAM掉电则数据丢失,但是RAM的速度更高,擦写次数理论上没有限制,而Flash则不行. Nand Flash相比其余的几种flash优势在于可擦写次数多,擦写速度快, ...

  5. 27.some company's Spi Flash chip replace altera epcsxxx

    由于altera公司的epcsxxx芯片比较贵,所以一般用其它公司的spi flash芯片代替也可以.据AlteraFAE描述:“EPCS器件也是选用某家公司的SPIFlash,只是中间经过Alter ...

  6. NAND Flash的基本操作——读、写、擦除

    基本操作 这里将会简要介绍一下NAND Flash的基本操作在NAND Flash内部是如何进行的,基本操作包括:读.写和擦除.   读:     当我们读取一个存储单元中的数据时(如图2.4),是使 ...

  7. OpenRisc-32-ORPSoC烧写外部spi flash

    引言 经过前面的分析和介绍,我们对ORPSoC的启动过程(http://blog.csdn.net/rill_zhen/article/details/8855743)和 ORpSoC的debug子系 ...

  8. SPI FLASH与NOR FLASH的区别?

    1.SPI Flash (即SPI Nor Flash)是Nor Flash的一种: 2.NOR Flash根据数据传输的位数可以分为并行(Parallel)NOR Flash和串行(SPI)NOR ...

  9. Jlink使用技巧之烧写SPI Flash存储芯片

    前言 大多数玩单片机的人都知道Jlink可以烧写Hex文件,作为ARM仿真调试器,但是知道能烧写SPI Flash的人应该不多,本篇文章将介绍如何使用JLink来烧写或者读取SPI Flash存储器, ...

随机推荐

  1. W7500P硬件TCP/IP+硬件物理层PHY+Cortex-M0处理器(48MHZ)

    W7500P 硬件TCP/IP+硬件物理层PHY+Cortex-M0处理器(48MHZ) 硬件TCP/IP+硬件物理层PHY+Cortex-M0处理器(48MHZ) 如果您发现商品信息不准确,欢迎纠错 ...

  2. Python11/26--mysql之视图/触发器/事务/存储过程

    视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的时候直接使用即可 2.为什么用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 select * from ...

  3. fly插件飞向购物车

    首先载入jQuery库文件和jquery.fly.min.js插件. 插件官方: https://github.com/amibug/fly, 官方例子: http://codepen.io/hzxs ...

  4. 安装php7.2并且整合nginx且分开部署

    1.安装php 7.2 2.php配置 3.nginx配置 4.测试 5.报错与解决 6.利用upstream实现负载均衡 1.安装php 7.2 启动容器: liwangdeMacBook-Air: ...

  5. golang注意问题

    关于slice 我们都知道slice是在通过参数传递的时候传递的是引用 slice的appen操作是有返回值的,并不改变原值 例如 b := [],,,} c:=append(b, ) // b 不变 ...

  6. 131.leetcode-Palindrome Partitioning

    解法一. class Solution { public: vector<vector<string>> partition(string s) { vector<vec ...

  7. Yii2 三层设计模式:SQL Command、Query builder、Active Record(ORM)

    用Yii2也有一段时间了,发现Yii2 Framework对Database的操作有非常良好的结构和弹性. 接下来介绍三种数据库操作方式. SQL Command Level: // Get DB c ...

  8. HashMap的源码分析

    hashMap的底层实现是 数组+链表 的数据结构,数组是一个Entry<K,V>[] 的键值对对象数组,在数组的每个索引上存储的是包含Entry的节点对象,每个Entry对象是一个单链表 ...

  9. Servlet案例2:文件下载

    首先,解决两个小问题 1.输入中文乱码问题 一个小Demo即可解决: package demo; import java.io.IOException; import java.io.PrintWri ...

  10. ElasticSearch5.0之后的改变

    ES5的变化 search_type=count和scan都移除了 count可以用size=0代替 GET /my_index/_search { "size": 0, &quo ...