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

📄 i2c.c

📁 S3C44B0的硬件I2C实现
💻 C
字号:
#define _I2C_Define
#include "include.h"

BYTE NoACK;
#ifdef HW_IIC_INCLUDE
//=================================================================
void I2CNop(void)
{
	unsigned char i;
	for (i = 0; i < 50; i++)
			;
}

void I2CStart(BYTE Mode, BYTE DevAddr)
{
	rIICDS	= DevAddr;
	rIICCON	= 0xAF; //enable ACK,interrupt
	rIICSTAT	= (Mode << 6) | 0x30;
	while(!(rIICCON & MASK_BIT(4)))
		;	//wait until devaddr send finished
}

void I2CStop(void)
{
	rIICSTAT	&= ~MASK_BIT(5);
	rIICCON &= ~MASK_BIT(4);	
}

BYTE I2CWaitACK()
{
	NoACK = rIICSTAT & MASK_BIT(0);
	return NoACK;
}

void I2CSendOneByte(BYTE ByteData)
{
	rIICDS	= ByteData;
	rIICCON &= ~MASK_BIT(4);
	while(!(rIICCON & MASK_BIT(4)))
		;	//wait until send byte finished
}

BYTE I2CReceiveOneByte(BYTE LastBit)
{
	if (LastBit)
		rIICCON = 0x2F;
	else
		rIICCON = 0xAF;
	while(!(rIICCON & MASK_BIT(4)))
		;	//wait until receive one byte
	return rIICDS;
}

void I2C_Write(BYTE DevAddr, BYTE SubAddr, BYTE *DataPstr, BYTE DataLength)
{
	#define	IICRETRYMAX		3
	BYTE *CurrDataPstr, CurrLength, I2CRetryTimes;

	I2CRetryTimes = 0;
	do {
		NoACK = 0x0;
		I2CRetryTimes++;
		CurrDataPstr = DataPstr;
		CurrLength	=	DataLength;
		
		I2CStart(MASTRT, DevAddr);
		
		I2CSendOneByte(SubAddr);
		
		while(CurrLength != 0)
		{
			I2CSendOneByte(*CurrDataPstr);
			CurrDataPstr++;
			CurrLength--;
		}
		I2CStop();
		I2CNop();

		I2CStart(MASTRT, DevAddr);
		I2CWaitACK();
		I2CStop();
	}while(I2CRetryTimes < IICRETRYMAX && NoACK != 0);
}

void I2C_Read(BYTE DevAddr, BYTE SubAddr, BYTE *DataPstr, BYTE DataLength)
{
	BYTE *CurrDataPstr, CurrLength;

	CurrDataPstr = DataPstr;
	CurrLength	=	DataLength;
		
	I2CStart(MASTRT, DevAddr);
	I2CSendOneByte(SubAddr);
	I2CStart(MASTRR, DevAddr);

	while(CurrLength != 1)
	{
		*CurrDataPstr = I2CReceiveOneByte(0);
		CurrDataPstr++;
		CurrLength--;
	}
	*CurrDataPstr = I2CReceiveOneByte(1);

	I2CStop();
}
#endif

⌨️ 快捷键说明

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