www.pudn.com > TcpIpOn8051.rar > 93C46.C


#include  
#include                 /* prototype declarations for I/O functions */ 
typedef unsigned char BYTE; 
typedef unsigned int WORD; 
#define reg00 XBYTE[0xc000] /* 240H*/ 
#define reg01 XBYTE[0xc100] /* 241H*/ 
 
void do_93c46(BYTE address); 
WORD read_93c46(BYTE address); 
void write_93c46(BYTE address,WORD value); 
/*------------------------- 
  向9346移位输出8位数据 
--------------------------*/ 
void do_93c46(BYTE address) 
{ 
//93c46 command register: 
//7	6	5	4	3	2	1	0 
//eem1	eem0	nc	nc	eecs	eesk	eedi	eedo 
//				cs	sk	di	do 
//EEM1   EEM0 
// 0     0      :normal 
// 0     1      :auto-load 
// 1     0      :9346 programming 
// 1     1      :config register write enable 
//cs:片选  sk:时钟    di:输入  do:输出 
BYTE count; 
for(count=0;count<8;count++) 
{ 
	if((address&0x80)!=0) 
	{					//out 1 
		reg01=0x8a;		//1000 1010b:cs=1  sk=0  di=1 
		reg01=0x8e;		//1000 1110b:cs=1  sk=1  di=1 
	} 
	else 
	{					//out 0 
		reg01=0x88;		//1000 1000b:cs=1  sk=0  di=0 
		reg01=0x8c;		//1000 1100b:cs=1  sk=1  di=0 
	} 
	address=address<<1; 
} 
} 
/*------------------------- 
  读9346指定地址,字型 
--------------------------*/ 
WORD read_93c46(BYTE address) 
{ 
//93c46 command register: 
//7	6	5	4	3	2	1	0 
//eem1	eem0	nc	nc	eecs	eesk	eedi	eedo 
//				cs	sk	di	do 
BYTE count; 
WORD retval; 
address=address|0x80; //10xx xxxx 
reg00=0xe2;//select page 3 register 
//first bit is 1 
reg01=0x8a;//1000 1010b:cs=1  sk=0  di=1 
reg01=0x8e;//1000 1110b:cs=1  sk=1  di=1 
do_93c46(address);   //已写入1 10xx xxxx ,为读命令 
for(count=0;count<16;count++) 
{ 
	//out 0 
	reg01=0x88;//1000 1000b:cs=1  sk=0  di=0 
	reg01=0x8c;//1000 1100b:cs=1  sk=1  di=0 ,时钟信号 
	retval=retval<<1; 
	if((reg01&0x01)!=0) 
	{ 
		retval=retval|0x01; 
	} 
} 
reg01=0x88;//1000 1000b:cs=1  sk=0  di=0 
reg01=0x00;//0000 0000b:cs=0  sk=0  di=0 
return(retval); 
} 
/*------------------------- 
  写9346指定地址,字型 
--------------------------*/ 
void write_93c46(BYTE address,WORD value) 
{ 
//93c46 command register: 
//7	6	5	4	3	2	1	0 
//eem1	eem0	nc	nc	eecs	eesk	eedi	eedo 
//				cs	sk	di	do 
reg00=0xe2;//select page 3 register 
//enable programming modes.EWEN  comand=1 0011 1100  =0x13c 
reg01=0x8a;//1000 1010b:cs=1  sk=0  di=1 
reg01=0x8e;//1000 1110b:cs=1  sk=1  di=1 
do_93c46(0x3c); 
reg01=0x88;//1000 1000b:cs=1  sk=0  di=0 
reg01=0x00;//0000 0000b:cs=0  sk=0  di=0 
//do the actual write.WRITE comand=1 01xxxxxx xxxxxxxx xxxxxxxx 
reg01=0x8a;//1000 1010b:cs=1  sk=0  di=1 
reg01=0x8e;//1000 1110b:cs=1  sk=1  di=1 
address=address|0x40; //1 01xx xxxx 
do_93c46(address);    //address 
do_93c46(value>>8);   //high byte 
do_93c46(value&0xff); //low byte 
reg01=0x88;//1000 1000b:cs=1  sk=0  di=0 
reg01=0x00;//0000 0000b:cs=0  sk=0  di=0 
//wait for write_finish 
reg01=0x88;//1000 1000b:cs=1  sk=0  di=0 
for(value=0;value<10000;value++) 
{ 
	if((reg01&0x01)!=0) break; 
} 
reg01=0x00;//0000 0000b:cs=0  sk=0  di=0 
//disable programming.EWDS comand=1 0000 0000 
reg01=0x8a;//1000 1010b:cs=1  sk=0  di=1 
reg01=0x8e;//1000 1110b:cs=1  sk=1  di=1 
do_93c46(0x00); 
reg01=0x88;//1000 1000b:cs=1  sk=0  di=0 
reg01=0x00;//0000 0000b:cs=0  sk=0  di=0 
} 
 
/*EOF*/