📄 hal_i2c.c
字号:
//===========================================================================
// HAL_I2C.C
//
// The routines in this file support I2C communications between the 13713
// and peripheral devices (panel, camera, ...)
//---------------------------------------------------------------------------
// Copyright (c) 2003 Epson Research and Development, Inc.
// All Rights Reserved.
//===========================================================================
// (Tabs set to every 4)
#ifdef _WIN32
#pragma warning( disable : 4706 ) // Disable "assignment within conditional expression" warning.
#endif
#include <stdio.h>
#include <string.h>
#include "hal_private.h"
#include "hal_i2c.h"
#include "i2c.h"
// These supported devices
#define OV7645_DEVICE_ID 0x42 // I2C device ID for OV7645 CMOS Camera Module
// Private function prototypes.
static Boolean PrvWriteI2CBytes( const UInt8 *pBytes );
//---------------------------------------------------------------------------
// halpInitI2C() - Initialize I2C bus to pre-defined known state.
//
// If DeviceId == -1, initialize all devices
// Otherwise, set DeviceId to the device for initialization
//---------------------------------------------------------------------------
Boolean halpInitI2C( int DeviceId )
{
Boolean fRet1 = TRUE;
Boolean fRet2 = TRUE;
Boolean fRet3 = TRUE;
int LastID = -1;
int id;
Boolean fOldDebug;
UInt8 i;
UInt8 Reg108=halReadReg8(REG0108_CMCONTROL);
UInt8 Reg100=halReadReg8(REG0100_CMCLK);
UInt8 Reg102=halReadReg8(REG0102_CMSIGNAL);
UInt8 Reg104=halReadReg8(REG0104_CMMODE0);
UInt8 Reg106=halReadReg8(REG0106_CMMODE1);
halWriteReg8(REG0060_GPIOCONFIG,0x02);
halWriteReg8(REG0064_GPIOSTATUS,0x00);
halWriteReg8(REG0108_CMCONTROL, 0x11);
halWriteReg8(REG0108_CMCONTROL, 0x10);//inter camera module reset
halWriteReg8(REG0100_CMCLK, 0x01);//cmcclkout=sysclk/4;
halWriteReg8(REG0102_CMSIGNAL, 0x02);
//// Reg 102h 0x02 for ov 0x00 for toshiba
// Camera1 clk mode select: use external clk;YUV format: UYVY; HSYNC low active; VSYNC high active; PCLK rising edge
halWriteReg8(REG0104_CMMODE0, 0x09);
halWriteReg8(REG0106_CMMODE1, 0x00);
halDelayUS(70000);
// ITU-R BT 656 disable; Camera1 and Camera2 active pulldown enable;
// Camera1 I/F inactive YUV/YUV converter disable; YUV straight 0~255
halWriteReg8(REG0108_CMCONTROL, 0x10);
// Initialize the I2C bus interface.
fRet1 = i2cInitialize(0, 0, 0, 0, 0, 0, 0);
if (fRet1)
{
// Program CMOS SENSER
if ((DeviceId==-1) || (DeviceId==OV7645_DEVICE_ID))
{
//DEBUGMSG(TRUE, (" - I2C OV7645 ID %02X status: ", OV7645_DEVICE_ID));
id = i2cSetSlaveDevice(OV7645_DEVICE_ID);
if (LastID == -1)
LastID = id;
i2cWrite2Bytes( HalInfo.RegCam1[ 0 ].uchIndex, HalInfo.RegCam1[ 0 ].uchValue );
halDelayUS(100000);
for( i = 1 ; HalInfo.RegCam1[i].uchIndex != REGFLAG_ENDOFTABLE; i++ )
{
i2cWrite2Bytes( HalInfo.RegCam1[ i ].uchIndex, HalInfo.RegCam1[ i ].uchValue );
halDelayUS(1000);
}
/*
if ((fRet2 = PrvWriteI2CBytes((unsigned char*)OV7635Table)))
{ ;
// // Nothing to do here, yet.
// //DEBUGMSG(TRUE, ("OK\n"));
}
else
{
fRet2 = (i2cGetLastError() == I2C_ERR_SLAVE_NACK_ID); // No error if device was not found.
//DEBUGMSG(TRUE, ((fRet2) ? "n/a\n" : "Fail\n") );
}
*/
}
// Restore orginal Slave Device ID, and flag success or failure.
//if (LastID != -1)
// i2cSetSlaveDevice( (UInt8) LastID );
fRet1 = (fRet1 && fRet2 && fRet3);
}
//restore register to the original setting.
HAL_WRITE_REG(REG0108_CMCONTROL, Reg108);
HAL_WRITE_REG(REG0100_CMCLK, Reg100);
HAL_WRITE_REG(REG0102_CMSIGNAL, Reg102);
HAL_WRITE_REG(REG0106_CMMODE1, Reg106);
HAL_WRITE_REG(REG0104_CMMODE0, Reg104);
halDelayUS(70000);
return fRet1;
//#endif
}
//---------------------------------------------------------------------------
// PrvWriteI2CBytes() - Write a series of byte-pairs to I2C bus.
//---------------------------------------------------------------------------
static Boolean PrvWriteI2CBytes( const UInt8 *pBytes )
{
Boolean ret = TRUE;
while (ret && (*pBytes != 0xFF))
{
ret = i2cWrite2Bytes(pBytes[0], pBytes[1]);
pBytes += 2;
halDelayUS(1000);
}
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -