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

📄 flashu.c

📁 C6713对Flash 的烧写例程
💻 C
字号:
#include<stdio.h>
/*global change para */
#define FLASH_BASE_ADDR  0x90000000    /*Flash address is start */
#define FLASH_ORDER      4             /*1:address  at 8-Bit mode;2:address at 16-Bit mode; 4: address at 32-Bit mode*/ 
#define  FLASH_CMD_ADDRESS_1  0x5555
#define  FLASH_CMD_ADDRESS_2  0x2aaa
#define FLASH_CMD_1    *(volatile unsigned char *)(FLASH_BASE_ADDR+FLASH_CMD_ADDRESS_1*FLASH_ORDER)
#define FLASH_CMD_2    *(volatile unsigned char *)(FLASH_BASE_ADDR+FLASH_CMD_ADDRESS_2*FLASH_ORDER)


#define EMIF_GCTL       0x01800000
#define EMIF_CE1        0x01800004
#define EMIF_CE0        0x01800008
#define EMIF_CE2        0x01800010
#define EMIF_CE3        0x01800014
#define EMIF_SDRAMCTL   0x01800018
#define EMIF_SDRAMTIM   0x0180001C
#define EMIF_SDRAMEXT   0x01800020
#define EMIF_CCFG       0x01840000;

unsigned char ReadID(void);
void WriteByte(unsigned int ,unsigned char );
void Writeword(unsigned int ,unsigned short );
void EraseChip(void);
void WriteIsOver(void);
void init_emif( void );
main()
{
    unsigned short j=0;
    int i=0;
    init_emif();
    j=*(unsigned short *)(0x90000000);
    j=*(unsigned short *)(0x90000000+4);
    i= ReadID();
    EraseChip();
       
	*(unsigned char *)0xb020003c=0;//turn off
	   
    for(i=0;i<0x2d000;i++,i++)
    {
      	j=*(unsigned short *) i;
      	Writeword(0x90000000+i*2,j);    
    }   
  	
  	*(unsigned char *)0xb020003c=7;//turn on
/*  printf("Flash chip ID is %d\n",i);
    printf("what are you doing?\n1:Erase\n2:program only\n3:erase and reprogram\n");       
    scanf("%d",&done);
    switch( done )
    {
       case 1:
          EraseChip();
          puts("Erase is OK\n");
          break;
       case 2:
          puts("Program is OK\n");
          break;
       case 3:  
          EraseChip();
          puts("Erase and reprogram is OK\n"); 
          break;    
    }*/
}

unsigned char ReadID(void)
{
  unsigned char flash_state;
  FLASH_CMD_1=0xaa;
  FLASH_CMD_2=0x55;
  FLASH_CMD_1=0x90; 
  flash_state =*(volatile unsigned char *)(FLASH_BASE_ADDR);
  FLASH_CMD_1=0xf0;
  return flash_state;  
}
void EraseChip(void)
{
	FLASH_CMD_1 = 0xaa;
	FLASH_CMD_2 = 0x55;
	FLASH_CMD_1 = 0x80;
	FLASH_CMD_1 = 0xaa;
	FLASH_CMD_2 = 0x55;
	FLASH_CMD_1 = 0x10;
	
	WriteIsOver();
}
void WriteIsOver(void)
{
	unsigned int i;
	unsigned char LastToggleBit,CurrentToggleBit;
	LastToggleBit = (*(volatile unsigned char*)FLASH_BASE_ADDR) & 0x40;
	CurrentToggleBit = (*(volatile unsigned char*)FLASH_BASE_ADDR) & 0x40;
	for(i = 0; ; i++)
	{
		LastToggleBit = CurrentToggleBit;
		CurrentToggleBit = (*(volatile unsigned char*)FLASH_BASE_ADDR) & 0x40;
		if(LastToggleBit == CurrentToggleBit) break;
	}
}
void init_emif( void )
{
	*(int *)EMIF_GCTL     = 0x00000078;
	*(int *)EMIF_CE0      = 0xffffbf23;  /* CE0 SDRAM                     */
	*(int *)EMIF_CE1      = 0xffffff23;  /* CE1 Flash 8-bit               */
	*(int *)EMIF_CE2      = 0xffffff23;  /* CE2 Daughtercard 32-bit async */
	*(int *)EMIF_CE3      = 0xffffff23;  /* CE3 Daughtercard 32-bit async */
	*(int *)EMIF_SDRAMCTL = 0x53115000;  /* SDRAM control                 */
	*(int *)EMIF_SDRAMTIM = 0x00000578;  /* SDRAM timing (refresh)        */
	*(int *)EMIF_SDRAMEXT = 0x000a8529;  /* SDRAM Extension register      */
}
void Writeword(unsigned int Addr,unsigned short  Val)
{
    unsigned short k;
	/*
	*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555*2) = 0xaa;
	*(volatile unsigned char*)(FlashMap1BaseAddr + 0x2aa*2) = 0x55;
	*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555*2) = 0xa0;
	*(volatile unsigned char*)(FlashMap1BaseAddr + Addr) = Val;
	*/
	FLASH_CMD_1=0xaa;
	FLASH_CMD_2=0x55;
	FLASH_CMD_1=0xa0;
	*(int *)Addr=Val;
	WriteIsOver();
	k=*(int *)Addr;
	while(k!=Val)
  { FLASH_CMD_1=0xaa;
	FLASH_CMD_2=0x55;
	FLASH_CMD_1=0xa0;
	*(int *)Addr=Val;
   }	
}
void WriteByte(unsigned int Addr,unsigned char Val)
{

	/*
	*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555*2) = 0xaa;
	*(volatile unsigned char*)(FlashMap1BaseAddr + 0x2aa*2) = 0x55;
	*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555*2) = 0xa0;
	*(volatile unsigned char*)(FlashMap1BaseAddr + Addr) = Val;
	*/
	FLASH_CMD_1=0xaa;
	FLASH_CMD_2=0x55;
	FLASH_CMD_1=0xa0;
	*(int *)Addr=Val;
	WriteIsOver();
}

⌨️ 快捷键说明

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