📄 eeprom.c
字号:
#include <pic.h>
#include "Pindefine.h"
#include "variable.h"
#define Nop() asm("nop")
#define SDAMODE TRISB7
#define FM24C16addr 0xa0
#define FM24C16addr2 0xa8
#define DZSUM 6
#define TRUE 1
#define FALSE 0
bank1 para_data Para;
const unsigned char ParaDefault[]= //确省定值
{
0x01, //地址
0x00, //波特率
0x00, //PT高字节
0x01, //PT低字节
0x00, //CT高字节
0x01, //CT低字节
};
void I2C_Start(void);
void I2C_Stop(void);
void I2C_Wait(void);
unsigned char I2C_SendByte(unsigned char byte);
unsigned char I2C_ReceiveByte(void);
void SendAcknowledge(unsigned char ack);
unsigned char I2C_ReceiveByte(void);
unsigned char I2C_Read(unsigned char slvaddr,unsigned char address,unsigned char length,unsigned char *databuf);
unsigned char I2C_Write(unsigned char slvaddr,unsigned char address,unsigned char length,unsigned char *databuf);
char CheckParameter(void);
void Load_DefaultValue(void);
void FinishParams(void);
char LoadParameter(void);
unsigned char ReadParameter(void);
unsigned char WriteParameter(void);
extern void watchDOG(void);
extern void DelyNms(unsigned int Nms);
void I2C_Start(void)
{
SCLPort = 0;
SDAMODE = 0;
I2C_Wait();
SDA = 1;
I2C_Wait();
SCL = 1;
I2C_Wait();
SDA = 0;
I2C_Wait();
SCL = 0;
}
/***********************************************************************/
void I2C_Stop(void)
{
SDAMODE = 0;
I2C_Wait();
SDA = 0;
I2C_Wait();
SCL = 1;
I2C_Wait();
SDA = 1;
}
/***********************************************************************/
void I2C_Wait(void)
{
Nop();Nop();Nop();Nop();Nop();Nop(); Nop();Nop();Nop() ;Nop();Nop();Nop();
}
/***********************************************************************/
unsigned char I2C_SendByte(unsigned char byte)
{
unsigned char i,ack;
SDAMODE = 0;
I2C_Wait();
for (i = 0;i <= 7;i++)
{
if(byte & 0x80)
{
SDA=1;
}
else
{
SDA=0;
}
byte <<= 1;
SCL = 1;
I2C_Wait();
SCL = 0;
I2C_Wait();
}
SDA = 1;
Nop();
SDAMODE = 1;
I2C_Wait();
SCL = 1;
I2C_Wait();
if(SDA == 1)
{
ack = 0;
}
else
{
ack = 1;
}
SCL = 0;
SDAMODE = 0;
return(ack);
}
/***********************************************************************/
unsigned char I2C_ReceiveByte(void)
{
unsigned char i,byte = 0;
SDAMODE = 1;
I2C_Wait();
for(i = 0;i <= 7;i++)
{
SCL = 1;
I2C_Wait();
byte <<= 1;
if(SDA == 1)
{
byte |= 0x01;
}
SCL = 0;
}
return(byte);
}
/***********************************************************************/
void SendAcknowledge(unsigned char ack)
{
SDAMODE = 0;
I2C_Wait();
if(ack)
{
SDA = 1;
}
else
{
SDA = 0;
}
I2C_Wait();
SCL = 1;
I2C_Wait();
SCL = 0;
}
unsigned char I2C_Read(unsigned char slvaddr,unsigned char address,unsigned char length,unsigned char *databuf)
{
unsigned char i,j,ack;
for(j = 0;j < 3;j++)
{
I2C_Start();
ack = I2C_SendByte(slvaddr);
if(ack == 0)
{
I2C_Stop();
continue;
}
I2C_Wait();
ack = I2C_SendByte(address);
if(ack == 0)
{
I2C_Stop();
continue;
}
I2C_Wait();
I2C_Start();
ack = I2C_SendByte(slvaddr | 0x01);
if(ack == 0)
{
I2C_Stop();
continue;
}
Nop();
Nop();
for(i = 0;i < length;i++)
{
*(databuf+i) = I2C_ReceiveByte();
if(i < length-1)
{
SendAcknowledge(0);
}
else
{
SendAcknowledge(1);
}
}
I2C_Stop();
if(ack == 1)
{
break;
}
}
return(ack);
}
/***********************************************************************/
unsigned char I2C_Write(unsigned char slvaddr,unsigned char address,unsigned char length,unsigned char *databuf)
{
unsigned char i,j,ack;
WP = 0;
for(j = 0;j < 3;j++)
{
I2C_Start();
ack = I2C_SendByte(slvaddr);
if(ack == 0)
{
I2C_Stop();continue;
}
I2C_Wait();
ack = I2C_SendByte(address);
if(ack == 0)
{
I2C_Stop();continue;
}
for(i = 0;i < length;i++)
{
ack = I2C_SendByte(*(databuf+i));
if(ack == 0)
{
break;
}
}
if(ack == 0)
{
I2C_Stop();continue;
}
I2C_Stop();
if(ack == 1)
{
break;
}
}
return(ack);
}
char CheckParameter(void)
{
unsigned char *P,crc0,sum0,data,crc,sum;
char i;
P = &Para;
I2C_Read(FM24C16addr,0,1,&crc0);
I2C_Read(FM24C16addr,1,1,&sum0);
if((crc0==0x55)&&(sum0==0xaa)) //定值标志
{
crc=0;
sum=0;
I2C_Read(FM24C16addr,0x02,1,&crc0);
I2C_Read(FM24C16addr,0x03,1,&sum0);
for(i=4;i<DZSUM+4;i++)
{
I2C_Read(FM24C16addr,i,1,&data);
*P++ = data;
crc^=data;
sum^=data;
}
if((crc==crc0)&&(sum==sum0)) return TRUE;
}
return FALSE;
}
void Load_DefaultValue(void)
{
unsigned char i,*P;
P = &Para;
watchDOG();
for(i=0;i<DZSUM;i++) *P++ = ParaDefault[i];
I2C_Write(FM24C16addr,0x04,4,P++);
DelyNms(1);
I2C_Write(FM24C16addr,8,2,P++);
WP = 1;
FinishParams();
watchDOG();
}
void FinishParams(void)
{
unsigned char crc0,sum0,para;
char i;
crc0 = 0x55;
I2C_Write(FM24C16addr,0,1,&crc0);
DelyNms(1);
sum0 = 0xaa;
I2C_Write(FM24C16addr,1,1,&sum0);
DelyNms(1);
crc0=0;
sum0=0;
for(i=4;i<DZSUM+4;i++)
{
I2C_Read(FM24C16addr,i,1,¶);
crc0^=para;
sum0^=para;
}
I2C_Write(FM24C16addr,2,1,&crc0);
DelyNms(1);
I2C_Write(FM24C16addr,3,1,&sum0);
DelyNms(1);
WP = 1;
}
char LoadParameter(void) //调装置定值
{
if(CheckParameter()==FALSE)
{
Load_DefaultValue(); //调确省定值
if(CheckParameter()==FALSE)
{
return FALSE;
}
}
return TRUE;
}
unsigned char ReadParameter(void)
{
if(CheckParameter()==FALSE) Load_DefaultValue();
return TRUE; //调确省定值
}
unsigned char WriteParameter(void)
{
unsigned char *P;
*P = &Para;
I2C_Write(FM24C16addr,0x04,4,P++);
DelyNms(1);
I2C_Write(FM24C16addr,8,2,P++);
DelyNms(1);
WP = 1;
watchDOG();
FinishParams();
watchDOG();
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -