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

📄 at24x.c

📁 功能:arm7平台的I2c驱动程序
💻 C
字号:

#include <w79e201.h>
#include "at24x.h"
//#define uchar unsigned char
//#define uint  unsigned int
#define __AT64__

sbit CLK24=P3^2;
sbit SIO24=P3^3;
sbit wp = P3^6;		//EEPROM写保护
sbit scl = P3^2;	//IIC CLK
sbit sda = P3^3;	//IIC DATA

void _CardSetClock24(uchar Level)
{
	if(Level){
		CLK24 = 1;
	}
	else{
		CLK24 = 0;
	}
}

uchar _CardReadIO24()
{
	uchar idata ctemp;
	ctemp = SIO24;
	return ctemp;
}
void _CardPutIO24(uchar IOData)
{
	SIO24=IOData;
}

//base functions
void delay10us24(uchar i)
{
	i = i*3;
	do{i--;}while(i>0);
	return;
}

void start24()
{
	_CardPutIO24(1);//SIO24=1;
	delay10us24(1);
	_CardSetClock24(1);//CLK24=1;
	delay10us24(1);
	_CardPutIO24(0);//SIO24=0;
	delay10us24(1);
	_CardSetClock24(0);//CLK24=0;
}


void stop24()
{
	_CardPutIO24(0);//SIO24=0;
	delay10us24(1);
	_CardSetClock24(1);//CLK24=1;
	delay10us24(1);
	_CardPutIO24(1);//SIO24=1;
	delay10us24(1);
	_CardSetClock24(0);//CLK24=0;
}


void clock24()
{
	_CardSetClock24(1);//CLK24=1;
	delay10us24(1);
	_CardSetClock24(0);//CLK24=0;
	delay10us24(1);
}


//24C01A-16
void writeack()
{
	_CardPutIO24(0);//SIO24=0;
	clock24();
	_CardPutIO24(1);//SIO24=1;
	return;
}


uchar readack()
{
	uchar idata sbtemp;
	_CardPutIO24(1);//SIO24=1;
	sbtemp=0;
	_CardSetClock24(1);//CLK24=1;
	sbtemp=0;
	sbtemp=0;
	sbtemp=0;
	sbtemp=0;
	sbtemp=(/*SIO24*/_CardReadIO24()==1?1:0);
	sbtemp=sbtemp;
	sbtemp=sbtemp;
	sbtemp=sbtemp;
	_CardSetClock24(0);//CLK24=0;
	sbtemp=sbtemp;
	return sbtemp;
}



uchar outb24(uchar outdata)
{
	uchar idata i;
	for(i=0;i<8;i++){
    	if(outdata&0x80)/*SIO24=1*/_CardPutIO24(1);else _CardPutIO24(0);//SIO24=0;
		outdata<<=1;
		clock24();
	}
	return readack();
}


uchar inb24()
{
	uchar idata indata=0,i;
	_CardPutIO24(1);//SIO24=1;
	for(i=0;i<8;i++){
		indata<<=1;
		indata+=(/*SIO24*/_CardReadIO24()==1?1:0);
		clock24();
	}
    return indata;
}
void read64c(uint offset,uint length,uchar  *buffer)
{
	uint idata i;
	start24();
	outb24(0xa0);
	outb24(offset/256);
	outb24(offset%256);
	start24();
	outb24(0xa1);
	for(i=0;i<length;i++){
    	buffer[i]=inb24();
		writeack();
	}
	stop24();
	for(i=0;i<32;i++)clock24();
	return;
}



void write64c(uint offset,uint length,uchar  *buffer)
{
	uint idata i,j;
	wp = 0;
	for(i=0;i<length;i++){
		start24();
		outb24(0xa0);
	    outb24(offset/256);
	    outb24(offset%256);
		outb24(buffer[i]);
		stop24();
		offset++;
		for(j=0;j<128;j++)clock24();
	}
	return;
}


⌨️ 快捷键说明

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