S3C2440裸机------Nor Flash编程_擦写读

发布者:科技舞者最新更新时间:2021-10-12 来源: eefocus关键字:Nor  Flash编程 手机看文章 扫描二维码
随时随地手机看文章

1.读NorFlash

我们首先来实现读flash的函数,我们默认每次读取64个字节,然后我们把读取到的内容打印出来,其中前面打印数值,后面打印字符,对于不可见字符用...代替。


void do_read_nor_flash(void)

{

unsigned int addr;

volatile unsigned char *p;

int i, j;

unsigned char c;

unsigned char str[16];

/* 获得地址 */

printf("Enter the address to read: ");

addr = get_uint();

 

p = (volatile unsigned char *)addr;

 

printf("Data : nr");

/* 长度固定为64 */

for (i = 0; i < 4; i++)

{

/* 每行打印16个数据 */

for (j = 0; j < 16; j++)

{

/* 先打印数值 */

c = *p++;

str[j] = c;

printf("%02x ", c);

}

 

printf("   ; ");

 

for (j = 0; j < 16; j++)

{

/* 后打印字符 */

if (str[j] < 0x20 || str[j] > 0x7e)  /* 不可视字符 */

putchar('.');

else

putchar(str[j]);

}

printf("nr");

}

}


2.擦除Nroflash

从芯片手册看到,要想擦除,我们首先解锁,然后发出80命令,然后再次解锁,然后再向某一个地址发出30命令即可。

代码如下:


void do_erase_nor_flash(void)

{

unsigned int addr;

/* 获得地址 */

printf("Enter the address of sector to erase: ");

addr = get_uint();

 

printf("erasing ...nr");

nor_cmd(0x555, 0xaa);    /* 解锁 */

nor_cmd(0x2aa, 0x55); 

nor_cmd(0x555, 0x80); /* erase sector */

nor_cmd(0x555, 0xaa);    /* 解锁 */

nor_cmd(0x2aa, 0x55); 

nor_cmd(addr>>1, 0x30); /* 发出扇区地址 */

wait_ready(addr);

}

我们通过读数据bit6,如果它不变化了,说明擦除或者写结束了。所以wait_ready()函数这样写。 


void wait_ready(unsigned int addr)

{

unsigned int val;

unsigned int pre;

 

pre = nor_dat(addr>>1);

val = nor_dat(addr>>1);

while ((val & (1<<6)) != (pre & (1<<6)))

{

pre = val;

val = nor_dat(addr>>1);

}

}


3.写NorFlash

要想写NorFlash,我们首先解锁,然后在地址555H写入A0H命令,然后在某个地址写入某个之即可,这里的数据时16位的。

代码如下:


void do_write_nor_flash(void)

{

unsigned int addr;

unsigned char str[100];

int i, j;

unsigned int val;

/* 获得地址 */

printf("Enter the address of sector to write: ");

addr = get_uint();

 

printf("Enter the string to write: ");

gets(str);

 

printf("writing ...nr");

 

/* str[0],str[1]==>16bit 

* str[2],str[3]==>16bit 

*/

i = 0;

j = 1;

while (str[i] && str[j])

{

val = str[i] + (str[j]<<8);

/* 烧写 */

nor_cmd(0x555, 0xaa); /* 解锁 */

nor_cmd(0x2aa, 0x55); 

nor_cmd(0x555, 0xa0); /* program */

nor_cmd(addr>>1, val);

/* 等待烧写完成 : 读数据, Q6无变化时表示结束 */

wait_ready(addr);

 

i += 2;

j += 2;

addr += 2;

}

 

val = str[i];

/* 烧写 */

nor_cmd(0x555, 0xaa); /* 解锁 */

nor_cmd(0x2aa, 0x55); 

nor_cmd(0x555, 0xa0); /* program */

nor_cmd(addr>>1, val);

/* 等待烧写完成 : 读数据, Q6无变化时表示结束 */

wait_ready(addr);

}

4.完整代码

#include "my_printf.h"

#include "string_utils.h"

 

 

#define NOR_FLASH_BASE  0  /* jz2440, nor-->cs0, base addr = 0 */

 

 

/* 比如:   55H 98 

 * 本意是: 往(0 + (0x55)<<1)写入0x98

 */

void nor_write_word(unsigned int base, unsigned int offset, unsigned int val)

{

volatile unsigned short *p = (volatile unsigned short *)(base + (offset << 1));

*p = val;

}

 

/* offset是基于NOR的角度看到 */

void nor_cmd(unsigned int offset, unsigned int cmd)

{

nor_write_word(NOR_FLASH_BASE, offset, cmd);

}

 

unsigned int nor_read_word(unsigned int base, unsigned int offset)

{

volatile unsigned short *p = (volatile unsigned short *)(base + (offset << 1));

return *p;

}

 

unsigned int nor_dat(unsigned int offset)

{

return nor_read_word(NOR_FLASH_BASE, offset);

}

 

 

void wait_ready(unsigned int addr)

{

unsigned int val;

unsigned int pre;

 

pre = nor_dat(addr>>1);

val = nor_dat(addr>>1);

while ((val & (1<<6)) != (pre & (1<<6)))

{

pre = val;

val = nor_dat(addr>>1);

}

}

 

 

/* 进入NOR FLASH的CFI模式

 * 读取各类信息

 */

void do_scan_nor_flash(void)

{

char str[4];

unsigned int size;

int regions, i;

int region_info_base;

int block_addr, blocks, block_size, j;

int cnt;

 

int vendor, device;

/* 打印厂家ID、设备ID */

nor_cmd(0x555, 0xaa);    /* 解锁 */

nor_cmd(0x2aa, 0x55); 

nor_cmd(0x555, 0x90);    /* read id */

vendor = nor_dat(0);

device = nor_dat(1);

nor_cmd(0, 0xf0);        /* reset */

nor_cmd(0x55, 0x98);  /* 进入cfi模式 */

 

str[0] = nor_dat(0x10);

str[1] = nor_dat(0x11);

str[2] = nor_dat(0x12);

str[3] = '';

printf("str = %snr", str);

 

/* 打印容量 */

size = 1<<(nor_dat(0x27));

printf("vendor id = 0x%x, device id = 0x%x, nor size = 0x%x, %dMnr", vendor, device, size, size/(1024*1024));

 

/* 打印各个扇区的起始地址 */

/* 名词解释:

*    erase block region : 里面含有1个或多个block, 它们的大小一样

* 一个nor flash含有1个或多个region

* 一个region含有1个或多个block(扇区)

* Erase block region information:

*    前2字节+1    : 表示该region有多少个block 

*    后2字节*256  : 表示block的大小

*/

 

regions = nor_dat(0x2c);

region_info_base = 0x2d;

block_addr = 0;

printf("Block/Sector start Address:nr");

cnt = 0;

for (i = 0; i < regions; i++)

{

blocks = 1 + nor_dat(region_info_base) + (nor_dat(region_info_base+1)<<8);

block_size = 256 * (nor_dat(region_info_base+2) + (nor_dat(region_info_base+3)<<8));

region_info_base += 4;

 

// printf("nrregion %d, blocks = %d, block_size = 0x%x, block_addr = 0x%xnr", i, blocks, block_size, block_addr);

 

for (j = 0; j < blocks; j++)

{

/* 打印每个block的起始地址 */

//printf("0x%08x ", block_addr);

printHex(block_addr);

putchar(' ');

cnt++;

block_addr += block_size;

if (cnt % 5 == 0)

printf("nr");

}

}

printf("nr");

/* 退出CFI模式 */

nor_cmd(0, 0xf0);

}

 

void do_erase_nor_flash(void)

{

unsigned int addr;

/* 获得地址 */

printf("Enter the address of sector to erase: ");

addr = get_uint();

 

printf("erasing ...nr");

nor_cmd(0x555, 0xaa);    /* 解锁 */

nor_cmd(0x2aa, 0x55); 

nor_cmd(0x555, 0x80); /* erase sector */

nor_cmd(0x555, 0xaa);    /* 解锁 */

nor_cmd(0x2aa, 0x55); 

nor_cmd(addr>>1, 0x30); /* 发出扇区地址 */

wait_ready(addr);

}

 

void do_write_nor_flash(void)

{

unsigned int addr;

unsigned char str[100];

int i, j;

unsigned int val;

/* 获得地址 */

printf("Enter the address of sector to write: ");

addr = get_uint();

 

printf("Enter the string to write: ");

gets(str);

 

printf("writing ...nr");

 

/* str[0],str[1]==>16bit 

* str[2],str[3]==>16bit 

*/

i = 0;

j = 1;

while (str[i] && str[j])

{

val = str[i] + (str[j]<<8);

/* 烧写 */

nor_cmd(0x555, 0xaa); /* 解锁 */

nor_cmd(0x2aa, 0x55); 

nor_cmd(0x555, 0xa0); /* program */

nor_cmd(addr>>1, val);

/* 等待烧写完成 : 读数据, Q6无变化时表示结束 */

wait_ready(addr);

 

i += 2;

j += 2;

addr += 2;

}

 

val = str[i];

/* 烧写 */

nor_cmd(0x555, 0xaa); /* 解锁 */

nor_cmd(0x2aa, 0x55); 

nor_cmd(0x555, 0xa0); /* program */

nor_cmd(addr>>1, val);

/* 等待烧写完成 : 读数据, Q6无变化时表示结束 */

wait_ready(addr);

}

void do_read_nor_flash(void)

{

unsigned int addr;

volatile unsigned char *p;

int i, j;

unsigned char c;

unsigned char str[16];

/* 获得地址 */

printf("Enter the address to read: ");

addr = get_uint();

 

p = (volatile unsigned char *)addr;

 

printf("Data : nr");

/* 长度固定为64 */

for (i = 0; i < 4; i++)

{

/* 每行打印16个数据 */

for (j = 0; j < 16; j++)

{

/* 先打印数值 */

c = *p++;

str[j] = c;

printf("%02x ", c);

}

 

printf("   ; ");

 

for (j = 0; j < 16; j++)

{

/* 后打印字符 */

if (str[j] < 0x20 || str[j] > 0x7e)  /* 不可视字符 */

putchar('.');

else

putchar(str[j]);

}

printf("nr");

}

}

 

void nor_flash_test(void)

{

char c;

 

while (1)

{

/* 打印菜单, 供我们选择测试内容 */

printf("[s] Scan nor flashnr");

printf("[e] Erase nor flashnr");

printf("[w] Write nor flashnr");

printf("[r] Read nor flashnr");

printf("[q] quitnr");

printf("Enter selection: ");

 

c = getchar();

printf("%cnr", c);

 

/* 测试内容:

* 1. 识别nor flash

* 2. 擦除nor flash某个扇区

* 3. 编写某个地址

* 4. 读某个地址

*/

switch (c)  

{

case 'q':

case 'Q':

return;

break;

case 's':

case 'S':

do_scan_nor_flash();

break;

 

case 'e':

case 'E':

do_erase_nor_flash();

break;

 

case 'w':

case 'W':

do_write_nor_flash();

break;

 

case 'r':

case 'R':

do_read_nor_flash();

break;

default:

break;

}

}

}

关键字:Nor  Flash编程 引用地址:S3C2440裸机------Nor Flash编程_擦写读

上一篇:S3C2440裸机------NandFlash操作原理
下一篇:S3C2440裸机------Nor Flash编程_识别

推荐阅读最新更新时间:2024-11-04 12:32

英特尔采用65纳米工艺的1Gb NOR闪存样片面世
英特尔(Intel)日前于台北举行的2006年春季英特尔亚太科技论坛(IDF)活动中,宣布推出采用65纳米(nm)工艺技术的1Gb多层单元(Multi-Level Cell,MLC)NOR闪存(Flash)芯片样片。未来该公司的手机OEM客户,将能透过共通的闪存架构,简化从90纳米转移至65纳米工艺技术的流程。 英特尔的NOR闪存芯片被应用在包括手机在内的装置,用以管理手机作业、处理个人信息管理(Personal Information Management)的数据,以及储存相片/音乐/影片等数字内容。而65纳米工艺新组件将于第二季稍后开始向客户提供样本。 而英特尔也同时宣布与台湾地区签署合作备忘录(Memorandum of
[焦点新闻]
FLASH存储-----NOR Flash
所谓Flash,是内存(Memory)的一种,但兼有RAM和ROM 的优点,是一种可在系统(In-System)进行电擦写,掉电后信息不丢失的存储器,同时它的高集成度和低成本使它成为市场主流。 Flash 芯片是由内部成千上万个存储单元组成的,每个单元存储一个bit。具有低功耗、大容量、擦写速度快、可整片或分扇区在系统编程(烧写)、擦除等特点,并且可由内部嵌入的算法完成对芯片的操作,因而在各种嵌入式系统中得到了广泛的应用。 作为一种非易失性存储器,Flash在系统中通常用于存放程序代码、常量表以及一些在系统掉电后需要保存的用户数据等。 常用的Flash为8位或16位的数据宽度,编程电压为单3.3V。主要的生产厂商为IN
[单片机]
<font color='red'>FLASH</font>存储-----<font color='red'>NOR</font> <font color='red'>Flash</font>
并行NOR Flash在SOPC开发中的应用设计
   引言   随着FPGA技术的发展,出现了一种新概念的嵌入式系统,即SOPC(System On Programmable Chip)。SOPC技术融合了SoC和FPGA的优点,将处理器、片上总线、片上存储器、内部外设、I/O接口以及自定义逻辑集成在同一片FPGA中,而且软硬件可裁剪、可升级、可修改,具有软硬件在系统编程能力,在保证高性能的同时具有非常高的灵活性。由于大部分功能部件在FPGA内实现,外部只需要很少的器件,如大容量的RAM、Flash、DAC、ADC等。在系统需要脱离计算机独立运行时(绝大部分情况如此),非易失的存储器件Flash是必不可少的。Flash可以用来存储配置比特流、代码、数据或参数等重要信息。本文以
[嵌入式]
并行<font color='red'>NOR</font> <font color='red'>Flash</font>在SOPC开发中的应用设计
43. Flash闪存编程原理与步骤
一。stm32 Flash操作介绍 1. stm32编程方式 在线编程ICP有两种方式,包括: 用JLINK下载程序或通过串口下载程序到MCU中。 2. 闪存模块存储器组织 3. Flash闪存的的读取 4.Flash闪存的写和擦除 5. Flash的编程注意事项 6.stm32 Flash的编程过程 7. stm32 Flash的擦除过程 写数据之前必须要保证写入的地址数据是已经擦除过的,其值为0xFFFF。 页擦除:对于大容量的Flash每次擦除2k字节 整片擦除就是把整个区域全部擦除。 二。寄存器和库函数操作 1. 相关寄存器 用来写键值进
[单片机]
43. <font color='red'>Flash</font>闪存<font color='red'>编程</font>原理与步骤
s3c2440 裸机 系统时钟和定时器的设置
⑴系统时钟原理分析 时钟决定2440执行速度,2440可以使用外部提供的时钟源,也可以使用外部的晶振然后通过内部的晶振获得时钟频率;具体选择使用哪一个时钟源看下图: 开发板一般吧引脚M2和M3连接的GND,所以说全部使用的是晶振(crystal) 除此之外,2440提供了3个时钟源FCLK(用于cpu核),HCLK(advancedhigh performance bus,用于AHB总线设备,比如cpu核,dma,usb等),PCLK(advanced performance bus,用于外围设备,比如看门狗,pwm定时器,adc等等),对于锁相环,2440拥有两种PLL其中一个为UPLL,其专用于usb设备,还
[单片机]
<font color='red'>s3c2440</font> <font color='red'>裸机</font> 系统时钟和定时器的设置
华为与Nordic达成蜂窝物联网许可协议,标志着行业组件级许可向前迈出一大步
该许可协议意味着Nordic所有 nRF91系列 LTE-M 和窄带物联网(NB-IoT)产品及其 Nordic 客户都将自动获得授权许可和保护,可更高效地获取并使用华为的低功耗广域蜂窝技术标准专利技术 挪威奥斯陆 – 2022年6月21日 – Nordic Semiconductor与华为技术有限公司(“华为”)签订专利许可协议。通过该协议,华为向Nordic及其客户授予低功耗广域(LPWA)蜂窝物联网标准必要专利(SEP)的组件级许可,相关专利许可费按照公平、合理和非歧视性(FRAND)原则设置。 华为和Nordic双方通过透明和友好的协商,在短时间内就达成了该协议。 根据该协议,Nordic可以为其蜂窝物联网客户
[物联网]
兆易创新产能或影响NAND Flash价格
近期编码型存储器(Nor Flash)因市场需求不减,价格依旧持续维持高档。不过,目前大陆有新产能开出,加上新的解决方案应用,导致供需双方面都有变化的情况下,整体市场价格开始有松动倾向。 根据业界人士透露,近期 Nor Flash 价格松动,在供应面上,日前中芯国际拿出每月 1 万片的产能给兆易创新使用,用以生产 Nor Flash 后,武汉新芯也可能因 NAND Flash 量产进度落后,所以将部分闲置产能也拿出来提供兆易创新,使兆易创新有比较多产能影响市场价格。 另外,除了兆易创新陆续在中芯国际与武汉新芯投片,增加产能之外,另一家晶圆代工厂上海华力微,据传也开始拿出约每月万片产能,招揽 Nor Flash 厂商到上海华
[嵌入式]
S3C2440 Nor Flash驱动(二十四)
1、Nor Flash硬件介绍: 从原理图中我们能看待NOR FLASH有地址线,有数据线,它和我们的SDRAM接口类似,能直接读取数据,但不能想SDRAM直接写入数据,需要有命令才行。 1.1 其中我们2440的地址线共有27根(LADDR0~26),为什么是27根? 因为2440共有7个bank内存块,每个bank=128M=(2^27)B,所以共有27根数据线 1.2 为什么Nor Flash的地址线A0是接在2440的LADDR1上? 因为Nor Flash的数据共有16位,也就是每个地址保存了2B数据,而我们的2440的每个地址是保存1B数据 比如: 当2440访问0x00地址时,就会读取到N
[单片机]
<font color='red'>S3C2440</font> <font color='red'>Nor</font> <font color='red'>Flash</font>驱动(二十四)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved