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

📄 eeprom.c

📁 功能强大的拨号器
💻 C
字号:
#include"Mbtd.h"
#include".\EEPROM.h"
#include <intrins.h>

unsigned char protect_buffer[USED_BYTE_QTY_IN_ONE_SECTOR];


void ISP_IAP_enable(void)
{
	EA	=	0;	/* 关中断 */
	ISP_CONTR	=	ISP_CONTR & 0x18;       /* 0001,1000 */
	ISP_CONTR	=	ISP_CONTR | WAIT_TIME;
	ISP_CONTR	=	ISP_CONTR | 0x80;       /* 1000,0000 */
}

void ISP_IAP_disable(void)
{
	ISP_CONTR	=	ISP_CONTR & 0x7f;	/* 0111,1111 */
	ISP_TRIG	=	0x00;
	EA			=   1;                	/* 开中断 */
}


void write_flash_with_protect_in_one_sector(unsigned int begin_addr, unsigned int counter, unsigned char array[])
{
	unsigned int	i	=	0;
	unsigned int	in_sector_begin_addr	=	0;
	unsigned int	sector_addr	=	0;
	unsigned int	byte_addr	=	0;

	//enable internal extram
	//AUXR=0;

	/* 判是否是有效范围,此函数不允许跨扇区操作 */
//	if(counter > USED_BYTE_QTY_IN_ONE_SECTOR)
//		return ERROR;
	in_sector_begin_addr =        begin_addr & 0x01ff;         /* 0000,0001,1111,1111 */
	/* 假定从扇区的第0个字节开始,到USED_BYTE_QTY_IN_ONE_SECTOR-1个字节结束,后面部分不用,程序易编写	*/
//	if( (in_sector_begin_addr + counter) > USED_BYTE_QTY_IN_ONE_SECTOR )
//		return ERROR;

	/* 将该扇区数据 0 - (USED_BYTE_QTY_IN_ONE_SECTOR-1) 字节数据读入缓冲区保护 */
	sector_addr		=	(begin_addr & 0xfe00); 	/* 1111,1110,0000,0000; 取扇区地址		*/
	byte_addr		=   sector_addr;			/* 扇区地址为扇区首字节地址			 	*/

	ISP_IAP_enable();
	for(i = 0; i < USED_BYTE_QTY_IN_ONE_SECTOR; i++)
	{
		ISP_ADDRH	=	(unsigned char)(byte_addr >> 8);
		ISP_ADDRL	=	(unsigned char)(byte_addr & 0x00ff);

		ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
		ISP_CMD		=	ISP_CMD	|	READ_AP_and_Data_Memory_Command;	/* 0000,0001 */

		ISP_TRIG	=	0x46;
		ISP_TRIG	=	0xb9;
		_nop_();

		protect_buffer[i]	=	ISP_DATA;
		byte_addr++;
	}

	/* 将要写入的数据写入保护缓冲区的相应区域,其余部分保留 */
	for(i = 0; i < counter; i++)
	{
		protect_buffer[in_sector_begin_addr] = array[i];
		in_sector_begin_addr++;
	}

	/* 擦除 要修改/写入 的扇区 */
	ISP_ADDRH	=	(unsigned char)(sector_addr >> 8);
	ISP_ADDRL	=	0x00;
	ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
	ISP_CMD		=	ISP_CMD	|	SECTOR_ERASE_AP_and_Data_Memory_Command;	/* 0000,0011 */

	ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
	ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
	_nop_();

	/* 将保护缓冲区的数据写入 Data Flash, EEPROM */
	byte_addr	=   sector_addr;			/* 扇区地址为扇区首字节地址	*/
	for(i = 0; i< USED_BYTE_QTY_IN_ONE_SECTOR; i++)
	{
		/* 写一个字节 */
		ISP_ADDRH	=	(unsigned char)(byte_addr >> 8);
		ISP_ADDRL	=	(unsigned char)(byte_addr & 0x00ff);
		ISP_DATA	=	protect_buffer[i];
		ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
		ISP_CMD		=	ISP_CMD	|	PROGRAM_AP_and_Data_Memory_Command;		/* 0000,0010 */

		ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
		ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
		_nop_();

        byte_addr++;
	}
	ISP_IAP_disable();

	//disable internal extram
	//AUXR=0x02;
}

unsigned char byte_read(unsigned int byte_addr)
{
	ISP_ADDRH	=	(unsigned char)(byte_addr >> 8);
	ISP_ADDRL	=	(unsigned char)(byte_addr & 0x00ff);

	ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
	ISP_CMD		=	ISP_CMD	|	READ_AP_and_Data_Memory_Command;        /* 0000,0001 */

	ISP_IAP_enable();

	ISP_TRIG	=	0x46;
	ISP_TRIG	=	0xb9;
	_nop_();

	ISP_IAP_disable();
	return (ISP_DATA);
}


void erasure_sector(unsigned int  saddr)
{
	
	ISP_ADDRH	=	(unsigned char)(saddr >> 8);
	ISP_ADDRL	=	0x00;
	ISP_IAP_enable();
	ISP_CMD		=	ISP_CMD	&	0xf8;        /* 1111,1000 */
	ISP_CMD		=	ISP_CMD	|	SECTOR_ERASE_AP_and_Data_Memory_Command;	/* 0000,0011 */

	ISP_TRIG	=	0x46;        /* 触发ISP_IAP命令 */
	ISP_TRIG	=	0xb9;        /* 触发ISP_IAP命令 */
	_nop_();
	ISP_IAP_disable();
	ISP_ADDRH	=	0XFF;
	ISP_ADDRL	=	0xFF;


}
void r_prom(unsigned int address,unsigned char  *ptr_buf,unsigned char rw_length)
{
	unsigned int  i;
	
	EX0=0;	   //may be deleted a little later...LionelXu
	
	for(i=0;i<rw_length;i++)
		*(ptr_buf+i)= byte_read(address+Data_Memory_Begin_Sector_addr+i);
	
	
	EX0=1;

}



void w_prom(unsigned int address,unsigned char *ptr_buf,unsigned char rw_length)
{	

	EX0=0;
  write_flash_with_protect_in_one_sector(address+Data_Memory_Begin_Sector_addr, (unsigned int)rw_length, (unsigned char *)ptr_buf);

	EX0=1;

}

⌨️ 快捷键说明

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