S2C2440 nor-flash的研究

发布者:qin199099最新更新时间:2023-09-05 来源: elecfans关键字:nor-flash  RAM 手机看文章 扫描二维码
随时随地手机看文章

1.Nor-Flash 接口如RAM一样 引脚很多 地址线和数据线是分开的

2. 容量小 1~32M 

3. 读写很简单 不过写命令需要向里面写入特定的命令 比NandFlash慢

4. 价格贵 不过不会产生坏块。

 

 

当CPU选择NOR-flash 作为启动的芯片的时候 则nor的0地址就是cpu的0地址 且nor 连接在了CS0上面 所以说nor flash的地址就是0

而且此时nor-flash不需要初始化(其实还有一个原因就是nor-flash的速度很快)

LADDR1 连接在 A0上面 所以说数据每次需要左移一位来保持数据正确。

 

 

 上图的这个表描述了各种命令如何访问nor-flash

比如 读ID

1. 在555H写AAH 

2. 在2AAH写0x55H

3. 在555H写90

4. 读0地址得到厂家ID(C2H)

5.读1地址得到设备ID(22DAH或225BH)

6. 往任意地址写0x0F退出读ID模式

进入CFI模式(统一norflash 信息)

1. 在0x55 写入0x98

2. 读10 11 12地址的值得出ID

写操作:

往地址555H写AAH(解锁)

往地址2AAH写55H

往地址555H写A0H

往Addr写Data

等待第六比特数据不变 完成写操作

#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);      /*根据手册规定此时发送的ADDR 8位和16位都是相同的 所以为了保证相同ADDR 需要左移一位 因为、

                                                        (addr>>1)<<1才能保持不变*/

        /* 等待烧写完成 : 读数据, 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':

[1] [2]
关键字:nor-flash  RAM 引用地址:S2C2440 nor-flash的研究

上一篇:S2C2440 时钟的设置方式
下一篇:中断和异常(1) 未定义异常

推荐阅读最新更新时间:2024-11-13 11:24

东芝内存出售闹剧:日本大企业怎么了?
日本大企业怎么了? 图╱路透 日本半导体产业在DRAM全盛时期的90年代,可说是称霸全球市场。 如今日本不仅被美国势力在基本专利上压制住,还被南韩、台湾劲敌的价格竞争迫得相继退出市场。 ■Toshiba recorded a net loss of ¥965.6 billion, the biggest by a Japanese manufacturer, in the year ended March after accruing mass ive losses from U.S.-based nuclear power unit Westinghouse Electric Co. 《日本经济新闻》报导,东芝社长纲川智在出售
[手机便携]
vivo NEX双屏版标配10GB大内存全面开售
集微网消息,今天是vivo NEX双屏版全面开售的日子,官方为此准备了不少的优惠活动,像送半年vivo care套装(包含半年碎屏宝+半年后盖宝+半年延保)、最高888元组合游戏礼券、最高7天电子书VIP等,让消费者买的放心与省心。 我们一起来了解一下这款今天全面开售的vivo NEX双屏版的大概情况: 采用了6.39英寸FHD+分辨率级别OLED 正面屏幕,副屏为5.49英寸OLED 屏,搭载骁龙845处理器,仅有10GB内存+128GB闪存一种存储组合,电池容量为3500mAh,支持22.5W半压闪充,vivo的音质一向不错,因而 vivo NEX双屏版内置AK-4377A HiFi芯片,支持vivo研发的深空音效
[手机便携]
消息称三星电子确认平泽 P4 工厂 1c nm DRAM 内存产线投资,目标明年 6 月投运
8 月 12 日消息,韩媒 ETNews 报道称,三星电子内部已确认在平泽 P4 工厂建设 1c nm DRAM 内存产线的投资计划,该产线目标明年 6 月投入运营。 平泽 P4 是一座综合性半导体生产中心,分为四期。在早前规划中,一期为 NAND 闪存,二期为逻辑代工,三期、四期为 DRAM 内存。三星已在 P4 一期导入 DRAM 生产设备,但搁置了二期建设。 而 1c nm DRAM 是第六代 20~10 nm 级内存工艺,各家的 1c nm(或对应的 1γ nm)产品目前均尚未正式发布。韩媒在报道中称,三星电子计划在今年底启动 1c nm 内存生产。 ▲ 三星平泽厂区 根据此前报道,三星电子考虑在明年下半年推出的 HB
[半导体设计/制造]
消息称三星电子确认平泽 P4 工厂 1c nm DRAM <font color='red'>内存</font>产线投资,目标明年 6 月投运
配3GB内存 黑莓保时捷二代P'9983曝光
黑莓保时捷二代P'9983曝光 新浪手机讯 8月25日上午消息,我们曾经报道过黑莓将在年底之前推出四款新设备,其中就包括保时捷二代P'9983。   P'9983可视为P'9981的升级版,在此前曝光的线路图,内部代号为BlackBerry Khan。黑色的机身看起来依旧十分有质感,配备经典的QWERTY全键盘设计,同时还将融入经久不衰的保时捷设计。相比P'9981,P'9983取消了触摸板设计,也不会有Passport那样的触摸式键盘,取而代之是一块3.5英寸的触摸屏。   不过,全键盘的机子屏幕都略小,仅为 3.5 英寸,机身内部搭载了双核 1.7GHz 处理器,搭配大容量的 3GB RAM。   该机还将内置
[手机便携]
SK海力士:DDR5内存起步5200MHz将于2020年推出
近日,SK 海力士负责人在接受采访时表示,准备在2020年发布DDR5内存条,频率起步5200MHz,另外DDR6内存也开始策划了,将在5~6年内研发。 在2018年末,SK海力士宣布完成首款DDR5 RAM芯片,该内存的速度为5200 MT/s,电压为1.1 V,比上一代产品快60%。到2022年,海力士还将会推出DDR6-6400版本。 据介绍,SK海力士DRAM设计研究员在与韩国先驱报谈论时表示第六代DDR内存将能够达到DDR6-12000的数据传输性能,并预测DDR6将在五六年内开发。他还表示海力士正在讨论“后DDR5”产品的几个设计方案,其中一个是延续现有的数据传输规范,另一个方案则是将DRAM和 SOC处理技术相结
[手机便携]
SK海力士:DDR5<font color='red'>内存</font>起步5200MHz将于2020年推出
μC/OS-II实时操作系统内存管理的改进
C/OS-II是一种开放源码的实时操作系统,具有抢先式、多任务的特点,已被应用到众多的微处理器上。虽然该内核功能较多,但还是有不甚完善的地方。笔者在分析使用中发现,内核在任务管理(包括任务调度、任务间的通信与同步)和中断管理上是比较完善的,具有可以接受的稳定性和可靠性;但在内存管理上显得过于简单,内存分区的建立方式有不合理之处。 1 内存管理不足之处的分析 在分析许多 C/OS-II的应用实例中发现,任务栈空间和内存分区的创建采用了定义全局数组的方法,即定义一维或二维的全局数组,在创建任务或内存分区时,将数组名作为内存地址指针传递给生成函数。这样实现起来固然简单,但是不够灵活有效。 编译器会将全局数组作为未初始化的全局变量,放
[单片机]
阅读ARM Memory(L1/L2/MMU)笔记
《ARM Architecture Reference Manual ARMv8-A》里面有Memory层级框架图,从中可以看出L1、L2、DRAM、Disk、MMU之间的关系,以及他们在整个存储系统中扮演的角色。 涉及到的相关文档有: 《ARM Architecture Reference Manual ARMv8-A》:E2 The AArch32 Application Level Memory Model和G3 The AArch32 System Level Memory Model两个章节,从总体架构上介绍了ARMv8-A Memory系统。 《Cortex-A53 TRM》:6 Level 1 Memory Sy
[单片机]
阅读ARM <font color='red'>Memory</font>(L1/L2/MMU)笔记
51单片机RAM数据存储区学习笔记
1.RAM keil C语言编程 RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128B,则未初始化的变量的初值默认为0.如果所有的变量超过单片机small模式下的128B大小,则必须对变量进行初始化,否则超过RAM大小变量的值是不确定的,在small模式下超过128B大小的变量也必须在编译器中重新设定存储器的存储模式。 在keil中,可选择small,compact,large三种方式存储数据变量: 在keil中可以用“Target Options”来配置这一项: 2.片内数据存储区 (1) 工作寄存器区 工作寄存器区位于片内数据存储器中的
[单片机]
51单片机<font color='red'>RAM</font>数据存储区学习笔记
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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