//-------------------------------------------------<br />//Company: ZLGMCU<br />//MCU: P89V51RD2<br />//Crystal: 11.0592Mhz<br />//Writer: ZLG900<br />//Function: Read/Write Cat25C02<br />//-------------------------------------------------<br />#include "reg52.h"<br /><br />sfr SPCR=0xD5; //SPI Control<br />sfr SPSR=0xAA; //SPI Status<br />sfr SPDAT=0x86; <br /> <br />sbit CS=P1^4;<br />//sbit SI=P1^5;<br />//sbit SO=P1^6;<br />//sbit SCK=P1^7;<br /><br />//------------------------------------<br />//Delay(): delay 4 ms,(11.0592MHz)<br />//------------------------------------<br />void Delay()<br />{<br /> int i;<br /> for(i=0x00;i<0x500;i++);<br />}<br /><br /><br />//------------------------------------<br />//SPI_Init: Init SPI <br />//------------------------------------<br />void SPI_Init()<br />{<br /><br /> SPCR=0x56; //0101 0110 ,Disable SPI Interrupt, Enable SPI, Master Mode,CHOL=0,CHOA=1;<br /> SPSR=0x00; //0000 0000 ,Clr SPIF<br /> CS=1;<br />// ES=1; <br />// EA=1;<br /><br />}<br /><br />//------------------------------------<br />//EnableWrite:<br />//function: Enable=0,Disable write <br />// Enable=1,Enable write <br />//------------------------------------<br />void EnableWrite(char Enable)<br />{<br /> CS=0;<br /><br /> if(Enable==0)<br /> {<br /> SPDAT= 0x04; //Disable Command<br /> }<br /> else<br /> {<br /> SPDAT= 0x06; //Enable Command<br /> }<br /> while((SPSR&0x80)==0);<br /> SPSR=0x00;<br /><br /> CS=1;<br />}<br /><br />//------------------------------------<br />//ReadData:<br />//------------------------------------<br />void ReadData(unsigned char address, unsigned char *buf, unsigned char length)<br />{<br /> CS=0;<br /><br /> SPDAT=0x03; //Read Data Command<br /> while((SPSR&0x80)==0);<br /> SPSR=0x00;<br /> <br /> SPDAT=address; //Read address<br /> while((SPSR&0x80)==0);<br /> SPSR=0x00;<br /><br /> while(length--)<br /> {<br /> SPDAT=0xff;<br /> while((SPSR&0x80)==0);<br /> *buf=SPDAT;<br /><br /> buf++;<br /> SPSR=0x00;<br /> }<br /><br /> CS=1;<br />}<br /><br /><br />//------------------------------------<br />//ReadStatus<br />//------------------------------------<br />unsigned char ReadStatus (void)<br />{<br /> unsigned char status;<br /><br /> CS = 0;<br /><br /> SPDAT = 0x05; //Read Status Command<br /> while ((SPSR & 0x80) == 0);<br /> SPSR=0x00; <br /><br /> SPDAT = 0xFF; //Read SPI status<br /> while ((SPSR & 0x80) == 0);<br /> status = SPDAT;<br /><br /> SPSR=0x00; <br /> CS = 1;<br /><br /> return (status);<br />}<br /><br />//------------------------------------<br />//WriteData:<br />//------------------------------------<br />void WriteData(unsigned char address,unsigned char *buf,unsigned char length)<br />{<br /><br /> EnableWrite(1);<br /> while (ReadStatus() & 0x01);<br /><br /> CS = 0;<br /> SPDAT = 0x02; //Write Data Command<br /> while((SPSR&0x80)==0);<br /> SPSR=0x00; <br /><br /> SPDAT = address; //Write address<br /> while((SPSR&0x80)==0);<br /> SPSR=0x00;<br /><br /> for (; length>0 ;length-- )<br /> {<br /> SPDAT = *buf;<br /> while((SPSR&0x80)==0);<br /> SPSR=0x00;<br /> <br /> address++;<br /> buf++;<br /> }<br /> CS = 1;<br /><br /> Delay();<br /> EnableWrite(0);<br />}<br /><br /><br />//------------------------------------<br />//main:<br />//------------------------------------<br />void main()<br />{<br /> unsigned char temp[8];<br /> unsigned char SaveData[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x70,0x80};<br /><br /> SPI_Init(); <br /><br /> while(1)<br /> {<br /><br /> WriteData(0x00,SaveData,8);<br /> ReadData(0x00,temp,8);<br /><br /> }<br />}<br /><br />//------------------------------------<br />//END<br />//------------------------------------<br /><br />
|