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

📄 i2c.c

📁 i2c读写代码C语言
💻 C
字号:
/*****************************************************************/
/**Objective:IIC Module 										**/
/*****************************************************************/
/**Auther	:Seal Luo											**/
/**Date		:2004-04-06											**/
/**CopyRight:C*Core 2004										**/
/*****************************************************************/
#include "IICReg.h"

extern	void Delayms(uint16 uiTime);

/*--
	Function:Generate a start signal on I2C bus
			Input:Mode	0:slave		1:master
			return void
--*/
void	I2C_Start(UCHAR8 ucMode,UCHAR8 ucFistAddr)
{
	UCHAR8	ucReg;

/* Slave mode */
	if(ucMode == SLAVE_MODE)
	{
		/* enable control */
		ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
		ucReg |=0x01;
		write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
		Delayms(10);

		/* enable interrupt */
		ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
		ucReg |=0x02;
		write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);

	}

/*Master Mode */
	if(ucMode == MASTER_MODE)
	{

		/* enable control */
                ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);

		ucReg |=0x01;
		write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);

		Delayms(10);
                 /* enable interrupt */
		ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);

		ucReg |=0x02;
		write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);


		/* config I2CSA */
		ucReg = SLAVE_ADDRESS;
		write_port_byte( I2C_BASE_ADDRESS + I2C_SLAVE_ADDRESS_REG , ucReg);

		/*config I2CCP */
		ucReg = CLOCK_PRESCALER;
		write_port_byte( I2C_BASE_ADDRESS + I2C_CLOCK_PRESCALAR_REG , ucReg);
                /* write slave address */
        ucReg = ucFistAddr;

		write_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG , ucReg);

        /* check bus whether IDLE */

		do
		{
			ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);

		}while((ucReg>>3)==1);

		/* change MSMODE 1 to 0 */
		ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);

		ucReg |= 0x04;
		write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);

	}

}


/*--
	Function:I2C Check ACK
			Input: void
			Return:1->no receive ACK     2->receive ACK		4->receive AACK

--*/
UCHAR8	I2C_Check_ACK(void)
{
	UCHAR8	bRet = 0x01;
	UCHAR8	ucReg;
	/* read status register */
	ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);

	if((ucReg & 0x01)==0x01)
	{
		bRet <<=1;
	}
	if((ucReg & 0x02)==0x02)
	{
		bRet <<=2;
	}

	return bRet;

}


/*--
	Function:I2C generate a stop signal
			Input: void
			Return:void

--*/
void	I2C_Stop(void)
{
	UCHAR8 ucReg;
	/* change MSMODE 1 to 0 */
	ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);
	ucReg &= 0xfb;
	write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);


}



/*--
	Function:I2C write data to slave
			Input:

--*/
void	I2C_Write(UCHAR8 ucFistAddr,UCHAR8 ucData[],uint16 uiLength)
{
		UCHAR8	ucReg;
		uint16	i;
                ucFistAddr &= 0xfe;
		/* send start signal */
		I2C_Start(MASTER_MODE,ucFistAddr);

		do
		{
			/* read status register */
			ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
			if((ucReg & I2C_AACK)!=0 )
				goto Exit;

		}while((ucReg & I2C_TF) != I2C_TF);


		/* check whether receive ack */
		for(i=0;i<uiLength;i++)
		{

			write_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG , ucData[i]);
			do
			{
				/* read status register */
				ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
				if((ucReg & I2C_AACK)!=0 )
					goto Exit;

			}while((ucReg & I2C_TF) != I2C_TF);
		}

Exit:
		/* send stop signal */
		I2C_Stop();


}


/*--
	Function:I2C read data from slave
			Input:

--*/
void	I2C_Read(UCHAR8 ucFistAddr,UCHAR8 ucLength)
{
		UCHAR8	ucReg,tmp;
		uint16	i;
  
		ucFistAddr |= 0x01;
		/* send start signal */
		I2C_Start(MASTER_MODE,ucFistAddr);

		do
		{
			/* read status register */
			ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);
			if((ucReg & I2C_AACK)!=0 )
				goto Exit;

		}while((ucReg & I2C_RC)!=I2C_RC );

		/* read control register */
		ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);

		if(ucLength>1)
			ucReg |= 0x08;
		else
		{
			ucReg &= 0xf7;
			write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
			do
			{
				/* read status register */
				ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);

			}while((ucReg & I2C_TF)!= I2C_TF);

//			pI2cBuf[0] = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
			tmp = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
			write_port_byte(PMC_DATA_REG,tmp);
			goto Exit;
		}
		write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);
		/* check whether receive ack */
		for(i=0;i<ucLength;i++)
		{

			do
			{
				/* read status register */
				ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_STATUS_REG);


			}while((ucReg & I2C_TF)!= I2C_TF);

			/*read data form bus when tf = 1 */
		//	pI2cBuf[i] = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
            tmp = read_port_byte( I2C_BASE_ADDRESS + I2C_DATA_REG );
			write_port_byte(PMC_DATA_REG,tmp);//Write data into PMC port
			
			/* read status register */
			ucReg = read_port_byte(I2C_BASE_ADDRESS + I2C_CONTROL_REG);

			if(i== ucLength -1)
				goto Exit;
			if(i == (ucLength - 2))
				ucReg &= 0xf7;
			else
				ucReg |= 0x08;
			write_port_byte( I2C_BASE_ADDRESS + I2C_CONTROL_REG , ucReg);


		}

Exit:
		/* send stop signal */
		I2C_Stop();
}


⌨️ 快捷键说明

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