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

📄 hal_i2c.c

📁 s1d13716的源码 windiws ce 或8位单片机
💻 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 + -