📄 eeprom.c
字号:
#include "p18f87j10.h"
#include "public.h"
#include "eeprom.h"
#include "delays.h"
#include "dwt_lcd_config.h"
#define WRITE 0xA0
#define READ 0xA1
struct EEPARA eepara;
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void delay(void)
{
Delay10TCYx(2);
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void I_start(void)
{
ECLK = 0;
EDATA_OUT;
EDATA = 1;
delay();
ECLK = 1;
delay();
EDATA = 0;
delay();
ECLK = 0;
delay();
EDATA = 1;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void I_stop(void)
{
ECLK = 0;
EDATA_OUT;
EDATA = 0;
delay();
ECLK = 1;
delay();
EDATA = 1;
delay();
ECLK = 0;
delay();
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void I_init(void)
{
ECLK = 0;
I_stop();
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
char I_clock(void)
{
//bit sample;
char sample, i;
i = 0;
ECLK = 1;
EDATA_IN;
delay();
i = EDATA;
if (i == 1)
{
sample = 1;
}
else
{
sample = 0;
}
ECLK = 0;
delay();
return (sample);
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void I_clock1(void)
{
ECLK = 1;
delay();
ECLK = 0;
delay();
}
//----------------------------------------------------------------------------------
void reset_eeprom(void)
//----------------------------------------------------------------------------------
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
EDATA_OUT;
I_start();
EDATA = 1; //Initial state
for (i = 0; i < 9; i++)
//9 SCK cycles
{
ECLK = 1;
delay();
ECLK = 0;
delay();
}
I_start();
I_stop();
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
char I_send(char I_data)
{
char i;
EDATA_OUT;
for (i = 0; i < 8; i++)
{
//EDATA=(bit)(I_data&0x80);
if ( (I_data &0x80) == 0x80)
{
EDATA = 1;
}
else
{
EDATA = 0;
}
I_data = I_data << 1;
I_clock1();
}
EDATA = 1;
if (I_clock() == 1)
{
return (0);
}
else
{
return (1);
}
//return(~I_clock());
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
char I_receive(void)
{
char I_data = 0;
char i;
for (i = 0; i < 8; i++)
{
I_data *= 2;
if (I_clock() == 1)
{
I_data++;
}
}
return (I_data);
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void I_ACK(void)
{
EDATA_OUT;
EDATA = 0;
I_clock1();
EDATA = 1;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
char E_address(char Address)
{
I_start();
if (I_send(WRITE) )
{
return (I_send(Address) );
}
else
{
return (0);
}
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
char E_read_block(void)
{
uchar i, j;
uchar *p;
uchar temp[10], crc = 2;
j = sizeof(eepara);
p = (void *)&eepara;
if (E_address(0) )
{
I_start();
if (I_send(READ) )
{
for (i = 0; i < j; i++)
{
temp[i] = I_receive();
if(i >= (j-1))
{
if(crc != temp[i])
return 0;
// return 1;
}
else
crc += temp[i];
I_ACK();
}
I_clock1();
I_stop();
for(i = 0; i < j; i++)
{
*p = temp[i];
p++;
}
return (1);
}
else
{
I_stop();
return (0);
}
}
else
{
I_stop();
}
return (0);
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void wait_50ms(void)
{
int i;
for (i = 0; i < 10000; i++)
;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void wait_5ms(void)
{
int i;
for (i = 0; i < 1000; i++)
;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void wait_2ms(void)
{
int i;
for (i = 0; i < 50; i++)
;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
char E_write_block(void)
{
char i;
uchar *p;
uchar crc = 2;
p = (void *)&eepara;
for (i = 0; i < (sizeof(eepara)-1); i++)
{
crc += *p;
p++;
}
*p = crc;
p = (void *)&eepara;
for (i = 0; i < sizeof(eepara); i++)
{
if (E_address(i) && I_send(*p) )
{
p++;
I_stop();
wait_5ms();
}
else
{
return (0);
}
}
return (1);
}
void Eeprom_Init(void)
{
TRISJbits.TRISJ4 = IO_OUTPUT; //E2PROM CONTROL
TRISJbits.TRISJ5 = IO_OUTPUT;
EWP = 1;
reset_eeprom();
}
uchar Eeprom_Read(void )
{
uchar i, ok, crc;
uchar *p;
for(ok = 0, i = 0; i < 10; i++)
{
reset_eeprom();
wait_5ms();
if(E_read_block() == 1)
{
ok = 1;
break;
}
}
if(!ok)
{
p = (void *)&eepara;
eepara.Ifr_Warning_Ceiling = 90;
eepara.address = 1;
eepara.speed = 24;
eepara.verh = SOFT_VERH;
eepara.verl = SOFT_VERL;
for(crc = 2, i = 0; i < (sizeof(eepara)-1); i++)
{
crc += *p;
p++;
}
eepara.crc = crc;
}
return ok;
}
uchar Eeprom_Write(void)
{
uchar i, j, ok;
for(i = 0, ok = 0; i< 10; i++)
{
reset_eeprom();
wait_5ms();
EWP = 0;
j = E_write_block();
EWP = 1;
if(j == 1)
{
ok = 1;
break;
}
}
return ok;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -