x25045的读写函数
#pragma registerbank(0)
#define wp_addr 0xff /* wp address in fpga, 0xff=none */
//sbit WP = P1 ^ 5;
sbit SCLK = P1 ^ 3;
sbit SDI = P1 ^ 2;
sbit SDO = P1 ^ 1;
sbit SCS = P1 ^ 0;
/*-------------------------------------------------------------------*/
#ifndef XBYTE
#define XBYTE ((unsigned char volatile *)0x20000L)
#endif
#define uchar unsigned char
#define wren_inst 6 /* write enable latch instruction (wren) */
#define wrdi_inst 4 /* write disable latch instruction (wrdi) */
#define wrsr_inst 1 /* write status register instruction (wrsr) */
#define rdsr_inst 5 /* read status register instruction (rdsr) */
#define write_inst 2 /* write memory instruction (write) */
#define read_inst 3 /* read memory instruction (read) */
#define status_reg 0 /* status register, watch dog timeout=1.4s,
protected array=no */
/********************************************************************/
/* read/write 25165 subroutines, 02/16-2000 by hhl */
void outbyte( uchar c)
{
uchar i;
for (i = 0; i < 8;i++)
{
SCLK = 0;
SDI = c & 0X80;
c < <= 1;
SCLK = 1;
}
SDI = 0;
}
uchar inbyte(void)
{
uchar i,c;
c = 0;
for (i = 0; i <8 ;i++)
{
SCLK = 1;
SCLK = 0;
c < <= 1;
c |= SDO;
}
return c;
}
void wren_cmd(void)
{
SCLK = 0;
SCS = 0;
outbyte(wren_inst);
SCLK = 0;
SCS = 1;
}
uchar rdsr_cmd(void)
{
uchar c;
SCLK = 0;
SCS = 0;
outbyte(rdsr_inst);
c = inbyte();
SCLK = 0;
SCS = 1;
return c;
}
void init_x25165(void)
{
#if wp_addr !=0xff
XBYTE[wp_addr]=1; /* x25045 /wp high */
#endif
wren_cmd(); /* x25045 write enable */
SCLK = 0;
SCS = 0;
outbyte(wrsr_inst);
outbyte(status_reg);
SCLK = 0;
SCS = 1;
while ((rdsr_cmd() & 0X01) == 1);
#if wp_addr !=0xff
XBYTE[wp_addr]=0; /* x25045 /wp low */
#endif
}
/*===================================================================
读 X25165 中数据放入外部RAM中
入口:X25165地址:dog_add,外部RAM地址:add,要读的字节数:len
===================================================================*/
void rdata( unsigned int dog_add, unsigned int add, unsigned int len)
{
uchar c = read_inst;
unsigned int j;
SCLK = 0;
SCS = 0;
outbyte(c);
outbyte(dog_add> > 8);
outbyte(dog_add);
for (j = 0;j < len; j++)
{
c = inbyte();
XBYTE[0xfff6]=add> > 8;
XBYTE[0xfff7]=add;
XBYTE[0xfff8]=c;
add++;
}
SCLK =0;
SCS = 1;
}
/*===================================================================
将外部RAM中数据写入 X25165 中
入口:X25165地址:dog_add,外部RAM地址:add,要写的字节数:len
===================================================================*/
void sdata( unsigned int dog_add, unsigned int add, unsigned int len)
{
unsigned char c;
unsigned int j;
unsigned int B_TEMP = dog_add;
#if wp_addr !=0xff
XBYTE[wp_addr]=1; /* x25045 /wp high */
#endif
for (j = 0;j != len; j++)
{
wren_cmd(); /* x25045 write enable */
SCLK = 0;
SCS = 0;
c = write_inst;
outbyte(c);
outbyte(B_TEMP> > 8);
outbyte(B_TEMP);
XBYTE[0xfff6]=add> > 8;
XBYTE[0xfff7]=add;
c=XBYTE[0xfff3]; /* 读 RAM 中的数据 */
outbyte(c);
SCLK =0;
SCS = 1;
B_TEMP++;
add++;
while ((rdsr_cmd() & 0X01) == 1); /* wait for write finish */
}
#if wp_addr !=0xff
XBYTE[wp_addr]=0; /* x25045 /wp low */
#endif
}
void rst_wdog(void)
{
SCS = 0;
SCS = 1;
}
/****************************************************************/
发表时间:2001年12月20日8:56:00