📄 i2c.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 + -