这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » am29lv160dt,flash 高手请看一下程序,am29lv160dt f

共2条 1/1 1 跳转至

am29lv160dt,flash 高手请看一下程序,am29lv160dt flash 擦除

院士
2006-09-17 18:14:16     打赏
am29lv160dt,flash 高手请看一下程序,am29lv160dt flash 擦除



关键词: am29lv160dt     flash     高手     看一下         

院士
2006-12-22 22:43:00     打赏
2楼
am29lv160dt flash 擦除某一sector时怎么全片都擦除了
这是下面的代码,请高手看看有没有写错。

void flash_erase(P_U16 base_addr){
    
    
    P_U16 Temp;
    U32 i=35000000;
    
         /*  Issue the Sector Erase command to am29lv160dt  */

         Temp  = (P_U16)((0x0000555<<1)+FLASH_ADDRESS);                 *Temp = 0xAA;                 
         Temp  = (P_U16)((0x00002AA<<1)+FLASH_ADDRESS);                 *Temp = 0x55;                
         Temp  = (P_U16)((0x0000555<<1)+FLASH_ADDRESS);         
          *Temp = 0x80;                 
         Temp  = (P_U16)((0x0000555<<1)+FLASH_ADDRESS);
          *Temp = 0xAA;                
         Temp  = (P_U16)((0x00002AA<<1)+FLASH_ADDRESS);
          *Temp = 0x55;                
         Temp  = base_addr;                     
         *Temp = 0x30;                 
         while(i--);//Delay
} 1: 我也用160,读写都正常#define FLASH_CODE1        0x00AA00aa
#define FLASH_CODE2        0x00550055
#define ID_IN_CODE        0x00900090
#define ID_OUT_CODE        0x00F000f0


#define CMD_READ_ARRAY        0x00F0
#define CMD_UNLOCK1            0x00AA
#define CMD_UNLOCK2            0x0055
#define CMD_ERASE_SETUP        0x0080
#define CMD_ERASE_CONFIRM    0x0030
#define CMD_PROGRAM            0x00A0
#define CMD_UNLOCK_BYPASS    0x00200020

#define MEM_FLASH_ADDR1        (*(volatile short *)(0x10000000 + (0x0000555<<1)))
#define MEM_FLASH_ADDR2        (*(volatile short *)(0x10000000 + (0x00002AA<<1)))

#define IDENT_FLASH_ADDR1    (*(volatile int *)(0x10000000 + (0x0000555<<2)))
#define IDENT_FLASH_ADDR2    (*(volatile int *)(0x10000000 + (0x0000AAA<<2)))

#define BIT_ERASE_DONE        0x008

/* start erase operation */
    MEM_FLASH_ADDR1 = CMD_UNLOCK1;
    MEM_FLASH_ADDR2 = CMD_UNLOCK2;
    MEM_FLASH_ADDR1 = CMD_ERASE_SETUP;

    MEM_FLASH_ADDR1 = CMD_UNLOCK1;
    MEM_FLASH_ADDR2 = CMD_UNLOCK2;
    
    addr = (short*)gFlashInfo.sector_base[sector_number]; /* 提供擦除扇区的基地址 */
    *addr = CMD_ERASE_CONFIRM;
    

    chip1 = 0;
    rt0 = *AT91C_ST_CRTR;
    rt0 = *AT91C_ST_CRTR;    
    
    do
    {
        result = *addr;
        
        rt1 = *AT91C_ST_CRTR;
        rt1 = *AT91C_ST_CRTR;
        if ( rt1 - rt0 > 5 ) // 5秒超时
        {
            MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
            chip1 = -1;
            break;
        }
        
        if (!chip1 && (result & 0xFFFF) & BIT_ERASE_DONE)
        {
            chip1 = 1;
        }
    }
    while (!chip1);
    
    MEM_FLASH_ADDR1 = CMD_READ_ARRAY;

不知道对你有帮助没有 2: 现在程序可以了,但很怪发现一点点怪问题:
我的CPU是lpc2220的,程序就是在am29lv160dt中运行的,用烧写工具将程序烧到FLASH中是可以真常运行的,关键是我的程序应用过程中要记录一些数据在FLASH中,所以我要擦除FLASH中有某一块然后写数据进去.因此,我将擦除,写,程序copy到SRAM中运行,但就是有一个怪问题就是当用jatg口写完程序用jatg口复位启动系统时,擦除某一sector时却全片都擦除了,但是如果我不用jatg口复位而是直接关电源再上电,则一切正常。怪,不明。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]