⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom.c

📁 ATMEL 20C04 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 + -