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

📄 flash.c

📁 此程序实现采用基于TMS320C6201 DSP的图像采集程序
💻 C
字号:
/*******************************************************************/
/*定义CHIP_6201,声明采用TMS320C6201 DSP芯片*/
/*程序宏定义,定义AM29LV040映射的首地址FLASH_ADDRS.数据存放的地址INT_MEM*/
/*编程字节的长度LENGTH*/
/*函数返回值定义 TRUE、FALSE*/
/*******************************************************************/
#define CHIP_6201
#define CE1_ADDRS	0x01400000   //CE1 
#define INT_MEM		0x80000000
#define CE1_CNTRL	0x01800004
#define FLASH_ADDRS CE1_ADDRS
#define SRC_ADDRS	INT_MEM
#define LENGTH		0x400
#define TRUE		1
#define FALSE		0


/*******************************************************************/
/*包含头文件csl.h,csl_emif.h*/
/*利用TI Code Composer Studio的芯片支持库(chip support library)编程*/
/*该子程序中主要用在对EMIF外设初始化方面*/
/*******************************************************************/
#include <csl.h>
#include <csl_emif.h>


/*******************************************************************/
/*功能:配置EMIF外设*/
/*		AM29LV040映射到系统的CE1空间,16 bits 异步存储设备接口*/
/*		存储器类型: 16-bit 异步存储设备*/
/* 		Read Setup/Strobe/Hold = 1/17/3 */
/* 		Write Setup/Strobe/Hold = 2/11/3 */
/*******************************************************************/
void emif_config()
{
	/* EMIF全局控制寄存器,EMIF_GBLCTL_RMK结构定义见头文件csl_emif.h */
	Uint32 global_ctl = EMIF_GBLCTL_RMK(
		EMIF_GBLCTL_NOHOLD_0,
		EMIF_GBLCTL_SDCEN_DISABLE,
		EMIF_GBLCTL_SSCEN_DISABLE,
		EMIF_GBLCTL_CLK1EN_ENABLE,
		EMIF_GBLCTL_CLK2EN_DISABLE,
		EMIF_GBLCTL_SSCRT_CPUOVR2,
		EMIF_GBLCTL_RBTR8_HPRI);
	
	/* EMIF CECTL1控制寄存器,EMIF_GBLCTL_RMK结构定义见头文件csl_emif.h */
	Uint32 ce1_control = EMIF_CECTL_RMK(
		EMIF_CECTL_WRSETUP_OF(2),
		EMIF_CECTL_WRSTRB_OF(11),
		EMIF_CECTL_WRHLD_OF(3),
		EMIF_CECTL_RDSETUP_OF(1),
		EMIF_CECTL_RDSTRB_OF(17),
		EMIF_CECTL_MTYPE_ASYNC32,
		EMIF_CECTL_RDHLD_OF(3) );

/*配置EMIF各个寄存器,该宏定义见 csl_emif.h*/
	EMIF_configArgs(
		EMIF_GBLCTL_OF(global_ctl), /* global control */
		EMIF_CECTL_OF(0x00000018), /* CE0 control */
		EMIF_CECTL_OF(ce1_control), /* 16-bit async mem */
		EMIF_CECTL_OF(0x00000018), /* CE2 control */
		EMIF_CECTL_OF(0x00000018), /* CE3 control */
		EMIF_SDCTL_OF(0x0388F000), /* SDRAM control */
		EMIF_SDTIM_OF(0x00800040) /* SDRAM timing */
	);
}


/*******************************************************************/
/*功能:把连续增加的数字写入指定的存储地址*/
/*输入:source_ptr   指定缓冲区的地址*/
/*		code_ptr    缓冲区的长度 */
/*******************************************************************/
void load_source(unsigned char * source_ptr, int length)
{
	int i;
	for (i = 0; i < length; i ++)
	{
		* source_ptr++ = i;
	}
}


/*******************************************************************/
/*功能:擦除AM29LV040所有存储空间,擦除后的整个memory空间全是0xFF */
/*输入:flash_ptr  FLASH芯片映射的首地址	*/
/*返回: pass    0   擦除失败 */
/*				 1	 擦除成功 */
/*******************************************************************/
int erase_flash(int * flash_ptr)
{
	/*由于AM29LV040地址线A[17..0]连接到TMS320C6201地址线EA[21..2],*/
	/*所以数据地址需要左移2位*/
	/* unsigned char << 2 == Word */
	int * ctrl_addr1 = (int *) ((int)flash_ptr + (0x555 << 2));
	int * ctrl_addr2 = (int *) ((int)flash_ptr + (0x2aa << 2));
	int pass = TRUE;

/*按照擦除操作流程要求的命令字依次写入命令字*/
	* ctrl_addr1 = 0xaa;	
	* ctrl_addr2 = 0x55; 
	* ctrl_addr1 = 0x80;
	* ctrl_addr1 = 0xaa;
	* ctrl_addr2 = 0x55;
	* ctrl_addr1 = 0x10;

	/*轮询检测擦除操作是否正确*/
	pass = poll_data(flash_ptr, (unsigned char) 0xff);
	if (!pass)
		printf("failed erase\n\n");
	return pass;
}


/*******************************************************************/
/*功能:AM29LV040 字节编程*/
/*输入:flash_ptr  FLASH映射的首地址*/
/*		code_ptr   需要编程的字节数据存放首地址*/
/*返回值:pass  0  字节编程失败 */
/*				1  字节编程成功 */
/*******************************************************************/
int program_flash(unsigned char * source_ptr, int * flash_ptr, int length)
{
	int i;
	unsigned char data;
	int pass;

	/*由于AM29LV040地址线A[17..0]连接到TMS320C6201地址线EA[21..2],*/
/*所以数据地址需要左移2位*/
	/* unsigned char << 2 == Word */
	int * ctrl_addr1 = (int *) ((int)flash_ptr + (0x555 << 2));
	int * ctrl_addr2 = (int *) ((int)flash_ptr + (0x2aa << 2));;
	for (i = 0; i < length; i++)
	{
		/*按照字节编程操作流程要求的命令字依次写入命令字*/
		* ctrl_addr1 = 0x00aa;
		* ctrl_addr2 = 0x0055;
		* ctrl_addr1 = 0x00a0;
		* flash_ptr++ = data = * source_ptr++;
		/*轮询检测擦除操作是否正确*/	
	pass = poll_data(flash_ptr-1, data);
	}
	if (!pass)
	  printf("Failed at address %x \n\n", (int) flash_ptr);
	return pass;
}


/*******************************************************************/
/*功能: 轮询检测编程和擦除算法是否成功。*/
/*		子程序循环,直到操作完全成功或失败就终止	*/
/* 输入:prog_ptr 	编程和擦除操作的地址*/
/* 		 prog_data  写入FLASH的数据 */
/* 返回: FALSE  操作失败 */
/*        TRUE  操作成功 */
/*******************************************************************/
int poll_data(int * prog_ptr, unsigned char prog_data)
{
	unsigned char data;
	int fail = FALSE;
	do 
{
		data = (unsigned char) * prog_ptr;
		if (data != prog_data) /* is D7 != Data? */
		{
			if ((data & 0x20) == 0x20) /*is D5 = 1 ? */
			{
				data = (unsigned char) * prog_ptr;
				if (data != prog_data) /* is D7 = Data? */
				fail = TRUE;
				else
				return TRUE; /* PASS */
			}
		}
		else
			return TRUE; /* PASS */
	}while (!fail);
	return FALSE; /* FAIL */
}

⌨️ 快捷键说明

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