您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文档 > 关于调试93C46的读写出现的问题
93C46为容量1K的EE2PROM,工作电压为REDA:2~5.5VWRITE:2.4~5.5V,通过3线的SPI接口来进行读取,管脚排布如下图其中ORG为低时,存储结构为128*8bitORG为高时,存储结构为64*16bit有以下几种指令,对应的OPCode及地址如下表所示常用的操作如红色方框所示,93C46上电为EWDS状态(禁止写入),因此在执行Write指令之前必须先执行EWEN(写使能)指令,执行Read指令则不需要,不管是EWDS状态还是EWEN状态,其中各指令的时序图如下电路图接线如图所示其中CS,CLK所接I/O设为输出,DI和DO共用一I/O,执行Read指令时需将IO设为输入,其它时候设为输出具体程序如下所示(PIC,已调试过,注意对应的红色字体,不同MCU作不同处理)#defineCSRB2//ChipSelect#defineCLKRB3//SerialDataClock#defineDIORB4//SerialDataInput/output#defineDIO_STATE_InTRISB4=1#defineDIO_STATE_OutTRISB4=0//写93c46操作码和地址函数(8位数据存储结构):voidWrite93c46OpcAndAddr(Uint8opcode,Uint8addr){Uint8i;unsignedinttemp;temp=opcode;temp=(temp7)|addr;for(i=0;i10;i++){DIO=(temp&0x0200)?1:0;CLK=0;asm(nop);asm(nop);asm(nop);asm(nop);CLK=1;temp=1;}}//读93C46数据函数(8位数据存储结构):Uint8Read93c46Data(Uint8raddr){Uint8i,rdata=0;CS=1;//选通Write93c46OpcAndAddr(0x06,raddr);//写入读操作码和地址DIO_STATE_In;asm(nop);asm(nop);asm(nop);asm(nop);for(i=0;i8;i++)//读取8位数据{CLK=0;//产生时钟asm(nop);asm(nop);asm(nop);asm(nop);asm(nop);CLK=1;asm(nop);asm(nop);asm(nop);asm(nop);asm(nop);rdata=1;//存下一位if(DIO==1)rdata|=0x01;//逐位读取数据并处理elserdata&=(~0x01);}DIO_STATE_Out;CS=0;//选通禁止returnrdata;Delay10us(1);}//写93C46数据函数(8位数据存储结构):voidWrite93c46Data(Uint8waddr,Uint8wdata){Uint8i;CS=1;//选通Write93c46OpcAndAddr(0x05,waddr);//写入写操作码和地址for(i=0;i8;i++)//写入8位数据{DIO=(wdata&0x80)?1:0;//逐位写入CLK=0;//产生时钟asm(nop);asm(nop);asm(nop);asm(nop);CLK=1;wdata=1;//取下一位}CS=0;//选通禁止Delay10us(1);}//93C46写使能函数:voidWriteEnable93C46(void){CS=1;//选通Write93c46OpcAndAddr(0x04,0x60);//使能写允许CS=0;//选通禁止}//93C46写除能函数:voidWriteDisaEnable93C46(void){CS=1;//选通Write93c46OpcAndAddr(0x04,0x00);//使能写允许CS=0;//选通禁止}确定所有的IO都配置正确并且相对应的电路没有虚焊,执行以下程序Delay10ms(1);IOinit();//Int_ext();InitTime();WriteEnable93C46();Write93c46Data(0x00,0x95);Write93c46Data(0x01,0x20);Write93c46Data(0x02,0x30);WriteDisaEnable93C46();eeprombuf[0]=Read93c46Data(0x00);eeprombuf[1]=Read93c46Data(0x01);eeprombuf[2]=Read93c46Data(0x02);while(1){if(FLAG_10MS){FLAG_10MS=0;//led=1;//eeprombuf[0]=Read93c46Data(0x05);//eeprombuf[1]=Read93c46Data(0x05);//eeprombuf[2]=Read93c46Data(0x06);if(eeprombuf[0]==0x95&&eeprombuf[1]==0x20&&eeprombuf[2]==0x30)led=1;elseled=0;}}发现LED不亮(内心旁边:怎么可能呢?研究了几天的程序竟然不行,你大爷的)反复的检查修改程序和阅读规格书,仍找不到BUG在哪,郁闷了N天后(此处略去一万字)……终于在93C46的规格书中发现这么一个参数对应时序图红色方框的部分于是报着一试的心态,在程序中加入几条指令(红色字体)Delay10ms(1);IOinit();//Int_ext();InitTime();WriteEnable93C46();Write93c46Data(0x00,0x95);Delay1ms(2);Write93c46Data(0x01,0x20);Delay1ms(2);Write93c46Data(0x02,0x30);Delay1ms(2);//此延时为93C46的写周期,若无此延时,则无法读到数据,很重要WriteDisaEnable93C46();eeprombuf[0]=Read93c46Data(0x00);eeprombuf[1]=Read93c46Data(0x01);eeprombuf[2]=Read93c46Data(0x02);while(1){if(FLAG_10MS){FLAG_10MS=0;//led=1;//eeprombuf[0]=Read93c46Data(0x05);//eeprombuf[1]=Read93c46Data(0x05);//eeprombuf[2]=Read93c46Data(0x06);if(eeprombuf[0]==0x95&&eeprombuf[1]==0x20&&eeprombuf[2]==0x30)led=1;elseled=0;}}灯竟然亮了,这灯亮得,把我这几天的郁闷都给照没了,也照出了我内心那一点点小小的成就感和满足感,哈哈,写程序的人应该都会有这种体验吧,这点自身的收获希望能给有需要的人一点帮助哈
本文标题:关于调试93C46的读写出现的问题
链接地址:https://www.777doc.com/doc-4088372 .html