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

📄 iic.c

📁 i2C 驱动 pxa 270 ii2c 驱动
💻 C
字号:
#include "iic.h"

XLLP_BOOL_T XllpPI2cInit(P_XLLP_PI2C_T I2C_regs, 
						 P_XLLP_GPIO_T gpio, 
						 P_XLLP_CLKMGR_T clkMgr, 
						 XLLP_UINT32_T dev_id)
{

	clkMgr->cken |=  XLLP_CLKEN_PWRI2C;

	I2C_regs->PCFR |= 0x40;
	
	I2C_regs->ICR = 0;
	/* Setup I2C slave address */
	I2C_regs->ISAR =  dev_id;

	I2C_regs->ICR = XLLP_ICR_SCLEA;
	I2C_regs->ICR |= XLLP_ICR_UIE;

	return(XLLP_FALSE);
}

/* 
 * Wait for Receive empty status
 *
 * RETURNS: 0 success
 *          1 failure
 */
 
XLLP_BOOL_T XllpI2cRxFull(P_XLLP_PI2C_T I2C_regs, 
						  XLLP_OST_T *pOSTRegs, 
						  XLLP_INT32_T timeout)
{
	XLLP_UINT32_T temp;
	XLLP_UINT32_T i,j;
	
	while (timeout--)
	{
		temp = I2C_regs->ISR;
		if ((temp & XLLP_ISR_IRF) == XLLP_ISR_IRF)
		{
			I2C_regs->ISR = temp | XLLP_ISR_IRF;
			return XLLP_FALSE;
		}
		// delay 1 ms here
		//XllpOstDelayMilliSeconds(pOSTRegs, 1);
		for(i=0;i<10000;i++)
			for(j=0;j<10000;j++)
				;
	}

  return XLLP_TRUE;
}

/* Wait for transmit empty status
 *
 * RETURNS: 0 success
 *          1 failure
 */
XLLP_BOOL_T XllpI2cTxEmpty(P_XLLP_PI2C_T I2C_regs, 
						   XLLP_OST_T *pOSTRegs, 
						   XLLP_INT32_T timeout)
{
	XLLP_UINT32_T temp;
	XLLP_UINT32_T i,j;
	while (timeout--)
	{
		temp = I2C_regs->ISR;
		if((temp & XLLP_ISR_ITE) == XLLP_ISR_ITE)
		{
			I2C_regs->ISR = temp | XLLP_ISR_ITE;
			if ((temp & XLLP_ISR_ALD) == XLLP_ISR_ALD)
			{
				I2C_regs->ISR |= XLLP_ISR_ALD;
			}
			return XLLP_FALSE;
		}
		// delay 1 ms here
		//XllpOstDelayMilliSeconds(pOSTRegs, 1);
		for(i=0;i<10000;i++)
			for(j=0;j<10000;j++)
				;
	}
	return XLLP_TRUE;
}


XLLP_BOOL_T XllpI2CWrite(P_XLLP_PI2C_T I2C_regs, 
						 XLLP_OST_T *pOSTRegs, 
						 XLLP_UINT8_T slaveAddr, 
						 const XLLP_UINT8_T * bytesBuf,
						 XLLP_UINT32_T bytesCount, 
						 XLLP_BOOL_T bSendStop)
{
	XLLP_UINT32_T reg;
	//int timer = 0;
	
	I2C_regs->IDBR = (slaveAddr << 1) & ~XLLP_IDBR_MODE;
	reg = I2C_regs->ICR;
	reg |= (XLLP_ICR_START | XLLP_ICR_TB);
	reg &= ~(XLLP_ICR_STOP | XLLP_ICR_ALDIE);
	I2C_regs->ICR = reg;

	if (XllpI2cTxEmpty(I2C_regs, pOSTRegs,20) == XLLP_TRUE)
	{
		//RETAILMSG(1, (TEXT("XllpI2CWrite:send addr failed!\r\n")));
		return XLLP_TRUE;
	}
	// Send all the bytes
	while (bytesCount--)
	{
		I2C_regs->IDBR = (XLLP_UINT32_T)(*bytesBuf++);
		
		reg = I2C_regs->ICR;
		
		reg &= ~XLLP_ICR_START;
		reg |= (XLLP_ICR_ALDIE | XLLP_ICR_TB);
		
		if ((bytesCount == 0) && bSendStop)
			reg |= XLLP_ICR_STOP;
		else
			reg &= ~XLLP_ICR_STOP;

		I2C_regs->ICR = reg;
		if (XllpI2cTxEmpty(I2C_regs, pOSTRegs, 250) == XLLP_TRUE)
		{
			//RETAILMSG(1, (TEXT("XllpI2CWrite:send data failed!\r\n")));
			return XLLP_TRUE;
		}
		
	}

	// Clear the STOP bit always
	I2C_regs->ICR &= ~XLLP_ICR_STOP;
	return XLLP_FALSE;
}

XLLP_BOOL_T XllpI2CRead(P_XLLP_PI2C_T I2C_regs, 
						XLLP_OST_T *pOSTRegs, 
						XLLP_UINT8_T slaveAddr, 
						XLLP_UINT8_T * bytesBuf, 
						XLLP_UINT32_T bytesCount, 
						XLLP_BOOL_T bSendStop)
{
	XLLP_UINT32_T reg;

	I2C_regs->IDBR = (slaveAddr << 1) | XLLP_IDBR_MODE;

	reg = I2C_regs->ICR;
	reg |= (XLLP_ICR_START | XLLP_ICR_TB);
	reg &= ~(XLLP_ICR_STOP | XLLP_ICR_ALDIE);
	I2C_regs->ICR = reg;

	if (XllpI2cTxEmpty(I2C_regs, pOSTRegs,20) == XLLP_TRUE)
	{
		//RETAILMSG(1, (TEXT("XllpI2CRead:send addr failed!\r\n")));
		return XLLP_TRUE;
	}

	while (bytesCount--)
	{
		reg = I2C_regs->ICR;
		reg &= ~XLLP_ICR_START;
		reg |= XLLP_ICR_ALDIE | XLLP_ICR_TB;
		if (bytesCount == 0)
		{
			reg |= XLLP_ICR_ACKNACK;
			if (bSendStop)
				reg |= XLLP_ICR_STOP;
			else
				reg &= ~XLLP_ICR_STOP;
		} else
		{
			reg &= ~XLLP_ICR_ACKNACK;
		}
		I2C_regs->ICR = reg;

		if (XllpI2cRxFull(I2C_regs, pOSTRegs, 60) == XLLP_TRUE)
		{
			//RETAILMSG(1, (TEXT("XllpI2CRead:Read data failed!\r\n")));
			return XLLP_TRUE;
		}
			
		reg = I2C_regs->IDBR & 0xFF;
		*bytesBuf++ = (XLLP_UINT8_T)reg;
	}

	I2C_regs->ICR &= ~(XLLP_ICR_STOP | XLLP_ICR_ACKNACK);

	return XLLP_FALSE;
}

⌨️ 快捷键说明

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