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

📄 eeprom.c

📁 pdh控制程序
💻 C
字号:
#ifndef	_EEPROM_C_
#define _EEPROM_C_

#include "api.h"

#if _LCD_MENU_

/*E2PROM的读写操作*/
void _delay(void)
{
	_nop_();_nop_();
}


void E2PROM_Delay()
{
	BYTE delaytime;

	for(delaytime=0x00;delaytime<0xf0;delaytime++)
	 	_nop_();
	for(delaytime=0x00;delaytime<0xf0;delaytime++)
		_nop_();
	for(delaytime=0x00;delaytime<0xf0;delaytime++)
		_nop_();
	for(delaytime=0x00;delaytime<0x80;delaytime++)
		_nop_();
}

void I2C_start(void)
{
	SDA=HIGH;	_delay();
	SCL=HIGH;	_delay();	_nop_();
	SDA=LOW;	_delay();
	SCL=LOW;	_delay();
}

void I2C_stop(void)
{
	SDA=LOW;	_delay();
	SCL=HIGH;	_delay();	_nop_();
	SDA=HIGH;	_delay();
	SCL=LOW;	_delay();
}

BYTE I2C_clock(void)
{
	BYTE sample;
	SCL	= HIGH;	_delay();	_nop_();
	sample = SDA;
	SCL	= LOW;	_delay();
	return sample;
}

BYTE I2C_send(BYTE I2C_data)
{
	register BYTE i;
	for(i=0; i<8; i++)
	{
		SDA	= (I2C_data&0x80) ? HIGH : LOW;
		I2C_data <<= 1;
		I2C_clock();
	}
	SDA	= HIGH;
	return ~I2C_clock();
}

BYTE I2C_receive(void)
{
	register BYTE i;
	BYTE I2C_data = 0;

	for(i=0; i<8; i++)
	{
		I2C_data <<= 1;
		if(I2C_clock())
			I2C_data++;
	}
	return I2C_data;
}

void I2C_Ack(void)
{
	SDA	= LOW;
	I2C_clock();
	SDA	= HIGH;
}

BYTE I2C_ReadData(WORD MemAddr, WORD DatLen, BYTE* DatBuf)
{
	BYTE idata I2C_DevAddr = 0, res = 0,temp;
	WORD idata i;

	I2C_start();
	I2C_DevAddr = 0xa0;
	I2C_DevAddr |= ((MemAddr/0x100)&0x07)<<1;
	if(I2C_send(I2C_DevAddr) && I2C_send((BYTE)(MemAddr&0xff)))
	{
		I2C_start();
		I2C_DevAddr |= 0x01;
		if(I2C_send(I2C_DevAddr))
		{
			for(i=0; i<DatLen; i++)
			{
				DatBuf[i] = I2C_receive();
				temp= DatBuf[i] ;
				if(i==DatLen-1)
				{
					SDA	= HIGH;
					I2C_clock();
					I2C_stop();
				}
				else
					I2C_Ack();
			}
			res	= 1;
		}
		else	res	= 0;
	}
	else	res	= 0;
	if(res==0)	I2C_stop();
	return res;
}

BYTE I2C_Write16BData(WORD MemAddr, BYTE DatLen, BYTE* DatBuf)
{
	BYTE idata I2C_DevAddr = 0, res = 0, i = 0;

	I2C_start();
	I2C_DevAddr	= 0xa0;
	I2C_DevAddr |= ((MemAddr/0x100)&0x07)<<1;
	if(I2C_send(I2C_DevAddr) && I2C_send((BYTE)(MemAddr&0xff)))
	{
		do	res	= I2C_send(DatBuf[i++]);
		while(res && i<DatLen);
		I2C_stop();
	}
	else	res	= 0;
	if(res==0)	I2C_stop();
	return res;
}

void I2C_WriteData(WORD MemAddr, WORD DatLen, BYTE* DatBuf)
{
	WORD idata bMemAddr = 0;
    BYTE idata i = 0 , Temp;
	BYTE idata iCnt, DataCnt, DataiCnt, jCnt;
	BYTE idata DataBuff[0x10];

	DataCnt = (BYTE)(DatLen/0x10);
	DataiCnt = (BYTE)(DatLen%0x10);
	jCnt = 0;
	for(iCnt=0; iCnt<(DataCnt+1); iCnt++,jCnt++)
	{
		bMemAddr = MemAddr+iCnt*0x10;
		if(jCnt < DataCnt)
			Temp = 0x10;
		else	Temp = DataiCnt;

		for(i=0; i<Temp; i++)
			DataBuff[i] = DatBuf[i+iCnt*0x10];
		I2C_Write16BData(bMemAddr, Temp, DataBuff);
		E2PROM_Delay();//16字节需要一个10ms延时
		E2PROM_Delay();//16字节需要一个10ms延时
	}
}

/*E2PROM读写操作*/

#endif

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -