#define IO_MEM
#include"MCU.H"
#include"eeprom.h"
#define SDA_1 P4DR |= 0X80;
#define SDA_0 P4DR &= 0X7F;
#define SCL_1 P4DR |= 0X40;
#define SCL_0 P4DR &= 0XBF;
#define SDA_OUT P4CR |= 0X80;//1为输出
#define SDA_IN P4CR &= 0X7F;//0为输入
UCHAR EEData[EEPROM_MAX];
//============================================
void I2C_Init(void)
{
SDA_1
SCL_1
}
//============================================
void I2C_Start(void)
{
SDA_1
SCL_1
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
SDA_0
SCL_0
}
//===========================================
void I2C_Stop(void)
{
SCL_0//scl=1
SDA_1//sda=1
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
SCL_0//scl=0
SDA_0//sda=0
}
//==========================================
UCHAR I2C_Write_byte(UCHAR data)
{
UCHAR i;
for (i=0; i<8; i++)
{
if (data&0x80)
SDA_1
SCL_0//scl=1
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
SCL_0
SDA_0
data<<=1;
}
i=1;
SDA_1//SDA=1
SDA_IN//sda输入
SCL_0//scl=1,第九脉冲信号
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
while((P4DR&0X80)&&i)//等待器件响应或者超时
{
i++;
if(i==255)
{
i=0;
return FALSE;
}
}
SCL_0 //SCL=0
SDA_0 //SDA=0
SDA_OUT; //SDA输出
return TRUE;
}
//================================================
UCHAR I2C_Receive_byte(void)
{
UCHAR i, ch=0;
SCL_0//SCL=0
SDA_IN //SDA输入 //SDA dirct input
for (i=0; i<8; i++)
{
SCL_0
__asm("nop");
__asm("nop");
__asm("nop");
__asm("nop");
if((P4DR&0X80)==1)
ch|=0x01;
//else ch|=0x00;
ch<<=1;
SCL_0
}
SDA_OUT
I2C_Stop();
return(ch);
}
//==================================================
void I2C_Ack(void)
{
SCL_0
SDA_0
SDA_1
SCL_0
/* to reduce IO power consunption */
}
//==================================================
void I2C_NoAck(void)
{
SDA_1
SCL_0
__asm("nop");
__asm("nop");
SCL_0
}
//=================================================
UCHAR E2PRom_Write_Byte(UCHAR address, UCHAR ch) //设备地址直接由函数内部计算生成,可以减少参数传入
{
UCHAR Device_address;
Device_address=address>>6; //将address右移六位,将值赋值给设备地址
Device_address&=0x02; //取最高有效位,屏蔽其它位
Device_address|=0xa0; //加上设备地址高位1010,得到最终设备地址,详细情况看DATASHEET
//romnum<<=1;
//romnum&=0x0E;
//romnum|=0xA0;
I2C_Start();
I2C_Write_byte(Device_address);
I2C_Write_byte(address);
I2C_Write_byte(ch);
I2C_Stop();
return(TRUE);
}
UCHAR E2PRom_Read_Byte(UCHAR address)
{
UCHAR ch;
UCHAR Device_address;
Device_address=address>>6; //将address右移六位,将值赋值给设备地址
Device_address&=0x02; //取最高有效位,屏蔽其它位
Device_address|=0xa0; //加上设备地址高位1010和写标志位1,得到最终设备地址,详细情况看DATASHEET,此处注意,读的时候要现写地址,故Device_address开始为写地址,后来为读地址
I2C_Start();
I2C_Write_byte(Device_address);
I2C_Write_byte(address);
Device_address&=0xa1;
I2C_Start();
I2C_Write_byte(Device_address);
ch = I2C_Receive_byte();
I2C_Stop();
return(ch);
}
|