代码编织梦想

W25X64 是华邦公司推出的大容量
SPI FLASH 产品,W25X64 的容量为 64Mbit(8M),该系列还有 W25Q80/16/32 等。
W25X16,W25X32,W25X64分别有8192,16384,32768个可编程页,每页256字节,用扇区擦除指令每次可以擦除16页,用块擦除指令每次可以擦除256页,用整片擦除指令既可以擦除整个芯片,W25X16,W25X32,W25X64分别有512,1024,2048个可擦除扇区,或者32,64,128个可擦除的块。
W25Q64 的擦写周期多达 10W 次,具有 20 年的数据保存期限,支持电压为 2.7~3.6V,
W25Q64 支持标准的 SPI,还支持双输出/四输出的 SPI,最大 SPI 时钟可以到 80Mhz(双输出时相当于 160Mhz,四输出时相当于 320M)。
指令如下:
在这里插入图片描述
指令宏定义:
#define WINBOND_WRITE_ENABLE 0x06
#define WINBOND_READ_SR1 0x05
#define WINBOND_READ_SR2 0x35
#define WINBOND_WRITE_SR1 0x01
#define WINBOND_WRITE_SR2 0x31
#define WINBOND_READ_DATA 0x03
#define WINBOND_FAST_READ_DATA 0x0b
#define WINBOND_FAST_READ_DUAL_OUTPUT 0x3b
#define WINBOND_PAGE_PROGRAM 0x02
#define WINBOND_PAGE_ERASE 0x81
#define WINBOND_SECTOR_ERASE 0x20
#define WINBOND_BLOCK_ERASE 0xD8
#define WINBOND_CHIP_ERASE 0xC7
#define WINBOND_JEDEC_ID 0x9F

擦除枚举类型:
enum {
FLASH_PAGE_ERASER,//页擦除
FLASH_SECTOR_ERASER,//扇区擦除
FLASH_BLOCK_ERASER,//块擦除
FLASH_CHIP_ERASER,//整片擦除
};

在这里插入图片描述

读芯片ID:
static u32 _norflash_read_id()//读norflash芯片ID
{
u8 id[3];
spi_cs_l();
spi_write_byte(WINBOND_JEDEC_ID);//读ID指令
for (u8 i = 0; i < sizeof(id); i++) {
id[i] = spi_read_byte();
}
spi_cs_h();
return id[0] << 16 | id[1] << 8 | id[2];
}
读取芯片ID可以用来判断芯片容量。

3字节地址仅能表示16MB的地址空间
超过16MB需使用4字节表示地址
对norflash操作,发送地址
norflash有两种模式:3字节地址、4字节地址,3字节地址norflash最大16MB
static void _norflash_send_addr(u32 addr)//发送地址
{
if (is4byte_mode) {//4字节模式
spi_write_byte(addr >> 24);
}
spi_write_byte(addr >> 16);
spi_write_byte(addr >> 8);
spi_write_byte(addr);
}
使用标志来判断选择是24位地址还是32位地址。

以下两个函数用来配置芯片使用24位地址还是32位地址:
void norflash_enter_4byte_addr()//退出4字节模式
{
spi_cs_l();
spi_write_byte(0xb7);//B7指令表示配置norflash进入4字节模式
spi_cs_h();
}
void norflash_exit_4byte_addr()//进入4字节模式
{
spi_cs_l();
spi_write_byte(0xe9);//E9指令表示配置norflash退出4字节模式
spi_cs_h();
}
在这里插入图片描述
在这里插入图片描述
擦除操作:
int _norflash_eraser(u8 eraser, u32 addr)//擦除
{
u8 eraser_cmd;
switch (eraser) {
case FLASH_PAGE_ERASER://页擦除
eraser_cmd = WINBOND_PAGE_ERASE;//页擦除指令
addr = addr / 256 * 256;//计算页对齐地址
break;
case FLASH_SECTOR_ERASER://扇区擦除
eraser_cmd = WINBOND_SECTOR_ERASE;//扇区擦除指令
//r_printf(“>>>[test]:addr = %d\n”, addr);
addr = addr / 4096 * 4096;//计算扇区对齐地址
break;
case FLASH_BLOCK_ERASER://块擦除
eraser_cmd = WINBOND_BLOCK_ERASE;//块擦除指令
addr = addr / 65536 * 65536;//计算块对齐地址
break;
case FLASH_CHIP_ERASER://整片擦除
eraser_cmd = WINBOND_CHIP_ERASE;//整片擦除指令
break;
}
_norflash_send_write_enable();//使能写
spi_cs_l();//片选使能
spi_write_byte(eraser_cmd);//写指令
if (eraser_cmd != WINBOND_CHIP_ERASE) {//如果不是整片擦除
_norflash_send_addr(addr);//需要写入地址
}
spi_cs_h();//片选禁能
return _norflash_wait_ok();//等待完成
}
擦除有多种擦除:块、扇区、整片。
擦除时需要设置要擦除的地址。
擦除指令发送后,需要等待擦除完成。

等待函数如下:
//返回1表示忙
//返回0表示不忙
static int _norflash_wait_ok()//等待norflash操作完成
{
u32 timeout = 8 * 1000 * 1000 / 100;
while (timeout–) {
spi_cs_l();//片选拉低,选中spi外设
spi_write_byte(WINBOND_READ_SR1);//发送读状态寄存器命令
u8 reg_1 = spi_read_byte();//接收状态寄存器值
spi_cs_h();//片选拉高
if (!(reg_1 & BIT(0))) {//状态寄存器最低位0表示不忙,1表示忙
break;
}
delay(100);
}
if (timeout == 0) {
log_error(“norflash_wait_ok timeout!\r\n”);
return 1;
}
return 0;
}

擦除操作前必须写使能:
static void _norflash_send_write_enable()//写使能
{
spi_cs_l();
spi_write_byte(WINBOND_WRITE_ENABLE);//发送写使能指令
spi_cs_h();
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/binglinuxxin/article/details/127950767

c++学习笔记(十)_别error了的博客-爱代码爱编程

一、链表 1. 链表的概述 数组和链表的优缺点 静态数组:int arr [5]; 必须事先确定数组元素的个数,过多浪费,过小容易溢出,删除插入数据效率低(需要移动大量的数据) 动态数组:不需要事先知道元素的个数,在使用中动态申请,删除插入效率低(需要移动大量的数据)         (数组优点:遍历元素效率高) 链表:不需要事先知道数据的个数

学习 c++ 到底有什么好处?_爱编程的鱼的博客-爱代码爱编程

学C++本身是教不会你编程的。你需要主动的、不断的扩展自己的知识领域。 写一个学生管理系统是一个很好的开端;但接下来,你还需要学习更多。 举例来说,“图形界面”究竟是怎么一回事呢? 我们知道,计算机屏幕实际上是一个“色点”组成的“点阵”;高清屏1920X1080@24bit,意思就是:它一共有1080行,每行1920个点;每个点又可表示2^2

pytest学习和使用6-fixture如何使用?_虫无涯的博客-爱代码爱编程

6-fixture如何使用? 1 引入2 fixture参数说明2.1 fixture源码2.2 参数说明 3 fixture的特点4 fixture如何使用?4.1 调用方式4.1.1 方式一:直接传参4.1.

【loadrunner】学习loadrunner——controller与analysis的使用(三)_十叶知秋的博客-爱代码爱编程

文章目录 1.controller的使用1.1.创建场景的方式1.2.页面的介绍1.3.场景的设置1.2.1.设置初始化1.2.2.设置启动机制1.2.3.设置性能测试脚本的执行时间1.2.4.设置虚拟用户推出机制

cpp学习笔记:stl stack容器_为争。的博客-爱代码爱编程

一、stack基本概念 stack是一种先进后出的数据结构,它只有一个出口,栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为。 栈中进入数据称为:入栈push 栈中弹出数据称为:出栈pop 二、stack常用接口 stack<int> s;   //创建栈容器 s.push(10);     //向栈里边添加元素

每天学习一个css之linear-gradient_刚学html的博客-爱代码爱编程

linear-gradient的使用 介绍 CSS linear-gradient() 函数用于创建一个表示两种或多种颜色线性渐变的图片。其结果属于<gradient>数据类型,是一种特别的<image

metabase学习教程:提问-2_metabasecn的博客-爱代码爱编程

查询编辑器中的自定义表达式 何时应该使用自定义表达式,以及为什么要在Metabase的查询编辑器中利用它们。 在数学中,表达式是符号的集合,它们一起表示一个值。如果你以前使用过电子表格软件,表达式就是公式,比如=SUM(A1,B1). 自定义表达式在Metabase中查询编辑器是强大的工具,可以覆盖绝大多数分析用例,而无需采取SQL语言从工具箱里出来

istio学习(四)istio服务治理-负载均衡模型介绍_码农-文若书生的博客-爱代码爱编程

文章目录 前言一、simple二、consistentHash(hash一致性)三、LocalityLoadBalancer(区域加权负载均衡)(没太懂) 前言 Istio提供了三种负载均衡策略:simp

垃圾回收相关概念概述(宋红康jvm学习笔记)_欲无缘的博客-爱代码爱编程

System.gc() 在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 然而S

rhce学习 --- 第六次作业_昵称能吃吗?的博客-爱代码爱编程

RHCE学习 — 第六次作业 首先要先装DNS服务器需要的包 [root@localhost ~]# yum install bind -y 然后开始配置DNS服务 配置文件位置在/etc/named.c

读书笔记-学习gnu emacs-2_余很多之很多的博客-爱代码爱编程

学习本书目的: emacs的学习一直是陆陆续续看博客和上手实践,这次想通过阅读"学习GNU Emacs"这本书好好系统的再复习下emacs。 ps:读技术书应该是带着一定的目的去读的,最简单的目的可能就是为了学好某一项技术

java+springboot基于性别网上学习特征问卷调查及可视化系统_qq242219979的博客-爱代码爱编程

基于JSP技术、SSM框架、B/S机构、Mysql数据库设计并实现了性别网上学习特征及可视化。系统主要包括个人中心、用户管理、调查问卷管理、用户答卷管理、专家建议管理、学习攻略管理、我的收藏管理、爬虫管理、系统管理等功能模块。  (1)绪论 网站的开发背景,意义和系统状况等,详细讲述了系统的用处,对本章进行总结。 (2)系统开发技术的介绍 分别对JSP技术

clickhouse学习笔记之备份和恢复_coder_szc的博客-爱代码爱编程

手动实现备份及恢复 ClickHouse允许使用alter table ... freeze partition ....查询已创建表分区的本地副本,这是利用硬链接到/var/lib/clickhouse/shadow目录

c语言学习笔记(四)_四瓣纸鹤的博客-爱代码爱编程

学习C语言第四天 1.5.2 字符计数 在linux中 文件结束符为Ctr+D #include <stdio.h> /* 统计输入的字符数:版本1*/ main() {     long nc;     nc = 0;     while (getchar() != EOF)         ++nc;     printf("%l

plc学习笔记(二):plc结构(1)_liutangplease的博客-爱代码爱编程

目录:  PLC学习笔记(一):概述 PLC学习笔记(二):PLC结构(1) PLC学习笔记(三):PLC结构(2) 🦁🦝🐰 以下为正文🐺🐱🐶         PLC种类众多,但其组成结构和工作原理基本相同,主要由中央处理器CPU、储存器(ROM、RAM)和专门设计的输入/输出单元(I/O)电路、电源等组成。PLC内部框图如下图所示。

alexnet学习笔记_chj65的博客-爱代码爱编程

AlexNet 概述 AlexNet是由2012年ImageNet竞赛参赛者Hinton和他的学生Alex Krizhevsky设计的。 创新点 非线性激活函数ReLU 选取了非线性非饱和的relu函数,ReL

【k8s】学习笔记(二)_kubectl -爱代码爱编程

K8S学习笔记 三、Kubernetes 核心概念3.1、kubernetes 集群命令行工具 kubectl3.1.1、kubectl 概述3.1.2、kubectl 命令格式3.1.3、kubectl 基础