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

📄 flash.c

📁 基于TI 6416DSP的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 + -