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

📄 i2c.c

📁 此程序为twell8806驱动程序
💻 C
字号:
//-------------------------------------------------------------
//	This is changed for sdcc compiler 2.2.0a	LJY000721
//  ver0.11 2/20/2001	Support Z86129 Line 21 decoder.
//-------------------------------------------------------------
/*#include <io51.h>*/
//#include <pk-51.h>	LJY000721

#include "Config.h"

#include "reg.h"
#include "typedefs.h"
#include "I2C.h"
#include "main.h"
#include "debug.h"
#include "printf.h"
#include "osdbasic.h"

#define	I2C_SCL		P1_0
#define	I2C_SDA		P1_1

#define ID_ADDR		0xc5
#define ID_DATA		0xc6

extern	PDATA BYTE	DebugLevel;

///extern IDATA BYTE adc_i2c_address, CurrentADC;
//IDATA BYTE I2CAddr, I2CIdx, I2CData;

/*****************************************************************************/
/*                                                                           */
/*****************************************************************************/
#define I2C_FAST

#ifdef I2C_FAST
 #define I2Cdelay()
#else
 void I2Cdelay(void)
 {
	 BYTE i;
	 for(i=0; i<1; i++){
	 }
 }
#endif

#if (defined  QVGA) || (defined WQVGA)
void I2C_delay(void)
{
	 BYTE i;
	 for(i=0; i<255; i++){
		i=i;
	 }
	 for(i=0; i<128; i++){
		i=i;
	 }
}
#else
 #define I2C_delay() 
#endif

BYTE I2CWriteData_Wait(BYTE value);

void WriteTW88(BYTE index, BYTE dat)
{
	BYTE addr = TW88I2CAddress;

	#ifdef DEBUG_I2C
	if( DebugLevel==0xff )
		Printf("Write %02xh to [Adrs(%02xh)Index(%02xh)]\n\r", (WORD)dat, (WORD)addr, (WORD)index);
	#endif

	I2CStart();
	I2CWriteData(addr);
	I2CWriteData(index);
	I2CWriteData(dat);
	I2CStop();
}

/* For testing chip.............................
BYTE WriteTW88_Wait(BYTE index, BYTE dat)
{
	#ifdef DEBUG_I2C
	if( DebugLevel==0xff )
		Printf("Write %02xh to [Adrs(%02xh)Index(%02xh)]\n\r", (WORD)dat, (WORD)TW88I2CAddress, (WORD)index);
	#endif

	I2CStart();
	if( !I2CWriteData_Wait(TW88I2CAddress & 0xFE) ) 
		return 0;
	if( !I2CWriteData_Wait(index) )
		return 0;
	if( !I2CWriteData_Wait(dat) )
		return 0;
	I2CStop();
	return 1;

}
*/

BYTE ReadTW88(BYTE index)
{
	BYTE val;
	BYTE addr = TW88I2CAddress;

	I2CStart();
	I2CWriteData(addr);
	I2CWriteData(index);
	I2CStart();
	I2CWriteData(addr | 0x01);
	val = I2CReadData();
	I2CStop();

	#ifdef DEBUG_I2C
	if( DebugLevel==0xff )
		Printf("Read [Adrs:%02xh,Index:%02xh] %02xh\r\n", (WORD)addr, (WORD)index, (WORD)val);
	#endif

	return val;
}

#if defined( SUPPORT_PC ) || defined( SUPPORT_DTV )
void WriteADC(BYTE index, BYTE dat)
{
	//#ifdef DEBUG_OSD
	//if( DebugLevel==0xff )
//		Printf("Write ADC %02xh to [Adrs(%02xh)Index(%02xh)\r\n", (WORD)dat, (WORD)ADCI2CAddress, (WORD)index );
	//#endif

	WriteTW88(ID_ADDR, index);	
	WriteTW88(ID_DATA, dat);	

}

BYTE ReadADC(BYTE index)
{
	BYTE val, val1;

	val1=ReadTW88(0xb0);
	WriteTW88(0xb0, val1|0x80);	

	WriteTW88(ID_ADDR, index);	
	WriteTW88(ID_ADDR, index);	
	val = ReadTW88(ID_DATA);

	WriteTW88(0xb0, val1&0x7f);	

	//#ifdef DEBUG_OSD
	//if( DebugLevel==0xff )
//		Printf("Read ADC[Adrs:%02xh,Index:%02xh] %02xh\r\n", (WORD)TW88I2CAddress, (WORD)index, (WORD)val);
	//#endif
	
	return val;
}
#endif	// SUPPORT_PC

void WriteEEP(WORD index, BYTE dat)
{
	BYTE addr;

	addr = (EEPROMI2CAddress | (index>>7)) & 0xfe;

	I2CStart();
	I2CWriteData(addr);
	I2CWriteData((BYTE)index);
	I2CWriteData(dat);
	I2CStop();

	#ifdef DEBUG_OSD
	if( DebugLevel==0xff )
		Printf("Write %02xh to [Adrs(%02xh)Index(%02xh)\r\n", (WORD)dat, (WORD)addr, (WORD)index );
	#endif

	delay(2);
}

BYTE ReadEEP(WORD index)
{
	BYTE val;
	BYTE addr;

	addr = (EEPROMI2CAddress | (index>>7)) & 0xfe;

	val = ReadI2C(addr,(BYTE)index);

	#ifdef DEBUG_OSD
	if( DebugLevel==0xff )
		Printf("Read [Adrs:%02xh,Index:%02xh] %02xh\r\n", (WORD)addr, (WORD)index, (WORD)val);
	#endif

	return val;
}

BYTE ReadI2C(BYTE addr, BYTE index)
{
	BYTE val;

	I2CStart();
	I2CWriteData(addr);
	I2CWriteData(index);
	I2CStart();
	I2CWriteData(addr | 0x01);
	val = I2CReadData();
	I2CStop();

	return val;
}


void WriteI2C(BYTE addr, BYTE index, BYTE val)
{
	I2CStart();
	I2CWriteData(addr);
	I2CWriteData(index);
	I2CWriteData(val);
	I2CStop();
}

void WriteI2CnD(BYTE addr, BYTE index, BYTE val, BYTE cnt)
{
	BYTE i;

	I2CStart();
	I2CWriteData(addr);
	I2CWriteData(index);

	for(i=0; i<cnt; i++){
		I2CWriteData(val);		//LJY050101
		I2C_delay();
	}

	I2CStop();
}

void WriteI2Cn(BYTE addr, BYTE index, BYTE *val, BYTE cnt)
{
	BYTE i;

	I2CStart();
	I2CWriteData(addr);
	I2CWriteData(index);

	for(i=0; i<cnt; i++){
		I2CWriteData(*(val+i));	
		I2C_delay();
	}
	I2CStop();
}

BYTE WriteI2Cn_(BYTE addr, BYTE *val, BYTE cnt)
{
	BYTE rd=1, i;

	I2CStart();
	I2CWriteData(addr);

	for(i=0; i<cnt; i++){
		I2CWriteData(*(val+i));		//LJY050101
	}
	I2CStop();

	return rd;
}

//BYTE I2CWriteData_Wait(BYTE value);
void I2CReadByteMSP(BYTE addr, BYTE index, BYTE *pd, BYTE cnt)
{
	BYTE i;

	I2CStart();
	I2CWriteData_Wait(addr);
	I2CWriteData(index);
	for(i=0; i<cnt; i++) {
		I2CWriteData(*(pd+i));
	}
	I2CStart();
	I2CWriteData_Wait(addr | 0x01);
	*pd = I2CReadDataWithACK();
	*(pd+1) = I2CReadData();

	I2CStop();
}

#ifdef DEBUG_TV
BYTE ReadI2CStatus( BYTE addr )
{
	BYTE val;

	I2CStart();
	I2CWriteData(addr | 0x01);
	val = I2CReadData();
	I2CStop();

	return val;
}
#endif // DEBUG_TV


#ifdef SERIAL
BYTE I2CReadDataWithNAK(void)
{
	return I2CReadData();
}

void ReadI2Cmn(BYTE addr, BYTE wcnt, BYTE rcnt, BYTE *rwdata)
{
	BYTE i;

	I2CStart();
	I2CWriteData(addr);
	for(i=0; i<wcnt; i++)
		I2CWriteData( rwdata[i] );

	I2CStart();
	I2CWriteData(addr | 0x01);
	for(i=0; i<rcnt-1; i++)
		rwdata[i] = I2CReadDataWithACK();
	rwdata[i++] = I2CReadDataWithNAK();
	I2CStop();
}
/*
void ReadI2CStatusn(BYTE addr, BYTE rcnt, BYTE *rwdata)
{
	BYTE i;

//	I2CStart();
//	I2CWriteData(addr);
//	for(i=0; i<wcnt; i++)
//		I2CWriteData( rwdata[i] );

	I2CStart();
	I2CWriteData(addr | 0x01);

	for(i=0; i<rcnt-1; i++)
		rwdata[i] = I2CReadDataWithACK();
	rwdata[i++] = I2CReadDataWithNAK();
	I2CStop();
}
*/
#endif // SERIAL

/*****************************************************************************/
/*                                                                           */
/*****************************************************************************/
BYTE I2CWriteData_Wait(BYTE value)
{
	WORD i;
	BYTE ack;

	for(i=0; i<8; i++, value<<=1) {
		if(value & 0x80) I2C_SDA = 1;
		else			 I2C_SDA = 0;
		I2Cdelay();
		I2C_SCL = 1;	I2Cdelay();
		I2C_SCL = 0;
	}
	I2C_SDA = 1;	I2Cdelay();
	I2C_SCL = 1;	I2Cdelay();
	i=0;
    while(1) {
		if( I2C_SCL ) break;
		i++;
	}

	ack = I2C_SDA;	//I2Cdelay();
	I2C_SCL = 0;
	return (1-ack);
}

#ifndef QVGA
void dd(void)
{
}
#else
#define dd()  I2Cdelay()
#endif

void I2CStart()
{
	I2C_SDA = 1;	dd();
	I2C_SCL = 1;	dd();
	I2C_SDA = 0;	dd();
	I2C_SCL = 0;
}

void I2CStop()
{
	I2C_SDA = 0;	dd();
	I2C_SCL = 1;	dd();
	I2C_SDA = 1;
}

void I2CWriteData(BYTE value)
{
/*
	int i;

	for(i=0; i<8; i++, value<<=1) {
		I2C_SCL = 0;
		I2Cdelay();	// HHY 2.04 in special case, it was unstable
		if(value & 0x80) I2C_SDA = 1;
		else 			 I2C_SDA = 0;
		I2Cdelay();
		I2C_SCL = 1;
	}
*/

	I2C_SCL=0;	I2C_SDA=(value & 0x80)? 1:0;	I2C_SCL=1;	dd();
	I2C_SCL=0;	I2C_SDA=(value & 0x40)? 1:0;	I2C_SCL=1;	dd();
	I2C_SCL=0;	I2C_SDA=(value & 0x20)? 1:0;	I2C_SCL=1;	dd();
	I2C_SCL=0;	I2C_SDA=(value & 0x10)? 1:0;	I2C_SCL=1;	dd();

	I2C_SCL=0;	I2C_SDA=(value & 0x08)? 1:0;	I2C_SCL=1;	dd();
	I2C_SCL=0;	I2C_SDA=(value & 0x04)? 1:0;	I2C_SCL=1;	dd();
	I2C_SCL=0;	I2C_SDA=(value & 0x02)? 1:0;	I2C_SCL=1;	dd();
	I2C_SCL=0;	I2C_SDA=(value & 0x01)? 1:0;	I2C_SCL=1;	dd();


	I2C_SCL = 0;	// HHY 3.00
	I2C_SCL = 0;	// HHY 3.00
	I2C_SCL = 0;	//	I2Cdelay();
	I2C_SDA = 1;	//	I2Cdelay();

	I2C_SCL = 1;	// HHY 3.00
	I2C_SCL = 1;	// HHY 3.00
	I2C_SCL = 1;	//	I2Cdelay();
	I2C_SCL = 0;
}

BYTE I2CReadData()
{
	int i;
	BYTE value=0;

	I2C_SDA = 1;	dd();
	I2C_SCL = 0;
	
	for(i=0; i<8; i++) {
		I2C_SCL = 1;
		value <<= 1;
		if(I2C_SDA) value |= 1;
		I2C_SCL = 0;
	}
	dd();
	
	I2C_SCL = 1;	// HHY 3.00
	I2C_SCL = 1;	// HHY 3.00
	I2C_SCL = 1;
	I2C_SCL = 0;

	return value;

}

BYTE I2CReadDataWithACK()
{
	int i;
	BYTE value=0;

	I2C_SDA = 1;	I2Cdelay();
	I2C_SCL = 0;

	for(i=0; i<8; i++) {
		I2C_SCL = 1;
		value <<= 1;
		if(I2C_SDA) value |= 1;
		I2C_SCL = 0;
	}
	I2C_SDA = 0;	I2Cdelay();		//ack
	I2C_SCL = 1;	I2Cdelay();
	I2C_SCL = 0;

	return value;
}

//=============================================================================
//			Slow I2C routine for Teletext Chip
//=============================================================================
#ifdef SUPPORT_TELETEXT

void I2Cdelay4(void)
{
	BYTE i;
	for(i=0; i < 5; i++)
		I2Cdelay();
}

void I2CStartLong(void)
{
	I2C_SDA = 1;	I2Cdelay4();
	I2C_SCL = 1;	I2Cdelay4();
	I2C_SDA = 0;	I2Cdelay4();
	I2C_SCL = 0;	I2Cdelay4();
}

void I2CStopLong(void)
{
	I2C_SDA = 0;	I2Cdelay4();
	I2C_SCL = 1;	I2Cdelay4();
	I2C_SDA = 1;	I2Cdelay4();
}

void I2CWriteData_(BYTE SendData)  // Write SendData
{
	BYTE SendCnt;

	for( SendCnt=0; SendCnt<8; SendCnt++, SendData<<=1 ) {
		I2C_SCL = 0;
		I2Cdelay4();
		if(SendData & 0x80)	I2C_SDA = 1;
		else 			    I2C_SDA = 0;
		I2Cdelay4();
		I2C_SCL = 1;
		I2Cdelay4();
	}
	I2C_SCL = 0;	I2Cdelay4();
	I2C_SDA = 1; 	I2Cdelay4();
	I2C_SCL = 1;	

	I2C_SCL = 0;	I2Cdelay4();
					I2Cdelay4();
	delay(1);
}

void WriteI2CnLong(BYTE addr, BYTE *val, BYTE cnt)
{
	BYTE i;//rd=1, i;

	I2Cdelay4();
	I2Cdelay4();
	I2CStartLong();

	I2CWriteData_(addr);
	for(i=0; i<cnt; i++)
		I2CWriteData_(*(val+i));

	I2CStopLong();
}
#ifdef DEBUG_TELETEXT
BYTE I2CReadDatatt(BYTE SelNack)
{
	int i;
	BYTE value=0;

	I2C_SDA = 1;	I2Cdelay4();
	I2C_SCL = 0;	I2Cdelay4();
	
	for(i=0; i<8; i++) {
		I2C_SCL = 1;	I2Cdelay4();
		value <<= 1;
		if(I2C_SDA) 
			value |= 1;	
		I2C_SCL = 0;	I2Cdelay4();
	}

	if(SelNack == 0x01){
		I2C_SDA = 1;	
		I2Cdelay4();	// nack
	}
	else{
		I2C_SDA = 0;	
		I2Cdelay4();	// ack
	}

	I2C_SCL = 1;	I2Cdelay4();	
	I2C_SCL = 0;

	return value;
}

void ReadI2Ctt(BYTE addr, BYTE *ReData, BYTE cnt)
{
	BYTE i;

	I2CStartLong();
	I2CWriteData_(addr | 0x01);
	
	if(cnt != 0) {
		for(i=0 ; i < cnt ; i++) 
			ReData[i] =  I2CReadDatatt(0x00);
		ReData[i] =  I2CReadDatatt(0x01);
   	}
	else
		ReData[0] =  I2CReadDatatt(0x01);

	I2CStopLong();

	delay(1);

}
#endif
#endif	//SUPPORT_TELETEXT


⌨️ 快捷键说明

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