打印
[ZLG-ARM]

请教关于NOR FLASH的读写

[复制链接]
1967|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xkleee|  楼主 | 2007-8-5 15:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
将周工的SMARTARM2200上的CPU PACK换成LPC2214,BANK0,BANK1分别接了一片SST39VF1601,程序放在LPC2214片内RAM中运行,工程模板使用2100,在应用程序中增加了对总线的配置,但无法读写FLASH,请各位大侠帮个忙!程序如下:
/****************************************************************************
* 文 件 名:main.c
* 功    能:对SST39VF160进行全片擦除,然后写两字节数据到芯片0地址,再读出来校验,
*           若校验通过则蜂鸣器响一声,否则不断地蜂鸣报警。
* 说    明:将跳线器JP4短接,JP7断开。
****************************************************************************/
#include "config.h"

#define     BEEPCON  1<<7                    // P0.7引脚控制B1,低电平蜂鸣
#define  FLASH_ADDR        0x81000000      // FLASH的起始地址(分配为Bank1块)

// 转换地址。将要发送给SST39VF160的地址值进行转换,以便于LPC2210输出。
// 由于SST39VF160的A0是与LPC2210的A1相连,所以addr要左移1位。
#define  GetAddr(addr)    (volatile uint16  *)(FLASH_ADDR|(addr<<1))

#define BCFG_DEF 0x10000400
#define IDCY     (0x00<<0)
#define WST1     (0x01<<5)
#define WST2     (0x01<<11)
#define BCFG3_SET (BCFG_DEF|IDCY|WST1|WST2)

#define IDCFS   (0x01<<0)
#define WST1FS   (0x03<<5)
#define WST2FS   (0x03<<11)
#define BCFG_FS  (BCFG_DEF|IDCFS|WST1FS|WST2FS)

/****************************************************************************
* 名    称:DelayNS()
* 功    能:长软件延时。
* 入口参数:dly        延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  DelayNS(uint32  dly)
{  
    uint32  i;
    for(; dly>0; dly--) 
    {
        for(i=0; i<5000; i++);
    }
}



/****************************************************************************
* 名    称:WordProgram()
* 功    能:半字(16位)数据编程。
* 入口参数:Addr        编程地址(SST39VF160内部地址)    
*           Data        编程数据
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8  WordProgram(uint32 Addr, uint16 Data) 
{  
    volatile uint16  *ip;
    uint16  temp1,temp2;

    ip = GetAddr(0x5555);    // 转换地址0x5555
    ip[0] = 0xaaaa;            // 第一个写周期,地址0x5555,数据0xAA
    ip = GetAddr(0x2aaa);
    ip[0] = 0x5555;            // 第二个写周期,地址0x2aaa,数据0x55
    ip = GetAddr(0x5555);
    ip[0] = 0xa0a0;            // 第三个写周期,地址0x5555,数据0xA0
    
    ip = (volatile uint16  *)(FLASH_ADDR|(Addr&0x1FFFFF));
    *ip = Data;                // 第四个写周期,地址Addr,数据Data
   
    while (1)                // 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变)
    { 
        temp1 = *ip;            
        temp2 = *ip;
        if (temp1 == temp2)
        {  
            if (temp1 != Data)
            {  
                return(FALSE);
            }
            else
            { 
                return(TRUE);
            }
        }
    }
    return(TRUE);
}

/****************************************************************************
* 名    称:ChipErase()
* 功    能:芯片全片擦除。
* 入口参数:无
* 出口参数:返回TRUE表示操作成功,返回FALSE表示操作失败
****************************************************************************/
uint8  ChipErase(void) 
{  
    volatile uint16  *ip;
    uint16  temp1,temp2;

    ip = GetAddr(0x5555);
    ip[0] = 0xaaaa;        // 第一个写周期,地址0x5555,数据0xAA
    ip = GetAddr(0x2aaa);
    ip[0] = 0x5555;        // 第二个写周期,地址0x2aaa,数据0x55
    ip = GetAddr(0x5555);
    ip[0] = 0x8080;        // 第三个写周期,地址0x5555,数据0x80
    ip = GetAddr(0x5555);
    ip[0] = 0xaaaa;        // 第四个写周期,地址0x5555,数据0xAA
    ip = GetAddr(0x2aaa);
    ip[0] = 0x5555;        // 第五个写周期,地址0x2aaa,数据0x55
    ip = GetAddr(0x5555);
    ip[0] = 0x1010;        // 第六个写周期,地址0x5555,数据0x10

    while (1)            // 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变)
    {  
        temp1 = *ip;
        temp2 = *ip;
        if (temp1 == temp2)
        {  
            if (temp1 != 0xffff)
            {  
                return(FALSE);
            }
            else
            {  
                return(TRUE);
            }
        }
    }
    return(TRUE);
}


/****************************************************************************
* 名    称:main()
* 功    能:SST39VF160擦除、编程操作。
****************************************************************************/
int  main(void)
{  
    uint8  i;
    uint8  err = 0;
   
    
    volatile uint16  *addr;

    PINSEL0 = 0x00000000;        // 设置管脚连接GPIO 
    PINSEL2=0x0f814914;
   //BCFG0=BCFG_FS; 
    BCFG1=BCFG_FS; 
  //BCFG2=BCFG3_SET; 
    
    IO0DIR = BEEPCON;         // 设置I/O为输出

    ChipErase();            // FLASH全片擦除
   
    // 校验是否真正擦除。若发现有非0xFFFF的存储单元,设置err=1
    addr = (volatile uint16  *)FLASH_ADDR + 0;
    for(i=0; i<100; i++)              
    { 
        if(0xFFFF != (*addr)) err = 1;
        addr++;
    }
         
    WordProgram(0x0, 0x55AA);// 向FLASH的0地址写入0x55AA
    
    addr = (volatile uint16  *)FLASH_ADDR + 0;
       if(0x55AA != (*addr)) err = 1;// 读出校验,若数据错误则设置err=1
      
    if(0==err)   
    {  
        IO0CLR = BEEPCON;            // BEEPCON = 0
        DelayNS(20);
        IO0SET = BEEPCON;            // BEEPCON = 1
        DelayNS(20);
    }
    else
    {  
        while(1)    
        {  
            IO0CLR = BEEPCON;        // BEEPCON = 0
            DelayNS(10);
            IO0SET = BEEPCON;        // BEEPCON = 1
            DelayNS(10);
        }
    }  
    while(1);
    return(0);
}

麻烦周工及各位大侠帮下忙,谢谢!

相关帖子

沙发
xkleee|  楼主 | 2007-8-5 15:49 | 只看该作者

接上

跳线设置无误,好像可以擦除,但写入数据后再读出来为FFFF

使用特权

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

本版积分规则

18

主题

62

帖子

0

粉丝