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

📄 rw24cxx.c

📁 24c08-24c31EEPROM初始化
💻 C
字号:
/*
	读/写24CXX(xx=01,02,04,08,16...)函数,
	CPU:H8/300,晶振:16MHz/2分频,读写速率:150KHz
	2000.05.05	韦忠于
	BP:(0755)3322666-3080
*/
#include "3334f.h"

#include "840def.h"
#include "840ext.h"

#define INTEST		P4.DR.BIT.B6		/* 写保护脚 */
#define INSCL		P2.DR.BIT.B7

#define INSDA		P4.DR.BIT.B7 
#define	INSDADDR	P4.DDR.BIT.B7		/* SDA的输入/输出控制位 */

#define RD24COMM	0xA1
#define WR24COMM	0xA0

#define AT24C08							/* 写入的芯片为24C08或24C16 */
/*
#define UINT unsigned int
#define UCHAR unsigned char
*/

void rd_24c(UINT addr,UCHAR len,UCHAR *buffer);
void wr_24c(UINT addr,UCHAR len,UCHAR *buffer);

UCHAR byte_read(UINT addr);
void byte_write(UCHAR data,UINT addr);

void delay_2us(void)
{
	UCHAR i;

	for(i=0;i<2;i++);
}

void begin24(void)
{
	INSDADDR=1;

	INSCL=0;					/* 设置起始位 */
	delay_2us();
	INSDA=1;
	delay_2us();
	INSCL=1;
	delay_2us();
	INSDA=0;
	delay_2us();
	INSCL=0;
}

void stop24(void)
{
	INSDADDR=1;

	INSCL=0;
	delay_2us();
	INSDA=0;
	delay_2us();
	INSCL=1;
	delay_2us();
	INSDA=1;
	delay_2us();
	INSCL=0;
}

void bwr_24c(UCHAR data)
/* 将 data写入 EEPROM */
{
	UCHAR i;

	INSDADDR=1;

	for(i=0;i<8;i++) {
		delay_2us();
		if(data&0x80) INSDA=1;
		else INSDA=0;
		data<<=1;
		delay_2us();
		INSCL=1;
		delay_2us();
		INSCL=0;
	}
}

void romack(void)
{
	INSDADDR=0;					/* 置输入状态 */

	INSCL=0;
	delay_2us();
	INSCL=1;
	delay_2us();
	/* if(INSDA) */				/* 检测回应,由此可判断器件是否正确 */
	INSCL=0;
	delay_2us();
	INSDADDR=0;					/* SETB INSDA ,SDA这时为输入脚,此句实际上无效 */
}

UCHAR brd_24c(void)
/* 从 EEPROM 中读取一个字节的数据 */
{
	UCHAR i;
	UCHAR temp=0;

	INSDADDR=0;					/* put PIN INSDA into input status */

	for(i=0;i<8;i++) {
		temp<<=1;
		delay_2us();
		INSCL=1;
		delay_2us();
		temp|=INSDA;
		INSCL=0;
	}
	return temp;
}

void devack(void)
{
	INSDADDR=1;

	INSCL=0;  			   	/* acknowledge to EEPROM */
	delay_2us();
	INSDA=0;
	delay_2us();
	INSCL=1;
	delay_2us();
	INSCL=0;
	delay_2us();
	INSDADDR=0;				   	/* SETB INSDA */
}

void devacke(void)
{
	INSCL=0;			   		/* acknowledge read end to EEPROM */
	delay_2us();
	INSDADDR=0;					/* SETB INSDA */
	delay_2us();
	INSCL=1;
	delay_2us();
	INSCL=0;
	delay_2us();
	INSDADDR=0;					/* SETB INSDA */
}

void delay_5ms(void)
{
	UINT i;

	for(i=0;i<10000;i++);
}

void wr_addr(UINT addr)
{
	UCHAR lo_addr,hi_addr;			/* 地址的低、高字节 */

	lo_addr=addr;
	hi_addr=addr>>8;

	begin24();
	hi_addr<<=1;
	hi_addr&=0x0e;					/* 1110 */
	hi_addr|=WR24COMM;
	bwr_24c(hi_addr);
	romack();
	bwr_24c(lo_addr);
	romack();
}

void rd_24c(UINT addr,UCHAR len,UCHAR *buffer)
/*
读24CXX
addr:起始地址,len:读取长度,buffer:存放字符串的起始地址
*/
{
	UCHAR hi_addr;		/* 读取地址的低、高字节 */
	UCHAR temp,rd_len;

	if(!len) return;
	hi_addr=addr>>8;

	wr_addr(addr);
	begin24();
	temp=hi_addr;
	temp<<=1;
	temp&=0x0e;
	temp|=RD24COMM;
	bwr_24c(temp);
	romack();
	for(rd_len=0;rd_len<(len-1);rd_len++) {
		buffer[rd_len]=brd_24c();	/* read a byte */
		devack();
	}
	buffer[rd_len]=brd_24c();
	devacke();
	stop24();
}

void wr_24c(UINT addr,UCHAR len,UCHAR *buffer)
/*
写24CXX
addr:起始写入地址
len:写入长度
buffer:需写入的数据
*/
{
	UCHAR wr_len;

	if(!len) return;
	INTEST=0;					/* 去掉写保护 */
    	wr_addr(addr);

	for(wr_len=0;wr_len<len;wr_len++) {
		bwr_24c(buffer[wr_len]);
		romack();
		if(wr_len==(len-1)) {		/* 写入结束 */
			stop24();
			delay_5ms();
			delay_5ms();
			break;
		}
		addr++;
#ifdef AT24C08		/* 24C08/24C16 */
		if((addr & 0x0f) == 0) {	/* 另一页开始 */
#else				/* 24C01A/24C02/24C04 */
		if((addr & 0x07) == 0) {	/* 另一页开始 */
#endif
			stop24();
			delay_5ms();
			wr_addr(addr);
		}
	}
	INTEST=1;
}

UCHAR byte_read(UINT addr)
/*
从24CXX中读取一个字符
addr:读取地址
*/
{
	UCHAR temp[2];

	rd_24c(addr,1,temp);
	return temp[0];
}

void byte_write(UCHAR data,UINT addr)
/*
写24CXX
data:需写入的数据
addr:起始写入地址
*/
{
	UCHAR temp[2];

	temp[0]=data;
	wr_24c(addr,1,temp);
}

⌨️ 快捷键说明

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