📄 e2prom_dsp.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 + -