⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f29lv160.c

📁 44b0读写FLASH的代码
💻 C
字号:
#include "44b.h"
#include "typDef.h"

#define FLASH_START_ADDR          0x0000000
#define FLASH_CHIP_HWORD_SIZE     0x100000              //This flash has 1M Hwords
#define FLASH_SECTOR_HWORD_SIZE   0x8000                //The size of each sector of this flash is 32k hwords (1hword = 2 bytes)

#define FLASH_ADDR_UNLOCK1        0x0555
#define FLASH_ADDR_UNLOCK2        0x02aa
#define FLASH_DATA_UNLOCK1        0xaaaa
#define FLASH_DATA_UNLOCK2        0x5555
#define FLASH_SETUP_WRITE         0xa0a0
#define FLASH_SETUP_ERASE         0x8080
#define FLASH_CHIP_ERASE          0x1010
#define FLASH_SECTOR_ERASE        0x3030


STATUS  flashOpOverDetect(UINT16 *ptr,  UINT16 trueData, ULONG timeCounter)
{
    ULONG timeTmp = timeCounter;
    volatile UINT16 *pFlash = ptr;
    UINT16 buf1, buf2,curTrueData;
	
    curTrueData = trueData & 0x8080;                  
    while((*pFlash & 0x8080) != curTrueData) {
        if(timeTmp-- == 0) break;
    }
	
    timeTmp = timeCounter;
    buf1 = *pFlash & 0x4040;			
    while(1) {
        buf2  = *pFlash & 0x4040;
        if(buf1 == buf2) 
            break;
        else
            buf1 = buf2;
      
        if(timeTmp-- == 0) 
            return ERROR;
	
    }
    
    return OK;
}


void delay(void)
{
    UINT32 i, temp;
    for (i = 0; i < 1000; i++) {
        temp = i;
    }
}

UINT16 *flashWrite(UINT16 *flashAddr, UINT8 *buffer, ULONG length)
{
    ULONG i, cLength;
    volatile UINT16 *flashPtr;
    volatile UINT16 *gBuffer;
	
    flashPtr = flashAddr;
    cLength = (length + 1)/2;			
    gBuffer = (UINT16 *)buffer;      
	
    while (cLength > 0) {
        *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;    
        *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
        *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_SETUP_WRITE;
        *flashPtr = *gBuffer;                                                   
//        delay();		
        if(flashOpOverDetect((UINT16 *)flashPtr, *gBuffer, 0x2000000)) {
            while(1);  
            //Uart_Printf(0,"warning: write flash may failed at:0x%x.\n", (int)flashPtr);
        }
        cLength--;
        flashPtr++;
        gBuffer++;
    }	
	
    flashPtr = flashAddr;
    gBuffer = (UINT16 *)buffer; 
    cLength = length/2;
    for(i=0; i<cLength; i++) {
        if(*flashPtr++ != *gBuffer++) {    
            //Uart_Printf(0,"Error: write failed in FLASH39vf160 at 0x%x on verification.\n", (int)flashPtr);
            while(1);
	   return NULL;
        }
    }
    
    if(length%2) {
        if((*flashPtr++ & 0x00ff) != (*gBuffer++ & 0x00ff)) {
            //Uart_Printf(0,"Error: write failed in FLASH39vf160 at 0x%x on verification.\n", (int)flashPtr);
            while(1);
            return NULL;	    
        }
    }
    
    return (UINT16 *)flashPtr;
}


STATUS flashChipErase(void)
{
    int i;
    volatile UINT16 *flashPtr = NULL;
    
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;			
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_SETUP_ERASE;
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_CHIP_ERASE;			

    flashPtr = (volatile UINT16 *)FLASH_START_ADDR;			  

    if(flashOpOverDetect((UINT16 *)flashPtr, 0xffff, 0x3000000) != OK) {
        //Uart_Printf(0,"warning: Chip Erase time out!\n");	
    }	
	
    flashPtr = (volatile UINT16 *)FLASH_START_ADDR;			  
    for(i=0; i<FLASH_CHIP_HWORD_SIZE; i++,flashPtr++) {
        if(*flashPtr != 0xffff) {
            //Uart_Printf(0,"Debug: Erase failed at 0x%x in FLASH39VF160 on verification.\n", (int)flashPtr);
            while(1);
            return ERROR;
        }
    }
	
    return OK;
}    


STATUS flashSectorErase(UINT16 *pSector)
{
    int i;
    volatile UINT16 *flashPtr = pSector;
    
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;			
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_SETUP_ERASE;
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK1) = FLASH_DATA_UNLOCK1;
    *((volatile UINT16 *)FLASH_START_ADDR + FLASH_ADDR_UNLOCK2) = FLASH_DATA_UNLOCK2;
    *(volatile UINT16 *)flashPtr = FLASH_SECTOR_ERASE;		

    if(flashOpOverDetect((UINT16 *)flashPtr, 0xffff, 0x20000) != OK) {
        //Uart_Printf(0,"warning: Sector Erase time out!\n");	
        while(1);
    }	
	
    for(i=0; i<FLASH_SECTOR_HWORD_SIZE; i++,flashPtr++) {
        if(*flashPtr != 0xffff) {
            //Uart_Printf(0,"Debug: Erase failed at 0x%x in FLASH39VF160 on verification.\n", (int)flashPtr);
            while(1);
	   return ERROR;
        }
    }

    return OK;
}    




void Port_Init(void)
{    //CAUTION:Follow the configuration order for setting the ports. 
    // 1) setting value 
    // 2) setting control register 
    // 3) configure pull-up resistor.  

    //PORT A GROUP
    //GPA9 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0		      
    //  0,    1,     1,    1,     1,     1,     1,      1,     1,    1
    rPCONA=0x1ff;	
    rPDATA=0x0;
    //PORT B GROUP
    //GPB10  GPB9 nGCS3 nGCS2 nGCS1 GPB5 GPB4 nSRAS nSCAS SCLK SCKE
    //  0,    0,    1,	1,    1,    0,    0,	1,    1,   1,   1	
    rPCONB=0x1Cf;
    
    //PORT C GROUP
    //IISLRCK  IISD0 IISDI IISCLK VD7 VD6 VD5 VD4 nXDACK1 nXDREQ1 GPC10 GPC11 TXD1 RXD1 GPC14 GPC15
    //All input
    //  11      11    11    11    11  11   11  11   11      11     01	01     11   11   01    01
    rPDATC=0x8400;
   // rPCONC=0x5F5FFFFF;	
    rPCONC=0xfffaffff;

    rPUPC=0x33ff;	//should be enabled	
   
    //PORT D GROUP
    //VFRAME VM VLINE VCLK VD3 VD2 VD1 VD0
    //    10,10,   10,	10, 10,	10, 10,	10  
    rPCOND=0xaaaa;	
    rPUPD=0xff;

    //PORT E GROUP
    //PE0:FOUT, PE1:TxD0, PE2:RxD0, GPE3, GPE4, GPE5,GPE6,GPE7, CODECLK   
    //	    10       10,      10,    01  , 01,   01,  01,  01,   10
//    rPCONE=0x2552A;	
    rPCONE=0x255a8;	

    rPUPE=0xff;	
    rPDATE=0X68;

    //PORT F GROUP
    //IICSCL IICSDA  nWAIT nXBACK0 nXDREQ0 GPF5 GPF6 GPF7 GPF8 
    //  10     10      10    10      10     0    0    0    0
   // rPCONF=0x2A;
    rPCONF=0x3ea;

    rPUPF=0xff;

    //PORT G GROUP
    //EINT0 EINT1 EINT2 EINT3 GPG4 GPG5 GPG6 GPG7
    //	  0x0
    //  11      11   11     11   01   01   01   01
    rPDATG=0x0;
//    rPCONG=0x55FF;
    rPCONG=0x557f; 
    rPUPG=0xf;
    
    rSPUCR=0x7;  //pull-up disable
    rEXTINT=0x22222022;  //All EINT[7:0] will be falling edge triggered.
}

void Main(void)
{
    UINT8* tonybuf = (UINT8*)(0xc200000);
    //Port_Init();
    flashChipErase();
    flashWrite(0x0, tonybuf, 128*1024);
}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -