📄 flash_16x4.c
字号:
//*----------------------------------------------------------------------------//* File Name : flash_16x4.c//* Object : FLASH programmer for ://* AT49BV8011/AT49BV8011T//* AT49BV1604/AT49BV1604T//* AT49BV1614/AT49BV1614T//*//* Exported Resources : AT91FlashIdentify//* AT91EraseSector//* at91_write_flash//* Imported Resources ://*//*//* 1.0 23/04/99 JPP : Creation//* 1.1 26/04/00 EL : Clean up//*----------------------------------------------------------------------------#include "dtm.h"#include "dtm_v3.h"#include "flash_16x4.h"#include "externdef.h"#include <stdio.h>static int AT91WaitFlashReady (flash_word *address, flash_word data );void AT91FlashIdentify ( flash_word *base_addr, flash_word *manuf_code,flash_word *device_code,flash_word *device_code_add);int AT91EraseSector (flash_word *base_addr, U32 sector_addr);int AT91WriteFlash ( flash_word *base_addr, flash_word *load_addr,flash_word data);int AT91WriteToFlash(flash_word *base_addr,flash_word *RamBaseAddr,U32 FlashSectorAddr,int Length);int AT91WriteMemoryBlockToFlash(void);//*----------------------------------------------------------------------------//* Function Name : AT91WaitFlashReady//* Object : check if data is written//* Input Parameters : Data and data address//* Output Parameters : TRUE or FALSE//* Functions called : none//*----------------------------------------------------------------------------static int AT91WaitFlashReady ( flash_word *address, flash_word data )//* Begin{ int count = 0 ; flash_word data1,data2; //* While two consecutive read don't give same value or timeout data1 = *address; data2 = *address; while ((data1 != data2) && ( count++ < TIME_OUT )) { data1 = *address; data2 = *address; } //* If timeout if ( count < TIME_OUT ) { //* Return True return ( TRUE ) ; } //* Return False return ( FALSE );//* End}//*----------------------------------------------------------------------------//* Function Name : AT91FlashIdentify//* Object : Read the flash manufactured code and//* Input Parameters : flash_word *load_addr = Flash bass address//* Output Parameters : divice code and manufactured code//* Functions called : none//*----------------------------------------------------------------------------void AT91FlashIdentify ( flash_word *base_addr, flash_word *manuf_code,flash_word *device_code,flash_word *device_code_add)//* Begin{ flash_word *address; address = base_addr; //* Enter Software Product Identification Mode address += FLASH_SEQ_ADD1; *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1; *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2; *(base_addr + FLASH_SEQ_ADD1) = ID_IN_CODE; //* Read Manufacturer and device code from the device address = base_addr; *manuf_code = *address ; address++; *device_code = *address; address++; *device_code_add = *address; //* Exit Software Product Identification Mode *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1; *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2; *(base_addr + FLASH_SEQ_ADD1) = ID_OUT_CODE;//* End}//*----------------------------------------------------------------------------//* Function Name : AT91EraseSector//* Object : erase sector//* Input Parameters : Data and data address//* Output Parameters : TRUE or FALSE//* Functions called : AT91WaitFlashReady//*----------------------------------------------------------------------------int AT91EraseSector (flash_word *base_addr, U32 sector_addr)//* Begin{ flash_word *address; address = base_addr ; address += sector_addr/2; //* Enter Sector Erase Sequence codes *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1; *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2; *(base_addr + FLASH_SEQ_ADD1) = ERASE_SECTOR_CODE1; *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1; *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2; *address = ERASE_SECTOR_CODE2 ; //* Wait for Flash Ready after Erase, if timeout if ( AT91WaitFlashReady ( address, (flash_word)0xFFFF ) == FALSE ) { //* Display Timeout and return False return ( FALSE ) ; } //* set this sector erased //* Return True return ( TRUE ) ;//* End}//*----------------------------------------------------------------------------//* Function Name : at91_write_flash//* Object : write a word in flash//* Input Parameters : flash_word *base_addr : Flash base address//* flash_word *load_addr : Flash data address//* flash_word data : Data value//* Output Parameters : error code : FLASH_WRITE_TIME_OUT, FLASH_WRITE_ERROR//* or OK : FLASH_OK//* Functions called : AT91WaitFlashReady//*----------------------------------------------------------------------------int AT91WriteFlash (flash_word *base_addr, flash_word *load_addr,flash_word data ){ flash_word read_data ; //* Enter Programming code sequence *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1 ; *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2 ; *(base_addr + FLASH_SEQ_ADD1) = WRITE_CODE ; *load_addr = data ; //* Wait for Flash ready after erasing, if timeout if ( AT91WaitFlashReady (load_addr, data)!= TRUE ) { return ( FLASH_WRITE_TIME_OUT ) ; } //* If Data written does not equal data if (( read_data = *load_addr ) != data ) { //* Return False return ( FLASH_WRITE_ERROR ); } //* Return OK return ( FLASH_OK ) ;//* End}// 将RAM中从RamBaseAddress开始的Length字节写入Flash的FlashBaseAddress开始的地址中int AT91WriteToFlash(flash_word *base_addr,flash_word *RamBaseAddr,U32 FlashSectorAddr,int Length){ int i; flash_word data; flash_word *flashaddress,*ramaddress; flashaddress = base_addr + FlashSectorAddr/2; ramaddress = RamBaseAddr; // Erase sector if(AT91EraseSector(base_addr, FlashSectorAddr) != TRUE) ; //return (FLASH_ERASE_ERROR); // Write for (i = 0; i < Length/2; i++) { data = *ramaddress; if (AT91WriteFlash(base_addr, flashaddress, data) != FLASH_OK) return (FLASH_WRITE_ERROR); flashaddress++; ramaddress++; } // Verify flashaddress = base_addr + FlashSectorAddr/2; ramaddress = RamBaseAddr; for (i = 0; i < Length/2; i++) { if (*flashaddress != *ramaddress) return (FLASH_VERIFY_ERROR); flashaddress++; ramaddress++; } return (FLASH_OK);}// 写内存块的内容到AT91-Flash中int AT91WriteMemoryBlockToFlash(void){ int Length; int iRetCode; //flash_word * cpBuffer = (flash_word*)0x10000; flash_word manuf_code=0,device_code=0,device_code_add=0; AT91FlashIdentify ((flash_word*)FLASH_BASE, &manuf_code,&device_code,&device_code_add); Length = 8*1024; iRetCode =AT91WriteToFlash((flash_word*)FLASH_BASE,(flash_word*)0x10000,0x000000,Length); return(iRetCode);}//* End file
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -