⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at24c02.c

📁 TMS320LF2407A构成的EEPROM读写程序AT24C02.rar
💻 C
字号:


//EEPROM WRITE:C0 1E 0B 06 00 00 02 00 FF FF FF FF FF FF FF FF

#include "LF2407register.h" 
        
unsigned char EEPROM[16]={0xC0,0x79,0xBE,0x00,0x51,0x01,0x00,0x00,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF} ;  

unsigned char VERIFY[16]  ;


void delay(unsigned j)
{
  while(j--)        ;
}


//系统初始化程序

void initial(void)
{  
  asm(" setc SXM")   ;
  asm(" clrc OVM")   ;
  asm(" clrc CNF")   ;
  asm(" setc INTM")  ;

  *SCSR1=0x8201      ;
  *WDCR=0xE8         ;
  *EVAIMRA=0         ;                    
  *IMR=0x0000        ;
  *IFR=0x0FFFF       ;
  WSGR=0x00          ;
  *MCRC=0x0000       ;//BASIC IO FUNCTION(IOPF0==SDA,  IOPF1==SCL)
  *MCRA=0x0000       ;//FOR THE PURPOSE OF ERROR DISPLAY
  *PFDATDIR=0xFF00   ;
}

void start(void)
 { 
   *PFDATDIR|=0xFF01  ;//初始化状态,SDA=1,SCL=1
   *PFDATDIR|=0xFF03  ;
    delay(10)         ;
   *PFDATDIR&=0xFF02  ;//SDA从1跳变为0,形成起始状态
   delay(10)          ;
   *PFDATDIR&=0xFF00  ;//将SCL置低,开始写数据到SDA
   delay(10)           ;
  
 } 
void stop(void)
 {
   *PFDATDIR=0xFF02  ;//SDA=0
   delay(5)          ;
   *PFDATDIR=0xFF03  ;//SDA从0跳变为1,形成stop
   delay(5)          ;
   *PFDATDIR=0xFF01  ;//SCL=0, SET THE SCL=0 AS A USUAL STAT.
   delay(5)          ;
 }

//design as the page write way which can clock 8-byte into the eeprom at a time. 

void write(unsigned char dat)

{ unsigned char j,shift=0x80;
     
 for(j=0;j<8;j++)
    {
      if(dat&shift)
        *PFDATDIR|=0xff01    ;//入口处认为SCL为低
      else
        *PFDATDIR&=0xFF00    ;//以上将DAT的最高位放到了IOPF.0上,即SDA上
	  delay(100)              ;
      *PFDATDIR|=0xFF02      ;//将SCL拉高,并且保持SDA上的数据
      delay(100)              ; 
	  *PFDATDIR&=0xFF01      ;//SET SCL TO LOW WHICH IS A USUAL STAT
	  delay(100)              ;
      shift>>=1              ;        
    } 
// 以下为ACK_CHECK (be aware that the SCL is low as a usual stat)
     
     *PFDATDIR&=0xFE01       ;//SETB SDA
	   delay(100)            ;
	 *PFDATDIR|=0xFE03       ;//SETB SCL
	  while(*PFDATDIR&0x0001)
   	    delay(10)            ;

       {
         *PFDATDIR&=0xFE01   ;//CLR SCL;
         delay(100)           ;	   
	     *PFDATDIR=0xFF01    ;//CLR SCL;
       delay(1000)           ;
       }
}

//sequential read, the add means the start read address ,
//and pc means how many byte will be read by mocrocontroller

void read(unsigned char add) 
{ 
  unsigned char temp=0x00  ;
  unsigned char i,j        ;
  start()                  ;//start
  write(0xA0)              ;//select the device,and the R/W is 0 means to WRITE
  write(add)               ;//WRITE THE ADD TO THE AT24C02,SO THAT IT CAN KEEP THE ADD
  delay(2000)              ;
  start()                  ;
  write(0xA1)              ;//1 MEANS TO READ BYTE FROM THE ADD 0X00 WHICH IS WROTE TO EEPROM 
  delay(2000)              ;
  for(i=0;i<16;i++)
   { 
    for(j=0;j<8;j++)
     {
        *PFDATDIR&=0XFE01  ;//set the SDA as the mode of input
        *PFDATDIR|=0XFE02  ;//SETB SCL ;BE NOTICED THAT THE DATA IS RIGHT WHEN SCL=1
	    delay(100)         ;
	    if(*PFDATDIR&0x0001)
	       { 
		     temp<<=1      ;
	         temp+=1       ;
		   }
         else
	       temp<<=1        ;

         *PFDATDIR&=0XFE01 ;//SCL=0; this word can be ommitted because of scl=0 is the usual stat

      }
         
           //以下为产生ACK
         *PFDATDIR|=0XFF00 ;//SDA=0,SCL=0
		 delay(100)        ;  
		 *PFDATDIR&=0XFF00 ;
         *PFDATDIR|=0XFF02 ;//SDA=0,SCL=1
         delay(100)        ;
         *PFDATDIR&=0XFF00 ;//SCL=0,SDA=0  
		 VERIFY[i]=temp    ;
		 temp=0            ;
   }    
          stop()           ;  
}



void main(void)
{ 
  unsigned char j          ;
  unsigned check=0        ;
  initial()                ;
  start()                  ;
  write(0xA0)              ;
  write(0x00)              ;
  for(j=0;j<8;j++)
    write(EEPROM[j])       ;
  stop()                   ;
  delay(10000)             ;
  start()                  ;
  write(0xA0)              ;
  write(0x08)              ;
  for(j=8;j<16;j++)
    write(EEPROM[j])       ;
  stop()                   ;
  delay(10000)             ;   
  read(0x00)               ;
  for(j=0;j<16;j++)
     check+=VERIFY[j]      ;
  
  while(check!=0x08E9)
    { 
	  *PADATDIR=0xFF00     ;
	  delay(300000)        ;
	  *PADATDIR=0xFF03     ;
      delay(300000)        ;
    }
  *PADATDIR=0xFF00         ;
  while(1)                 ;        
}

void interrupt nothing()
 {
   return            ;
 }



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -