| 
  |||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
高手請看一下程序,am29lv160dt flash 擦除 | 
  
| 作者:woaini 欄目:ARM技術 | 
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 }  | 
  
| 2樓: | >>參與討論 | 
| 作者: diablocm 于 2005/12/15 22:53:00 發(fā)布:
         我也用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]; /* 提供擦除扇區(qū)的基地址 */ *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; 不知道對你有幫助沒有  | 
  |
| 3樓: | >>參與討論 | 
| 作者: woaini 于 2005/12/16 21:55:00 發(fā)布:
         現(xiàn)在程序可以了,但很怪 發(fā)現(xiàn)一點點怪問題: 我的CPU是LPC2220的,程序就是在AM29LV160DT中運行的,用燒寫工具將程序燒到FLASH中是可以真常運行的,關鍵是我的程序應用過程中要記錄一些數(shù)據(jù)在FLASH中,所以我要擦除FLASH中有某一塊然后寫數(shù)據(jù)進去.因此,我將擦除,寫,程序copy到SRAM中運行,但就是有一個怪問題就是當用jatg口寫完程序用jatg口復位啟動系統(tǒng)時,擦除某一sector時卻全片都擦除了,但是如果我不用jatg口復位而是直接關電源再上電,則一切正常。怪,不明。  | 
  |
  | 
    
 
  | 
  
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號  |