twi.c

来自「ATMEL TWI接口的EEPROM读写程序。支持8字节页写操作。支持32Kbi」· C语言 代码 · 共 199 行

C
199
字号
void starti2c()
{	uchar i=20;
	while(i--)
	{	sda=1;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		scl=1;
		_nop_();
		_nop_();
		_nop_();
		if(sda)
		{	_nop_();
			_nop_();
			_nop_();
			_nop_();
			sda=0;
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			scl=0;
			return;
		}
		_nop_();
		_nop_();		//1.2us
		_nop_();
		scl=0;
	}
}

void stopi2c()
{	sda=0;
	_nop_();
	_nop_();
	_nop_();
	scl=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	sda=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	scl=0;
}

void mack()
{	scl=0;
	sda=0;
	_nop_();		//min 0
	_nop_();
	_nop_();
	_nop_();
	scl=1;
	_nop_();		//min 0.6us
	_nop_();
	_nop_();
	_nop_();
	scl=0;
	_nop_();
	_nop_();
	_nop_();		//min 100ns
	_nop_();
	scl=0;
}
/*
void mnack()
{	sda=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	scl=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	scl=0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	sda=0;
}
*/
void cack()
{	sda=1;
	_nop_();
	_nop_();
	scl=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	ack=!sda;
	scl=0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}

uchar rdbyte()
{	uchar i,dat;
	sda=1;
	for(i=0;i<8;i++)
	{	scl=0;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		scl=1;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		dat=dat<<1;
		dat|=(uchar)sda;
	}
	scl=0;
	return(dat);
}


void wrbyte(uchar dat)
{	uchar i;
	for(i=0;i<8;i++)
	{	scl=0;
		sda=(bit)(dat&0x80);
		dat=dat<<1;
		_nop_();
		_nop_();
		scl=1;
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}
	scl=0;
}

void wrbytes(uchar idata *dataPtr,uchar romAddr,uchar n)
{	uchar i,romAddrBak,idata *dataPtrBak,m=30;
	i=n;romAddrBak=romAddr;dataPtrBak=dataPtr;
	while(m--)
	{	starti2c();
		wrbyte(0xa0);
		cack();
		if(!ack) continue;
		wrbyte(romAddrBak);
		cack();
		if(!ack) continue;
		for(;i>0;i--)
		{	wrbyte(*dataPtrBak++);
			cack();
			if(!ack) break;
		}
		if(i>0) continue;
		break;
	}
	stopi2c();
}

void rdbytes(uchar romaddr,uchar idata *dataPtr,uchar n)
{	uchar i;
	for(i=0;i<30;i++)
	{	starti2c();
		wrbyte(0xa0);
		cack();
		if(!ack) continue;
		wrbyte(romaddr);
		cack();
		if(!ack) continue;
		starti2c();
		wrbyte(0xa1);
		cack();
		if(!ack) continue;
		for(;n>0;n--)
		{	*dataPtr++=rdbyte();
			mack();
		}
		break;
	}
	stopi2c();
}

⌨️ 快捷键说明

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