//falsh rw
//falsh address 0x8000~0xffff
#include <RC500_p89c51rx.h>
#include <address_distribute.h>
/************************************************************************
//void falsh_id_cfi_exit();
//unsigned char read_falsh(unsigned long data f_address);
//void write_falsh(unsigned long data address,unsigned char w_data);
//void write_sector_falsh(unsigned long int address,unsigned char w_data[],unsigned char data_s);
//void falsh_block_erase(unsigned char falsh_block);
//unsigned char fast_read_falsh(unsigned int f_address);
/***********************************************************************
指定FALSH退出CFI\ID读取模式
入口:无
出口:无
***********************************************************************/
void falsh_id_cfi_exit()
{
XBYTE[0x8aaa]=0xaa; //可以不用
XBYTE[0x8555]=0x55; //可以不用
XBYTE[0x8aaa]=0xf0; //ID模式退出
}
/***********************************************************************
指定块擦除
擦除按64K为一块,共分为16个块,由_falsh_page指定
入口:扇区地址线(A16 ~ A20)
出口:无
***********************************************************************/
void falsh_block_erase(unsigned char falsh_block)
{
P1 = P1 & 0xc0;
falsh_block<<=1;
P1 = P1 | falsh_block;
XBYTE[0X8aaa]=0xaa;
XBYTE[0x8555]=0x55;
XBYTE[0x8aaa]=0x80;
XBYTE[0x8aaa]=0xaa;
XBYTE[0x8555]=0x55;
XBYTE[0x8000]=0x30;
}
/////////////////////////////////////////////////////////////////////
//falsh 指定地址写命令,每次写一个字节;
//入口:页面地址(6位)、地址(15位)、写入的数据
//出口:无
/////////////////////////////////////////////////////////////////////
void write_falsh(unsigned long data address,unsigned char w_data)reentrant
{
w_data=w_data; //利用数据运算使R0得到要写入数据的地址
XBYTE[0x8aaa]=0xaa;
XBYTE[0x8555]=0x55;
XBYTE[0x8aaa]=0xa0;
#pragma asm //采用汇编写入数据可以提高速度,但引起一个编译警告: address 未使用
anl p1,#0c0h
mov a,r5
clr c
rlc a
orl p1,a
mov a,r6
jnb ACC.7,TTW1
setb p1.0
ttW1: orl a,#80h
mov dph,a
mov dpl,r7
MOVX A,@R0
movx @dptr,a
#pragma endasm
/* unsigned char flash_page;
unsigned int flash_addr;
//采用C做的写FALSH程序,已经测试可以使用,但页面计算很慢,影响大量数据写入时的速度
flash_page = address>>15;
P1 = P1 & 0xc0;
P1= P1 | flash_page;
flash_addr = address | 0x8000;
XBYTE[0x8aaa]=0xaa;
XBYTE[0x8555]=0x55;
XBYTE[0x8aaa]=0xa0;
XBYTE[flash_addr]=w_data; */
}
/*************************************************************************
功能:读取falsh中的一个数据 *
入口:falsh的绝对地址 *
出口:地址中的数据 *
**************************************************************************/
unsigned char read_falsh(unsigned long data address)reentrant
{
#pragma asm //采用汇编写入数据可以提高速度,但引起一个编译警告 : 1\address 未使用;
anl p1,#0c0h
mov a,r5
clr c
rlc a
orl p1,a
mov a,r6
jnb ACC.7,TT1
setb p1.0
tt1: orl a,#80h
mov dph,a
mov dpl,r7
movx a,@dptr
// mov r7,a
#pragma endasm
return ACC;
/* unsigned char flash_page;
unsigned int flash_addr;
//采用C做的读FALSH程序,已经测试可以使用,但页面计算很慢,影响链路查询速度
flash_addr = address | 0x8000;
P1 = P1 & 0xc0;
flash_page = address>>15;
P1 = P1 | flash_page;
return XBYTE[flash_addr]; */
}
/////////////////////////////////////////////////////////////////////
//指定FALSH进入读ID模式,并将芯片ID读出
//入口:无
//出口:器件ID(单字节)
/////////////////////////////////////////////////////////////////////
/*unsigned char falsh_r_id()
{
unsigned char a;
out_data(0x555,0xaa);
out_data(0xaaa,0x55);
out_data(0x555,0x90);
a = in_data(0x0001);
return a;
}
/////////////////////////////////////////////////////////////////////
//指定FALSH进入读CFI读取模式
//入口:无
//出口:无
/////////////////////////////////////////////////////////////////////
void falsh_cfi()
{
out_data(0x555,0xaa);
out_data(0xaaa,0x55);
out_data(0x555,0x98);
}
*/
/////////////////////////////////////////////////////////////////////
//指定FALSH扇区擦除
//擦除按4K为一页,共分为512个扇区,由_falsh_page指定
//入口:扇区地址线(A12 ~ A20)
//出口:无
/////////////////////////////////////////////////////////////////////
/*void falsh_sector_erase(unsigned char falsh_page)
{
P1 = falsh_page&&0x3f;
out_data(0x555,0xaa);
out_data(0xaaa,0x55);
out_data(0x555,0x80);
out_data(0xaaa,0xaa);
out_data(0x555,0x55);
out_data(falsh_page,0x50);
}*/