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

📄 i2c.c

📁 以TI 公司的OMAP5910为例
💻 C
字号:
//////////////////////////////////////////////////////////////////////////
//            Copyright (C) 2004, Eyoka @ Microunit
//                           All Rights Reserved
//________________________________________________________________________
//
// FILENAME:    i2c.c
// PROJECT:     High-Resolution Video System On OMAP
// MODULE:      MPU System
// DESCRIPTION: I2C Interface
// TARGET CPU:  ARM-925T of OMAP5910
// VERSION:     0.2
//________________________________________________________________________
//
// REVISE HISTORY
// DATE         VERSION AUTHOR  DESCRIPTION
// 2004-11-08   0.2     Eyoka   Checked.
// 2004-11-01   0.1     Eyoka   Created.
//////////////////////////////////////////////////////////////////////////

#include "i2c.h"


/////////////////////////////////////////////////////////////////////
// FUNCTIONS
/////////////////////////////////////////////////////////////////////

//___________________________________________________________________
// Function: I2C_Init
// Usage: Initialize I2C Interface.
// Parameters:		N/A
// Return Values:	N/A
//___________________________________________________________________
//
void I2C_Init(void)
{
	//I2C_Enable(FALSE);
	I2C_CMD &= 0xFFFD;

	// set divisor_2 = 9 for 100K/400KHz
	I2C_CONF_CLK_REF = 0x0089;

	// set speed to 100 and spike filter to 3
	I2C_CONF_CLK = 0x00D2;

	//I2C_Enable(TRUE);
	I2C_CMD |= 0x0002;

	//I2C_Reset();
	I2C_CMD |= 0x0001;
	I2C_CMD &= 0xFFFE;
	I2C_CONF_FIFO = 0x00F0;
}

//___________________________________________________________________
// Function: I2C_Read
// Usage: Read data from I2C.
// Parameters:
//	device			device ID.
//	subaddr			sub address.
//	pData		out	pointer to store data.
// Return Values:
//	BOOL			TRUE if successful, FALSE if not.
//___________________________________________________________________
//
BOOL I2C_Read(BYTE device, BYTE subaddr, BYTE *pData)
{
	//I2C_Reset();
	I2C_CMD |= 0x0001;
	I2C_CMD &= 0xFFFE;
	I2C_CONF_FIFO = 0x00F0;

	// set I2C to combine read
	I2C_CMD |= 0x0018;

	I2C_DEVICE = device;
	I2C_ADDRESS = subaddr;

	while(I2C_STATUS_ACTIVITY & 0x0004)
	{
		Delay(100);
	}

	//I2C_Start();
	I2C_CMD |= 0x0004;
	Delay(100);

	while(I2C_STATUS_ACTIVITY & 0x0004)
	{
		Delay(100);
	}

	if (I2C_STATUS_ACTIVITY & 0x0002)
	{
		// device error
		return FALSE;
	}

	if (I2C_STATUS_ACTIVITY & 0x0001)
	{
		// data error
		return FALSE;
	}

	*pData = (BYTE)I2C_DATA_READ;
	return TRUE;
}

//___________________________________________________________________
// Function: I2C_Write
// Usage: Write data to I2C.
// Parameters:
//	device			device ID.
//	subaddr			sub address.
//	data			data to be written.
// Return Values:
//	BOOL			TRUE if successful, FALSE if not.
//___________________________________________________________________
//
BOOL I2C_Write(BYTE device, BYTE subaddr, BYTE data)
{
	//I2C_Reset();
	I2C_CMD |= 0x0001;
	I2C_CMD &= 0xFFFE;
	I2C_CONF_FIFO = 0x00F0;

	// set I2C to write
	I2C_CMD &= 0xFFF7;

	I2C_DEVICE = device;
	I2C_ADDRESS = subaddr;
	I2C_DATA_WRITE = data;

	while(I2C_STATUS_ACTIVITY & 0x0004)
	{
		Delay(100);
	}

	//I2C_Start();
	I2C_CMD |= 0x0004;
	Delay(100);

	while(I2C_STATUS_ACTIVITY & 0x0004)
	{
		Delay(100);
	}

	if (I2C_STATUS_ACTIVITY & 0x0002)
	{
		// device error
		return FALSE;
	}

	if (I2C_STATUS_ACTIVITY & 0x0001)
	{
		// data error
		return FALSE;
	}

	return TRUE;
}


// the end
//////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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