打印
[ZLG-ARM]

LPC2214外接nandflash的读写问题

[复制链接]
2995|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hhmicro|  楼主 | 2007-2-25 19:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
hhmicro|  楼主 | 2007-2-26 13:40 | 只看该作者

补充源程序

现在用k9f1208接lpc2214
ale,cle 接到了i/o口上
时序正确
读id的程序和总线配置,我是用片内ram调试的

int main (void)
{// add user source code
    
    
    volatile uint16 *data;
    volatile unsigned  int *adder1;
    
    data=(uint16 *)0x80000000;
    adder1 =(uint32 *)0x81000000;
    
    PINSEL0 = 0x00000000;       // 设置管脚连接GPIO   
       IO0DIR = CA_LE;    
    
    
    IO0SET = (IO0SET|0x1000);
    IO0CLR = (IO0CLR|0x0800);
       
    *data =0x90;
        
        
    IO0SET = (IO0SET|0x0800);
    IO0CLR = (IO0CLR|0x1000);
    
    *data = 0x0;
    
    
    IO0CLR = (IO0CLR|0x1800);
    
    *adder1 = *data<<8;
    *adder1 |= *data;


总线的配置
;/* Define the Bus Speed */
BCFG0       EQU     0xFFE00000      ;// Control Word of BANK0 / CS0
BCFG1       EQU     0xFFE00004      ;// Control Word of BANK1 / CS1
BCFG2       EQU     0xFFE00008      ;// Control Word of BANK2 / CS2
BCFG3       EQU     0xFFE0000C      ;// Control Word of BANK3 / CS3

BCFG_08DEF    EQU        0x00000400      ;//  8Bit Bus
BCFG_16DEF    EQU        0x10000400      ;// 16Bit Bus
BCFG_32DEF    EQU        0x20000400      ;// 32Bit Bus


;//                             |    IDCY    |    WST1    |    WST2    
;//                             | Idle width | Read width | Write width
;//                             | 0x00 ~ 0x0f| 0x00 ~ 0x1f| 0x00~0x1f
BCFG_FLASH    EQU        (BCFG_08DEF | (0x0f<<00) | (0x0f<<05) | (0x0f<<11))   ;// For 90ns Flash
BCFG_PSRAM  EQU        (BCFG_16DEF | (0x0f<<00) | (0x0f<<05) | (0x0f<<11))   ;// For 70ns PSRAM
BCFG_CS2    EQU        (BCFG_16DEF | (0x0f<<00) | (0x1f<<05) | (0x1f<<11))   ;// Blank 
BCFG_CS3    EQU        (BCFG_16DEF | (0x01<<00) | (0x03<<05) | (0x03<<11))   ;// For Peripheral Equipment

使用特权

评论回复
板凳
zlgARM| | 2007-2-26 13:54 | 只看该作者

RE

给您两个链接参考:
https://bbs.21ic.com/club/bbs/list.asp?boardid=39&page=1&t=2434206&tp=%u5728%u7EBF%u8BF7%u6559zlgARM%u7B49%u8BF8%u4F4D%u5927%u867E%uFF0C2294%u8BBF%u95EE%u5916%u90E8%u5730%u5740%u7684%u95EE%u9898



https://bbs.21ic.com/club/bbs/list.asp?boardid=39&page=1&t=2431091&tp=%u7528H-JTAG%u70E7%u5199LPC2292%u7247%u5916SST39VF1601%u7684%u95EE%u9898%uFF0C%u5E2E%u5FD9%uFF0C555

使用特权

评论回复
地板
hhmicro|  楼主 | 2007-2-26 17:00 | 只看该作者

再补源程序,请zlgARM帮忙!

按照您给的链接看了,第一个帮助比较大
片外Flash为k9f1208,8位io的,64M;
RE  WE  ALE  CLE 分别接到CPU的OE  WE  P0.11(GPIO)   P0.12(GPIO)上;
CE通过CPLD接过来,CPLD的另一端也接的是CPU的NCS0;

/**********************************************************/
总线的配置
;/* Define the Bus Speed */
BCFG0       EQU     0xFFE00000      ;// Control Word of BANK0 / CS0
BCFG1       EQU     0xFFE00004      ;// Control Word of BANK1 / CS1
BCFG2       EQU     0xFFE00008      ;// Control Word of BANK2 / CS2
BCFG3       EQU     0xFFE0000C      ;// Control Word of BANK3 / CS3

BCFG_08DEF    EQU        0x00000400      ;//  8Bit Bus
BCFG_16DEF    EQU        0x10000400      ;// 16Bit Bus
BCFG_32DEF    EQU        0x20000400      ;// 32Bit Bus


;//                             |    IDCY    |    WST1    |    WST2    
;//                             | Idle width | Read width | Write width
;//                             | 0x00 ~ 0x0f| 0x00 ~ 0x1f| 0x00~0x1f
BCFG_FLASH    EQU        (BCFG_08DEF | (0x1f<<00) | (0x1f<<05) | (0x0f<<11))   ;// For 90ns Flash
BCFG_PSRAM  EQU        (BCFG_16DEF | (0x0f<<00) | (0x0f<<05) | (0x0f<<11))   ;// For 70ns PSRAM
BCFG_CS2    EQU        (BCFG_16DEF | (0x0f<<00) | (0x1f<<05) | (0x1f<<11))   ;// Blank 
BCFG_CS3    EQU        (BCFG_16DEF | (0x01<<00) | (0x03<<05) | (0x03<<11))   ;// For Peripheral Equipment

这里的RBLE为1;
ncs0接的是最慢的总线,为0x1f;
/**********************************************************/
PINSEL2的设置没有改过;用的是lpc2100模板

;初始化外部总线控制器,根据目标板决定配置

        LDR     R0, =PINSEL2
    IF :DEF: EN_CRP
        LDR     R1, =0x0f814910
    ELSE
        LDR     R1, =0x0f814914
    ENDIF
        STR     R1, [R0]
        
        LDR     R0, =BCFG0
        LDR     R1, =BCFG_FLASH
        STR     R1, [R0]

        LDR     R0, =BCFG1
        LDR     R1, =BCFG_PSRAM
        STR     R1, [R0]

        LDR     R0, =BCFG2
        LDR     R1, =BCFG_CS2
        STR     R1, [R0]

        LDR     R0, =BCFG3
        LDR     R1, =BCFG_CS3
        STR     R1, [R0]
        
        BL      InitStack               ;初始化堆栈 Initialize the stack
        BL      TargetResetInit         ;目标板基本初始化 Initialize the target board
                                        ;跳转到c语言入口 Jump to the entry point of C program
        B       __main


/***************************************************/
源程序,只写到了读芯片id,擦出和写入
#include "config.h"
//#define LED_ADDR        0x82000000;
#define        CA_LE                0x00001800    


void  DelayNS(uint32  dly)
{   uint32  i;

    for(; dly>0; dly--) 
    {
        for(i=0; i<5000; i++);
    }
}



int main (void)
{// add user source code
    
    
    
    volatile uint8 *data;
    //unsigned short int id;
    volatile unsigned  int *adder1;
    
    
    
    //unsigned int  id1,id2;
    
    data=(uint8 *)0x80000000;
    adder1 =(uint32 *)0x81000000;
    //adder2 =(uint32 *)0x81000008;
    //PINSEL2=((PINSEL2&0xf07fffff)|(0x38<<20));
    
    PINSEL0 = 0x00000000;       // 设置管脚连接GPIO   
    IO0DIR = CA_LE;    
    
    
    IO0SET = (IO0SET|0x1000);
    IO0CLR = (IO0CLR|0x0800);
    
    //for(;;)    
    *data =0x90;
        
        
    IO0SET = (IO0SET|0x0800);
    IO0CLR = (IO0CLR|0x1000);
    
    for(;;)
    *data = 0x0;
    
    
    IO0CLR = (IO0CLR|0x1800);
    
    
    //for(;;)
    
    *adder1 = *data<<8;
    *adder1 |= *data;
    
    for(;;);
    
    // _   *adder2 = *data;
    
    

/*****************************************************************************************************************/        
    
    
    int i;
    
    unsigned int block = 0x02;
    unsigned int blockpage = (block<<5);
    
    volatile uint8 *data;
    data=(uint8 *)0x80000000;
    
    
    
    PINSEL0 = 0x00000000;       // 设置管脚连接GPIO   
    IO0DIR = CA_LE;    
    
    
    
    IO0SET = (IO0SET|0x1000);
    IO0CLR = (IO0CLR|0x0800);
    
    //for(;;)
    *data = 0x60; //设置擦写模式 
    
    
    IO0SET = (IO0SET|0x0800);
    IO0CLR = (IO0CLR|0x1000);
    
    *data = (blockpage&0xff); // A9_A16,(Page Address) , 是基于块擦
    *data = ((blockpage>>8)&0xff); // A17_A24,(Page Address) 
    *data = ((blockpage>>16)&0xff); // A25, (Page Address) 
    
    IO0SET = (IO0SET|0x1000);
    IO0CLR = (IO0CLR|0x0800);
    
    *data = 0xd0; 
    
    for(i=0;i<10;i++);
    
    
    
/*****************************************************************************************************************/    




    int i;
    unsigned int block =0x00;
    unsigned int page =0x00;
    unsigned char a[528];
    unsigned int blockpage = (block<<5)+page;
    
    
    volatile uint16 *data;
    data=(uint16 *)0x80000000;
    
    PINSEL0 = 0x00000000;       // 设置管脚连接GPIO   
    IO0DIR = CA_LE;
    
    
    for(i=0;i<528;i++)
        a=0x55;
    
    
    IO0SET = (IO0SET|0x1000);
    IO0CLR = (IO0CLR|0x0800);
    
    *data = 0x0;                    // 从A区开始写 
    *data = 0x80;                // 写第一条命令 
    
    IO0SET = (IO0SET|0x0800);
    IO0CLR = (IO0CLR|0x1000);
    *data = 0;                    // A0_A7 位(Column Address) 
    *data = blockpage&0xff;        // A9_A16,(Page Address) 
    *data = (blockpage>>8)&0xff;    // A17_A24,(Page Address) 
    *data = (blockpage>>16)&0xff;// A25 (Page Address) 
    
            
    
    for(i=0;i<528;i++)
    {
        *data = a;
    }
    
    
    
    IO0SET = (IO0SET|0x1000);
    IO0CLR = (IO0CLR|0x0800);
    *data = 0x10;             // 结束写命令 

}


这个程序我是分为三部分(读id,擦出,写入)调试的,所以看上去有些重复定义;

还有我想向zlgARM请教,我向0X0000处擦出或写入,会不会影响芯片的ID,他不是就在0X0000处吗

使用特权

评论回复
5
grantxie| | 2007-3-18 14:36 | 只看该作者

NXP LPC2200+NAND参考设计

http://www.standardics.nxp.com/support/documents/microcontrollers/pdf/an10600.pdf
http://www.standardics.nxp.com/support/documents/microcontrollers/zip/code.lpc2200.nand.zip

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

5

帖子

0

粉丝