📄 24lc02.c
字号:
#include "SysDef.h"
/*
unsigned char E2ACK_OK;
void DelayTime(unsigned int value);
int E2PROM_SelfCheck();
void WriteEEPROM (unsigned int wOffset,unsigned char *str,unsigned char count);
void ReadEEPROM(unsigned int wOffset,unsigned char *str,unsigned char count);
//==============================================================================================
//延时
//==============================================================================================
//#define E2P_Delay 5*3 //e2p's CLOCK Freq 100KHz(
//#define Delay_5ms 3000//3000*3
#define E2P_Delay 90*3
#define Delay_5ms 5000*3
#define EEPROM 0xAE
//=============================================================================================
void DelayTime(unsigned int value)
{
while(--value);
}
//=============================================================================================
//"提供i2c总线工作时序中的起始位(SCL为高时SDA的一个下降沿,而后两线都为低)
//=============================================================================================
void Start(void)
{
IICEOUT &= ~(IICESDA + IICESCL);
IICEDIR &= ~(IICESDA + IICESCL); //SCL and SDA set to inputs, signals go high due to pull-up resistors
DelayTime(E2P_Delay);
IICEDIR |= IICESDA; //Set to output, data low so SDA = 0
DelayTime(E2P_Delay);
IICEDIR |= IICESCL; //Set to output, data low so SCL = 0
DelayTime(E2P_Delay);
}
//=============================================================================================
//提供i2c总线工作时序中的停止位
//=============================================================================================
void Stop(void)
{
IICEDIR |= IICESDA; //Set to output, data low so SDA = 0
DelayTime(E2P_Delay);
IICEDIR &= ~IICESCL; //Set to input, SCL = 1 due to pull-up
DelayTime(E2P_Delay);
IICEDIR &= ~IICESDA; //Set to input, SDA = 1 due to pull-up
DelayTime(E2P_Delay);
}
//=============================================================================================
//=============================================================================================
void Clock(void)
{
DelayTime(E2P_Delay);
IICEDIR &= ~IICESCL; //Set to input, SCL = 1 due to pull-up
DelayTime(E2P_Delay);
IICEDIR |= IICESCL; //Set to output, data low so SCL = 0
DelayTime(E2P_Delay);
IICEDIR &= ~IICESDA; //Set to input, SDA = 1 due to pull-up
}
//=============================================================================================
//=============================================================================================
void NAck(void)
{
IICEDIR &= ~IICESDA; //Set to input, SDA = 1 due to pull-up
Clock();
}
//=============================================================================================
//=============================================================================================
void Ack(void)
{
if((IICEIN & IICESDA) == IICESDA) //"高电平
{
E2ACK_OK=0;
}
else
{
E2ACK_OK=0x55;
}
//P6DIR |= IICESDA; //Set to output, data low so SDA = 0
Clock();
}
void MCUAck()
{
IICEDIR |= IICESDA; //Set to output, data low so SDA = 0
Clock();
}
//=============================================================================================
//=============================================================================================
void OutByte(unsigned char dd)
{
unsigned char i;
for(i=8;i>0;i--)
{
if(dd & 0x80) //Only take the first bit
{
IICEDIR &= ~IICESDA; //Set to input, SDA = 1 due to pull-up
}
else
{
IICEDIR |= IICESDA; //Set to output, data low so SDA = 0
}
dd <<= 1;
Clock();
}
}
//=============================================================================================
//=============================================================================================
unsigned char InByte(void)
{
unsigned char i,dd=0;
for(i=8;i>0;i--)
{
dd <<= 1;
IICEDIR &= ~IICESCL; //Set to input, SCL = 1 due to pull-up
DelayTime(E2P_Delay);
if(IICEIN & IICESDA) dd ++;
IICEDIR |= IICESCL; //Set to output, data low so SCL = 0
DelayTime(E2P_Delay);
}
return dd;
}
unsigned char Addr;
void ReadEEPROM(unsigned int wOffset,unsigned char *str,unsigned char count) //"Sequential READ
{
Start ();
OutByte (EEPROM); //"write ADDR(R/W=W)
Ack();
Addr = wOffset%256;
OutByte(Addr);
Ack();
Start ();
OutByte (EEPROM | 1); //"write CONTRL BYTE(R/W=R)
Ack ();
while(count!=1) //"read COUNT-1 byte
{
*str = InByte();
MCUAck();
str++;
count--;
}
*str = InByte(); //"read the last byte
NAck ();
Stop ();
}
void WriteEEPROM (unsigned int wOffset,unsigned char *str,unsigned char count)
{
//"дE2
//"取消写保护
Start ();
OutByte(EEPROM);
Ack();
Addr = wOffset%256;
OutByte(Addr);
Ack ();
for(;count!=0;count--)
{
OutByte (*str);
Ack ();
str++;
}
Stop ();
}
int E2PROM_SelfCheck()
{
int iResult = 0;
unsigned char uchTemp;
for(int i =0; i<3; i++)
{
uchTemp = 0x55;
WriteEEPROM(0x10, &uchTemp, 1);
DelayTime(Delay_5ms);
DelayTime(Delay_5ms);
ReadEEPROM(0x10, &uchTemp,1);
if(uchTemp == 0x55)
{
uchTemp = 0xFF;
WriteEEPROM(0xFE, &uchTemp, 1);
iResult = 1;
break;
}
}
return iResult;
}
*/
#define deviceaddress 0xAE //AT24C02的设备地址
#define SCL_H P1OUT |= BIT6
#define SCL_L P1OUT &= ~BIT6
#define SDA_H P1OUT |= BIT7
#define SDA_L P1OUT &= ~BIT7
#define SDA_in P1DIR &= ~BIT7 //SDA改成输入模式
#define SDA_out P1DIR |= BIT7 //SDA变回输出模式
#define SDA_val P1IN&BIT7 //SDA的位值
#define TRUE 1
#define FALSE 0
union
{
unsigned int UintV;
uchar Bt[2];
}unionUint;
/*******************************************
函数名称:delay
功 能:延时约15us的时间
参 数:无
返回值 :无
********************************************/
void IintIIC()
{
P1DIR |= BIT6 + BIT7; //设置相应端口为输出状态
P1OUT |= BIT6 + BIT7;
}
void DelayTime(unsigned int value)
{
while(--value);
}
void delay(void)
{
uchar i;
for(i = 0;i < 100;i++)
_NOP();
}
/*******************************************
函数名称:delay_10ms
功 能:延时约6ms,等待EEPROM完成内部写入
参 数:无
返回值 :无
********************************************/
void delay_10ms(void)
{
uint i = 2000;
while(i--);
}
/*******************************************
函数名称:start
功 能:完成IIC的起始条件操作
参 数:无
返回值 :无
********************************************/
void start(void)
{
SCL_H;
SDA_H;
delay();
SDA_L;
delay();
SCL_L;
delay();
}
/*******************************************
函数名称:stop
功 能:完成IIC的终止条件操作
参 数:无
返回值 :无
********************************************/
void stop(void)
{
SDA_L;
delay();
SCL_H;
delay();
SDA_H;
delay();
}
/*******************************************
函数名称:mack
功 能:完成IIC的主机应答操作
参 数:无
返回值 :无
********************************************/
void mack(void)
{
SDA_L;
_NOP(); _NOP();
SCL_H;
delay();
SCL_L;
_NOP();_NOP();
SDA_H;
delay();
}
/*******************************************
函数名称:mnack
功 能:完成IIC的主机无应答操作
参 数:无
返回值 :无
********************************************/
void mnack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
delay();
SCL_L;
_NOP(); _NOP();
SDA_L;
delay();
}
/**********检查应答信号函数******************/
/*如果返回值为1则证明有应答信号,反之没有*/
/*******************************************
函数名称:check
功 能:检查从机的应答操作
参 数:无
返回值 :从机是否有应答:1--有,0--无
********************************************/
uchar check(void)
{
uchar slaveack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_in;
_NOP(); _NOP();
slaveack = SDA_val; //读入SDA数值
SCL_L;
delay();
SDA_out;
if(slaveack) return FALSE;
else return TRUE;
}
/*******************************************
函数名称:write1
功 能:向IIC总线发送一个1
参 数:无
返回值 :无
********************************************/
void write1(void)
{
SDA_H;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/*******************************************
函数名称:write0
功 能:向IIC总线发送一个0
参 数:无
返回值 :无
********************************************/
void write0(void)
{
SDA_L;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/*******************************************
函数名称:write1byte
功 能:向IIC总线发送一个字节的数据
参 数:wdata--发送的数据
返回值 :无
********************************************/
void write1byte(uchar wdata)
{
uchar i;
for(i = 8;i > 0;i--)
{
if(wdata & 0x80) write1();
else write0();
wdata <<= 1;
}
SDA_H;
_NOP();
}
/*******************************************
函数名称:writeNbyte
功 能:向IIC总线发送N个字节的数据
参 数:outbuffer--指向发送数据存放首地址
的指针
n--数据的个数
返回值 :发送是否成功的标志:1--成功,0--失败
********************************************/
uchar writeNbyte(uchar * outbuffer,uchar n)
{
uchar i;
for(i = 0;i < n;i++)
{
write1byte(* outbuffer);
if(check())
{
outbuffer++;
}
else
{
stop();
return FALSE;
}
}
stop();
return TRUE;
}
/*******************************************
函数名称:read1byte
功 能:从IIC总线读取一个字节
参 数:无
返回值 :读取的数据
********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -