📄 flash.c
字号:
/*****************************************************************************
FILENAME: FLASH.C
DESIGNER: 戴展波
DATE: 2004/09/25
******************************************************************************/
#include <stdio.h>
#include <csl.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_emifb.h>
#include <csl_irq.h>
#include "flash.h"
static EMIFB_Config MyEmifbConfig =
{
EMIFB_GBLCTL_RMK
(
EMIFB_GBLCTL_EK2RATE_FULLCLK, //1 X EMIF input clock
EMIFB_GBLCTL_EK2HZ_CLK, //eclkout2 continue output during hold
EMIFB_GBLCTL_EK2EN_ENABLE, //eclkout2 enable output
EMIFB_GBLCTL_BRMODE_MRSTATUS, //bus request is memory access or refresh pending/in progress
EMIFB_GBLCTL_NOHOLD_ENABLE,
EMIFB_GBLCTL_EK1HZ_CLK, //eclkout1 continue output during hold
EMIFB_GBLCTL_EK1EN_ENABLE //eclkout1 enable output
),
0x22a28a22,
0xffffff1f,
// 0x20a0c412,
0x22a28a22,
0x22a28a22,
EMIFB_SDCTL_DEFAULT,
EMIFB_SDTIM_DEFAULT,
EMIFB_SDEXT_DEFAULT,
0x00000002,
0x00000002,
0x00000002,
0x00000002
};
unsigned short data[0x1000];
Uint32 k;
extern far void vectors();
void main()
{
//初始化CSL
CSL_init();
//配置EMIFA
EMIFB_config(&MyEmifbConfig);
//设置中断矢量表地址
IRQ_setVecs(vectors);
//NMI使能
IRQ_nmiEnable();
//开总中断
IRQ_globalEnable();
//整片擦除
flash_erase(0,0x10);
//在地址0x64001000处写0x1234
//flash_writes(0x64001000,0x1234);
for(k = 0; k < 0x1000; k++)
{
data[k] = 0x1234+k;
}
//从0x64000000地址开始,写入长度为0x1000的数据DATA
flash_writem(0x64000000,&data[0],0x1000);
//从0x64000000地址开始,读出长度为0x1000的数据到DATA
flash_readm(0x64000000,&data[0],0x1000);
for(;;);
}
Uint32 flash_erase(Uint32 addr,unsigned short type)
{
Uint32 i,j;
*FLASH_5555 = FLASH_UL1; //first
*FLASH_2AAA = FLASH_UL2; //second
*FLASH_5555 = FLASH_UL3; //third
*FLASH_5555 = FLASH_UL4;
*FLASH_2AAA = FLASH_UL5;
switch(type)
{
case 0x50: //block erase
*(unsigned short *)addr = type;
while((*(unsigned short *)addr & 0x80) != 0x80);
for(i = 0; i < BLOCK_SIZE; i++)
{
if(*(unsigned short *)(addr + i) != 0xffff)
{
j = 0;
break;
}
}
j = 1;
break;
case 0x30: //sector erase
*(unsigned short *)addr = type;
while((*(unsigned short *)addr & 0x80) != 0x80);
for(i = 0; i < SECTOR_SIZE; i++)
{
if(*(unsigned short *)(addr + i) != 0xffff)
{
j = 0;
break;
}
}
j = 1;
break;
case 0x10: //chip erase
*FLASH_5555 = type;
while((*FLASH_5555 & 0x80) != 0x80);
for(i = 0; i < CHIP_SIZE; i++)
{
if(*(unsigned short *)(addr + i) != 0xffff)
{
j = 0;
break;
}
}
j = 1;
break;
default:
break;
}
return (j);
}
void flash_writes(Uint32 addr,unsigned short data)
{
*FLASH_5555 = FLASH_UL1;
*FLASH_2AAA = FLASH_UL2;
*FLASH_5555 = FLASH_PROGRAM;
*(unsigned short *)addr = data;
while(*(unsigned short *)addr != data);
}
void flash_writem(Uint32 addr,unsigned short *ptr,unsigned int length)
{
Uint32 i;
for(i = 0; i < length; i++)
{
flash_writes(addr+2*i,*(ptr+i));
//for(k = 0; k < 0xfff; k++);
}
}
Uint32 flash_reads(Uint32 addr)
{
return (*(unsigned short *)addr);
}
void flash_readm(Uint32 addr,unsigned short *ptr,unsigned int length)
{
Uint32 i;
for(i = 0; i < length; i++)
{
*(ptr + i) = flash_reads(addr+2*i);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -