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

📄 flash(39vf160).c

📁 用C语言写的FLASH(39VF160)程序,用在TMSVC33上的片外存储用!经过验证,且已经用于产品!
💻 C
字号:
/*************************************************************************
 *                                                                       *
 * File name                                            Version          *
 *                                                        1.0            *
 *      Flash.c                                                          *
 *                                                                       *
 * Description                                                           *
 *                                                                       *
 *      This file contain the program used to operate on Flashrom        *
 *  (32 bits wide SST std's 39VF160).                                    *
 *                                                                       *
 * History                                                               *
 *                                                                       *
 *         Name            Date                    Remarks               *
 *                                                                       *
 *                        03-30-2003      Created initial version 1.0    *
 *                        04-30-2005      Created initial version 2.0    *
 *                                                                       *
 *                                                                       *
 *       Copyright (c) 1992-2009 CTI & YDHQ                              *
 *************************************************************************/
#undef _INLINE 
#include <flash.h>

#define DELAY_TIME 2
extern cregister unsigned int IE,IF,IOF,ST;

void sleep(int n )
{
	volatile int m;
	for(m=0;m<n;m++)
	{
		nop();
	}
}

/************************************************************************/
/* PROCEDURE:   Check_Data_Polling                                      */
/*                                                                      */
/* During the internal program cycle, any attempt to read DQ7 of the    */
/* last byte loaded during the page/byte-load cycle will receive the    */
/* complement of the true data.  Once the program cycle is completed,   */
/* DQ7 will show true data.                                             */
/*                                                                      */
/* Input:                                                               */
/*           Dst        must already be set-up by the caller            */
/*           True       Data is the original (true) data                */
/*                                                                      */
/* Output:                                                              */
/*           None                                                       */
/************************************************************************/

static int compare_data(int *flash_addr,int idata)
{
	volatile int c,odata,waiting = 0;
	idata &= 0x00800080;
	do 
	{
		waiting += 1;
		c = *flash_addr;
		odata = c&0x00800080;
		if(odata==idata) break;
	} while(waiting<1000);

}

void flash_ram_int_writer(int *flash_ram_addr,int *data,int cnt)
{
	int i;
	int c,odata,idata;
	for(i=0;i<cnt;) 
	{
		idata = data[i];
		*FLASH_ADDR_555	= 0X00AA00AA;
		sleep(DELAY_TIME);
		*FLASH_ADDR_2AA	= 0X00550055;
		sleep(DELAY_TIME);
		*FLASH_ADDR_555	= 0X00A000A0;
		sleep(DELAY_TIME);
		flash_ram_addr[i]= idata;
		sleep(DELAY_TIME);
		compare_data(&flash_ram_addr[i],idata);
		i += 1;
	}
	sleep(DELAY_TIME);
	*FLASH_ADDR_555	= 0X00AA00AA;
	sleep(DELAY_TIME);
	*FLASH_ADDR_2AA	= 0X00550055;
	sleep(DELAY_TIME);
	*FLASH_ADDR_555	= 0X00F000F0;
	sleep(DELAY_TIME);
}

/*A section is 2KWord*/
void flash_section_erase(int *seg_addr)
{
	volatile int odata;
	
	*FLASH_ADDR_555	= 0X00AA00AA;
	sleep(DELAY_TIME);
	*FLASH_ADDR_2AA	= 0X00550055;
	sleep(DELAY_TIME);
	*FLASH_ADDR_555	= 0X00800080;
	sleep(DELAY_TIME);
	*FLASH_ADDR_555	= 0X00AA00AA;
	sleep(DELAY_TIME);
	*FLASH_ADDR_2AA	= 0X00550055;
	sleep(DELAY_TIME);
	*seg_addr       = 0X00300030;
	for(odata=0; odata<1000; odata+=1) sleep(1500);
}
/*A section is 2KWord*/

void flash_chip_erase(void)
{
	volatile int *chip_addr = (volatile int*)0, odata;
	*FLASH_ADDR_555	= 0X00AA00AA;
	sleep(DELAY_TIME);
	*FLASH_ADDR_2AA	= 0X00550055;
	sleep(DELAY_TIME);
	*FLASH_ADDR_555	= 0X00800080;
	sleep(DELAY_TIME);
	*FLASH_ADDR_555	= 0X00AA00AA;
	sleep(DELAY_TIME);
	*FLASH_ADDR_2AA	= 0X00550055;
	sleep(DELAY_TIME);
	*FLASH_ADDR_555   = 0X00100010;
	for(odata=0; odata<4000; odata+=1) sleep(1500);
}


int ram_to_flash(int *flashAddr,int *ramAddr, int wCnt)
{
	volatile int xcount,n;
	ST &= 0xffffdfff;
	xcount = wCnt/2048;
	if(xcount==0)                 
	{
		flash_section_erase(flashAddr);
	}
	else if(xcount>=1)
	{
		if((wCnt%2048)!=0) xcount += 1;
		for(n=0;n<xcount;n+=1) flash_section_erase(flashAddr+n*2048);
	}
	flash_ram_int_writer(flashAddr,ramAddr,wCnt);
	ST |= 0x00002000;
}

⌨️ 快捷键说明

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