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*/