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

📄 i2c.h

📁 混泰CH7023,CH7024,CH7025视频解码芯片
💻 H
字号:
#ifndef _I2C_H
#define _I2C_H

/***************************************************************************************

	FileName: 		I2C.H

	CPU:  			Samsung 2410

	System:			WinCE 4.2

	Description:	This class can be used to operator I2C bus to finish reading or writing register.
	
	Author:   		JUNFENG WANG

	Create Date:    2007-5-11	

	Modify:			2007-6-22 by JUNFENG WANG
	
*****************************************************************************************/

#include "S3C2410.h"

class I2C{
private:
	UCHAR m_ChipAddr; //Slave device address
	volatile S3C2410_IOPreg* s2410IOP; //GPIO physical address
	volatile S3C2410_IICreg* s2410IIC; //I2C physical address
public:
	enum {	TIME_OUT = 5000, //wait interupt times
			TRY_TIMES = 100, //retry read/write register times
			//IIC controller relation:
			IICSTAT_MRCV_START_OUTEN = ((2<<6) | (1<<5) | (1<<4)), //master receive mode start condition
			IICSTAT_MRCV_STOP_OUTEN = ((2<<6) | (0<<5) | (1<<4)), //master receive mode stop condition
			IICSTAT_MSND_START_OUTEN = ((3<<6) | (1<<5) | (1<<4)), //master transmit mode start condition
			IICSTAT_MSND_STOP_OUTEN = ((3<<6) | (0<<5) | (1<<4)), //master transmit mode stop condition
			IICCON_ACKEN_INTEN_RESUME = ((1<<7) | (1<<6) | (1<<5) | (0<<0)), //ACK enable, interupt enble, start operate
			IICCON_ACKDIS_INTEN_RESUME = ((0<<7) | (1<<6) | (1<<5) | (0<<0)), //ACK disable, interupt enabel, start operate
		};
	I2C(UCHAR addr){
		if(!InitAddress())
		{
			RETAILMSG(1,(_T("InitAddress() failed...IIC can not be used!\n")));
		}
		else
		{
			m_ChipAddr=addr;
			m_clkdiv=0;
			RETAILMSG(1,(_T("chipaddr=0x%x\r\n"),m_ChipAddr));
			Initialize();
		}
	}
	~I2C(){
		if(s2410IIC)
			VirtualFree((PVOID)s2410IIC,0,MEM_RELEASE);
		if(s2410IOP)
			VirtualFree((PVOID)s2410IOP,0,MEM_RELEASE);
	}
private:
	UCHAR m_clkdiv;
private:
	//basic functions
	void Initialize(); // IIC init
	void ReInitialize();
	void InitializeGPIO(); // GPIO init
	BOOL InitAddress(); //map physical addr to virtual addr
	BOOL Start(); //I2C start condition
	void Stop(BOOL IsSend); // Stop condition
	//send one byte
	BOOL SendByte(UCHAR data); 
	//receive one byte 
	BOOL RcvByte(UCHAR* data,BOOL IsSendAck);
	//send multiple bytes...
	BOOL SetMultiBytes(
		UCHAR Offset,
		UCHAR Num,
		UCHAR* dat);
	//Receive multiple bytes...
	BOOL GetMultiBytes(
		UCHAR Offset,
		UCHAR Num,
		UCHAR* dat);
	//Set one register...
	BOOL SetOneReg(UCHAR Offset,UCHAR *dat);
	//Get one register...
	BOOL GetOneReg(UCHAR Offset,UCHAR *dat);

public:
	//wrapped functions
	//send multiple registers...
	BOOL SetMultiRegs(UCHAR Offset,UCHAR Num,UCHAR *dat);
	//receive multiple registers...
	BOOL GetMultiRegs(UCHAR Offset,UCHAR Num,UCHAR *dat);
	//Set one register...
	BOOL SetReg(UCHAR Offset,UCHAR *dat);
	//Get one register...
	BOOL GetReg(UCHAR Offset,UCHAR *dat);


public:
	UCHAR GetChipAddr() const{
		return m_ChipAddr;
	}
	void SetChipAddr(UCHAR const NewAddr){
		m_ChipAddr=NewAddr;
	}

public:
	void ChangeI2CSpeed(UCHAR const div);
public:
	//delay for some time
	void Delay(UINT time);
	//just for testing...
	UINT Test();

};


#endif //I2C_H

⌨️ 快捷键说明

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