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

📄 e2prom_dsp.h

📁 本程序用于MICROCHIP 24LC64 EEPROM的读写。本程序不使用芯片级联方式
💻 H
字号:
/*******************************************************************/  
/***********24LCXX 系列EEPROM的DSP TMS320LF2407读写程序*************/ 
/*******************************************************************/ 
/*  
    本程序用于MICROCHIP 24LC64 EEPROM的读写。本程序不使用芯片级联方式,
请将A0,A1,A2 管脚接至低电平。本程序使用IOC6作为SDA,IOC7作为SCL。
程序中的地址空间最大可至64K:24LC00-16-0,24LC01-128-8,24LC02-256-8,
24LC04-512-16,24LC08-1K-16,24LC16-2K-32,24LC32-4K-32,24LC64-8K-32,
24LC128-16K-64,24LC256-32K-64,24LC512-64K-128,读写数据均为8bits。 
以上器件的格式为(型号-地址空间-页大小)不同器件的页大小不同,因此页写
程序需作相应修改,其他字节写,随机读以及顺序读程序均相同。
address为EEPROM片内地址(当写入时该地址应该为页大小32的整数倍),
Data_Addr为数据缓冲区首地址,
R_W为读写控制位(R_W=1读,R_W=0写),
Data_Length为数据字节数(Byte),
每个数据字的低字节写在EEPROM的低地址,高字节写在EEPROM的高地址。
*/


void  I2CInit(void);
void  I2C_SCL_H(void);
void  I2C_SCL_L(void);
void  I2C_SDA_H(void);
void  I2C_SDA_L(void);
unsigned int  I2C_SDA_IN(void);
 
unsigned int ReadRandom(unsigned int address);
void WriteByte(unsigned int data,unsigned int address);
//void Write2Byte(unsigned int data,unsigned int address);
unsigned int ReadCurrent(void);
void WritePage(unsigned int data[32],unsigned int address);



void  I2C_Send_Byte(unsigned int data);
unsigned int I2C_Receive_Byte(void);


void  I2C_Start(void);
void  I2C_Stop(void);
unsigned int IICRecAck(void);
void  I2C_NoAck(void);
void  Delay_2_uS(void);   
void  Delay_40_uS(void);


void I2CInit(void)
{
    unsigned int i;
    /* Configure IOC6,IOC7 as IO PORT */ 
    /* IOC6=SDA,IOC7=SCL */
    *MCRB=*MCRB&0xFF3F;
    I2C_SDA_H();
    I2C_SCL_H(); 
}

void  I2C_SCL_H(void)
{
    *PCDATDIR=*PCDATDIR|0x8080;/*IOC7=SCL OUT=1*/	
}
void  I2C_SCL_L(void)
{ 
    *PCDATDIR=*PCDATDIR|0x8000;
    *PCDATDIR=*PCDATDIR&0xFF7F;/*IOC7=SCL OUT=0*/
}
void  I2C_SDA_H(void)
{   
    *PCDATDIR=*PCDATDIR|0x4040;/*IOC6=SDA OUT=1*/    
}
void  I2C_SDA_L(void)
{ 
    *PCDATDIR=*PCDATDIR|0x4000;
    *PCDATDIR=*PCDATDIR&0xFFBF;/*IOC6=SDA OUT=0*/     
}
unsigned int  I2C_SDA_IN(void) 
{   
    unsigned int tt;
    
    *PCDATDIR=*PCDATDIR&0xBFFF;/*IOC6=SDA DIR=IN*/
	    
    tt= (*PCDATDIR>>6)&0x0001;
    if(tt==1)return 1;
    if(tt==0)return 0;
}




unsigned int ReadRandom(unsigned int address)
{
    unsigned int data;		
 	
 	I2C_Start();
 	I2C_Send_Byte( 0xa0 );
 	if(IICRecAck()==1) return;
   	I2C_Send_Byte( address>>8 );
  	if(IICRecAck()==1) return;
  	I2C_Send_Byte( address&0x00ff );
  	if(IICRecAck()==1) return;
  	I2C_Start();
  	I2C_Send_Byte( 0xa1 );
  	if(IICRecAck()==1) return;
  	data= I2C_Receive_Byte();
  	I2C_NoAck();
    I2C_Stop();
 
  	return data;
}

unsigned int ReadCurrent(void)
{
	unsigned int data;
	I2C_Start();
 	I2C_Send_Byte( 0xa1 );
 	if(IICRecAck()==1) return;
 	data= I2C_Receive_Byte();
 	I2C_NoAck();
 	I2C_Stop();
 
  	return data;
}


void WriteByte(unsigned int data,unsigned int address)
{
   
  	data=data&0x00ff;
      	
  	I2C_Start();
 	I2C_Send_Byte( 0xa0 );
  	if(IICRecAck()==1) return;
  	I2C_Send_Byte( address>>8);
  	if(IICRecAck()==1) return;
  	I2C_Send_Byte( address&0x00ff);
  	if(IICRecAck()==1) return;
  	I2C_Send_Byte( data ); 
  	if(IICRecAck()==1) return;
  	
  	I2C_Stop();
    	
}

/*
void Write2Byte(unsigned int data,unsigned int address)
{
   
  	data=data&0x00ff;
      	
  	I2C_Start();
 	I2C_Send_Byte( 0xa0 );
  	if(IICRecAck()==1) return;
  	I2C_Send_Byte( address>>8);
  	if(IICRecAck()==1) return;
  	I2C_Send_Byte( address&0x00ff);
  	if(IICRecAck()==1) return;
  	I2C_Send_Byte( data ); 
  	if(IICRecAck()==1) return;
  	
  	I2C_Stop();
    	
}
*/
void I2C_Send_Byte(unsigned int data)
{
    unsigned int i = 8;
 	 
  	while( i-- )
 	{
  		I2C_SCL_L(); 
  		if ( data &0x0080 ) I2C_SDA_H();
  		else                I2C_SDA_L();
  		Delay_2_uS();
  		I2C_SCL_H();
  		Delay_2_uS();
  		data = data << 1;
  	}
}

unsigned int I2C_Receive_Byte(void)
{
 	unsigned int i = 8, data; 
 	data=0;
 	I2C_SCL_L();
	*PCDATDIR=*PCDATDIR&0xBFFF;/*IOC6=SDA DIR=IN*/ 
  	Delay_2_uS();
  	while ( i--)
 	{
  		data = data << 1;
  		Delay_2_uS();
  		I2C_SCL_H(); 
  		Delay_2_uS();
  		if ( I2C_SDA_IN() ) data++;
  		Delay_2_uS();
  		I2C_SCL_L();
  		Delay_2_uS();
 	}
	*PCDATDIR=*PCDATDIR|0x4000;/*IOC6=SDA DIR=OUT*/
	return data;
}

void I2C_Start(void)
{
    
 	I2C_SDA_H();
    I2C_SCL_H();
 	Delay_2_uS();
 	I2C_SDA_L();
 	Delay_2_uS();
 
}

void  I2C_Stop(void)
{
 
 	I2C_SCL_L();
	Delay_2_uS(); 
    I2C_SDA_L();
    I2C_SCL_H();
    Delay_2_uS(); 
    I2C_SDA_H();
	//I2C_SCL_L();
    Delay_40_uS(); 

}   
                           
unsigned int IICRecAck(void)
{
	unsigned int temp;
	I2C_SCL_L();
	*PCDATDIR=*PCDATDIR&0xBFFF;/*IOC6=SDA DIR=IN*/ 
	Delay_2_uS();
	I2C_SCL_H(); 
	Delay_2_uS();
	temp=I2C_SDA_IN();
	I2C_SCL_L();
	*PCDATDIR=*PCDATDIR|0x4000;/*IOC6=SDA DIR=OUT*/

	return(temp);
	
}   
void  I2C_NoAck(void)
{
 
 	I2C_SDA_H();
    I2C_SCL_H();
    Delay_2_uS(); 
  	I2C_SCL_L();


}   

void  Delay_2_uS(void)
{
	 unsigned int i=160;
	 while(i--);
}

void  Delay_40_uS(void)
{
	 unsigned int i=3200;
	 while(i--);
}



⌨️ 快捷键说明

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