📄 am29lv160-320flash.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 + -