我要把 sst29sf040当作 数据存储器 使用,89c52的WR接sst29sf040的WE端,89c52的RD接sst29sf040的OE端,单片机(89c52 )的P2.7口和它的CE端相连,P2.6--P2.0和它的A14--A8相连,P07--P00通过373与A7--A0相连,而sst29sf040的A18--A15接地<br />以下是我的程序:程序运行后发现外部地址0x0030上,没有写上数据0x20,用示波器检测各个管脚都有信号,但不知正确与否.<br />#define _SST_C_<br />#include "reg51.h"<br />#include "sst.h"<br />#include <intrins.h><br />#include <absacc.h><br /><br />#define FALSE 0<br />#define TRUE 1<br /><br />#define SECTOR_SIZE 128 /*Must be 128 bytes for 29EE020*/<br /><br />#define SST_ID 0xBF<br />#define SST_29SF040 0X13<br />#define uchar unsigned char <br />#define uint unsigned int <br /><br />void wait(uchar p,uchar q);<br />int Check_SST_29SF040();<br />void ByteProgram(uchar SrcByte,uint Dst);<br />int Erase_One_Sector(uint Dst);<br />uchar ByteRead(uint addr);<br /><br />void main()<br />{<br /> Erase_One_Sector(0);<br /> <br /> // while(1)<br /> //{ <br /> ByteProgram(0x20,0x0030);<br /> ByteRead(0x0030);<br />// }<br />}<br />void ByteProgram(uchar data SrcByte,uint Dst)<br />{<br /> XBYTE[0x0555] = 0xAA;<br /> XBYTE[0x02AA] = 0x55;<br /> XBYTE[0x0555] = 0xA0;<br /> XBYTE[Dst] = SrcByte;<br /> //Check_Toggle_Ready(Dst);<br /> wait(1,9);//等待25us<br />}<br />int Check_SST_29SF040()<br />{<br /> uchar SST_id1;<br /> uchar SST_id2;<br /> int ReturnStatus;<br /> /* Issue the Software ID code to 29sf040*/<br /> XBYTE[0x0555]= 0xAA;/* set up address to be 555h */<br /> /* write data 0xAA to the address */<br /> XBYTE[0x02AA]= 0x55;/* set up address to be 2AAh */<br /> /* write data 0x55 to the address */<br /> XBYTE[0x0555]= 0x90;<br /> wait(61,74); /*delay 10ms*/<br /> /*read the product ID from29sf040*/<br /> /* set up address to be 0000h */<br /> SST_id1 = XBYTE[0x0000] ; /* get first ID byte???????????????*/<br /> SST_id2 = XBYTE[0x0001];/* set up address to be 0001h */<br /> if ((SST_id1 ==SST_ID)&&(SST_id2 == SST_29SF040))<br /> {<br /> ReturnStatus = 0;<br /> }<br /> else <br /> ReturnStatus = -1;<br /> /* Issue the Soffware Product ID Exit code thus returning the 29EE020 */<br /> /* to the read operating mode */<br /> /* set up address to be 555h */<br /> XBYTE[0x0555] = 0xAA; /* write data 0xAA to the address */<br /> /* set up address to be 2AAh */<br /> XBYTE[0x02AA] = 0x55; /* write data 0x55 to the address */<br /> /* set up address to be 555h */<br /> XBYTE[0x0555] =0xF0; /* write data 0xF0 to the address */<br /> wait(61,74); /*delay 10ms*/<br /> return(ReturnStatus);<br /><br />}<br />int Erase_One_Sector(uint Dst)<br />{<br /><br /> /* Issue the Sector Erase command to 39SF040 */<br /><br /> XBYTE[0x0555] = 0xAA; /* set up address to be 555h */<br /> /* write data 0xAA to the address */<br /> XBYTE[0x02AA] = 0x55; /* set up address to be 2AAh */<br /> /* write data 0x55 to the address */<br /> XBYTE[0x0555] = 0x80; /* set up address to be 555h */<br /> /* write data 0x80 to the address */<br /> XBYTE[0x0555] = 0xAA; /* set up address to be 555h */<br /> /* write data 0xAA to the address */<br /> XBYTE[0x02AA] = 0x55; /* set up address to be 2AAh */<br /> /* write data 0x55 to the address */<br /> XBYTE[Dst] = 0x20; /* set up starting address to be erased */<br /> /* write data 0x30 to the address */<br /> wait(85,134); /* check DATABOOK for the most */<br /> /* accurate value -- Tse */<br />}<br />uchar ByteRead(uint addr)<br />{<br /> uchar GetData;<br /> GetData = XBYTE[addr];<br /> return(GetData);<br />}<br />void wait(uchar p,uchar q)<br />{<br /> uchar i,j; //(2*j+3)*i+4<br /> for (i=p;i>0;i--)<br /> for (j=q;j>0;j--);<br />}<br /><br /> |
|