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

📄 am29lv160-320flash.h

📁 AM29LV160及AM29LV320读、写及擦除程序
💻 H
字号:
#define Low8_byte_latch()		PORTC&=0xF8;asm("nop");PORTC |=0x07//低8位地址锁存
#define Middle8_byte_latch()		PORTC&=0xF9;asm("nop");PORTC |=0x07//中8位地址锁存
#define High8_byte_latch()		PORTC&=0xFA;asm("nop");PORTC |=0x07//高8位地址锁存

//Flash编程指令地址
#define First_addr				0xAAA
#define Second_addr				0x555
#define Third_addr				0xAAA
#define Fourth_addr				0xAAA
#define Fifth_addr				0x555
#define Sixth_addr				0xaaa
//Flash编程指令
#define First_command				0xaa
#define Second_command				0x55
#define Third_command				0xa0
//Flash擦除指令
#define SecErase_First_command		0xaa
#define SecErase_Second_command		0x55
#define SecErase_Third_Command		0x80
#define SecErase_Fourth_Command		0xaa
#define SecErase_Fifth_Command		0x55
#define SecErase_Sixth_Command		0x10
/*******************************************************************************************
** 函数名称: Read_flash
** 功能描述: 读Flash数据
*******************************************************************************************/
Read_flash(unsigned long Flash_data_addr)
{
	unsigned char Data;

	PORTA	=Flash_data_addr;
	Low8_byte_latch();		//锁存flash低8位地址
	PORTA=Flash_data_addr>>8;
	Middle8_byte_latch();		//锁存flash中8位地址
	PORTA=Flash_data_addr>>16;
	High8_byte_latch();		//锁村flash高8位地址
cli();
	Data=Flash_addr;		//读出flash中的数据
	SRE_0;
sei();
	return(Data);
}
/*******************************************************************************************
** 函数名称: Writer_flash
** 功能描述: 写Flash数据
*******************************************************************************************/
void Writer_flash(unsigned long Flash_data_addr,unsigned char Data)
{
	PORTA	=Flash_data_addr;
	Low8_byte_latch();				//锁存flash低8位地址
	PORTA=Flash_data_addr>>8;
	Middle8_byte_latch();				//锁存flash中8位地址
	PORTA=Flash_data_addr>>16;
	High8_byte_latch();				//锁村flash高8位地址
cli();
	Flash_addr=Data;				//写数据到Flash指定地址
	SRE_0;
sei();
	_delay_us(2);
}
/*******************************************************************************************
** 函数名称: Writer_flash_pro_command
** 功能描述: 写Flash数据
*******************************************************************************************/
void Writer_flash_pro(unsigned long Flash_data_addr,unsigned char Data)
{
	Writer_flash(First_addr,First_command);
	Writer_flash(Second_addr,Second_command);
	Writer_flash(Third_addr,Third_command);
	Writer_flash(Flash_data_addr,Data);
}
/*******************************************************************************************
** 函数名称: ;Erase_command
** 功能描述: 写擦除指令
*******************************************************************************************/
void Erase_command(void)
{
	unsigned char Data=0;
	Writer_flash(First_addr,SecErase_First_command);
	Writer_flash(Second_addr,SecErase_Second_command);
	Writer_flash(Third_addr,SecErase_Third_Command);
	Writer_flash(Fourth_addr,SecErase_Fourth_Command);
	Writer_flash(Fifth_addr,SecErase_Fifth_Command);
	Writer_flash(Sixth_addr,SecErase_Sixth_Command);
	
cli();
	do
	{
	Data=Flash_addr;//读出flash中的数据
	}while(Data!=0xff);//判断擦除是否完成
	SRE_0;
sei();
}
/************************************************************************
* 函数名称: void Check(void)
* 功能描述: 计算累加和
* 输           入: ###
* 输           出: ###
* 返           回: ###
* 调           用: ###
************************************************************************/
uchar Check(void)
{
	uchar check=0;
	for(RX_index=0;RX_index<32;RX_index++)/*计算累加和*/
		{
		check+=RX_BUFFER[RX_index];
		}
	return(check);
}
/************************************************************************
* 函数名称: void FlashDownPro(void)
* 功能描述: Flash下载程序
************************************************************************/
void FlashDownPro(void)
{
	ulong Flashaddr=0;/*初始化Flash地址*/
	init_USART();/*初始化串口*/
	sei();/*使能全局中断*/
	while(1)
		{
		RX_index=0;/*初始化缓冲区指针*/
		while(RX_index<33);/*接收指令数据*/
		if(RX_BUFFER[0]==0xaa & RX_BUFFER[1]==0x55 & RX_BUFFER[2]==0x11  & RX_BUFFER[32]==Check())
			{
			Put_c(0xa1);/*指令正确返回相应数据"0xa1"*/
			break;
			}
		else 
			{
			Put_c(0x5a);/*指令接受错误返回相应数据"0x5a"并重新接收指令*/
			continue;
			}
		}

	Erase_command();/*擦除Flash(片擦除)*/
	Spk_pro();	
	Put_c(0xa2);/*擦除完毕返回0xa2*/
	while(1)
		{
		RX_index=0;/*初始化缓冲区指针*/
		while(RX_index<33);/*接收数据*/
		if(RX_BUFFER[32]==Check())
			{
			for(RX_index=0;RX_index<32;RX_index++)
				{
				Writer_flash_pro(Flashaddr++,RX_BUFFER[RX_index]);
				}
			if(Flashaddr>0X1fffff)
				{
				Put_c(0xa3);/*接收完成返回0xa3*/
				return;
				}
			Put_c(0xa5);/*接受正确返回0xa5*/
			continue;
			}
		else Put_c(0x5a);/*接受错误返回0x5a*/
		}
	
}


⌨️ 快捷键说明

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