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

📄 i2c.c

📁 tw9910的驱动源码,来自techwell的FAE
💻 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"

#define	I2C_SCL		P1_0
#define	I2C_SDA		P1_1

extern	IDATA BYTE	DebugLevel;
extern 	IDATA BYTE adc_i2c_address, CurrentADC;

#ifdef SUPPORT_TELETEXT
//extern IDATA BYTE LongDelayVal;
extern IDATA BYTE ReData[4];
#endif //SUPPORT_TELETEXT

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

#ifdef I2C_FAST
 #define I2Cdelay()
#else
 void I2Cdelay(void)
 {}
#endif

//BYTE I2CWriteData_Wait(BYTE value);

void WriteTW99(BYTE index, BYTE dat)
{
	I2CStart();
	I2CWriteData(TW99I2CAddress);
	I2CWriteData(index);
	I2CWriteData(dat);
	I2CStop();

}

BYTE ReadTW99(BYTE index)
{
	BYTE val;

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

	return val;
}

void WriteENC(BYTE index, BYTE dat)
{
	I2CStart();
	I2CWriteData(ADV7176I2CAddress);
	I2CWriteData(index);
	I2CWriteData(dat);
	I2CStop();

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

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

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

	delay(1);
}

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

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

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

	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();
}

/*
BYTE WriteI2Cn(BYTE addr, BYTE index, BYTE *val, BYTE cnt)
{
	BYTE rd=1, i;

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

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

	I2CStop();

	return rd;
}
*/

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();
}


BYTE ReadI2CStatus( BYTE addr )
{
	BYTE val;

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

	return val;
}
*/

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();
}


/*****************************************************************************/
/*                                                                           */
/*****************************************************************************/
/*
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);
}
*/
void I2CStart()
{
	I2C_SDA = 1;	I2Cdelay();
	I2C_SCL = 1;	I2Cdelay();
	I2C_SDA = 0;	I2Cdelay();
	I2C_SCL = 0;
}

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

void I2CWriteData(BYTE value)
{
	int i;

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

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

BYTE I2CReadData()
{
	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;
	}
	I2Cdelay();
	
	I2C_SCL = 1;	I2Cdelay();
	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;
}

/******************************************************************************/
/* Function:    VCOWriteData()	: Generate clock of first pll
*/
/******************************************************************************/   
#ifdef	TMPLL
 
void VCOWriteData(BYTE ctrlByte, BYTE VDW, BYTE RDW)
{
    char    i;

    VcoStrobe = 0;
    I2C_SCL   = 0;
    for(i = 0; i < 8; i++,(ctrlByte <<= 1)) 
    {
        if(ctrlByte & 0x80) 
        {
            I2C_SDA = 1;
        }
        else 
        {
            I2C_SDA = 0;
        }
        I2C_SCL = 1;
        I2C_SCL = 0;
    }
    for(i = 0; i < 8; i++,(VDW <<= 1)) 
    {
        if(VDW & 0x80) 
        {
            I2C_SDA = 1;
        }
        else 
        {
            I2C_SDA = 0;
        }
        I2C_SCL = 1;
        I2C_SCL = 0;
    }

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

    VcoStrobe = 1;
    VcoStrobe = 0;

    I2C_SDA = 1;
    I2C_SCL = 1;
}

#endif	//TMPLL

////////////////////////////////////////////////////////////////
//////* Teletext */
////////////////////////////////////////////////////////////////

#ifdef SUPPORT_TELETEXT

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


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

void I2Cdelay_long(BYTE LDelayTime)
{
	BYTE i;
	for(i=0 ; i < LDelayTime ; i++){
		I2Cdelay();
	}
}

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

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

	I2C_SCL = 0;	I2Cdelay_long(LongDelayVal);
					I2Cdelay_long(LongDelayVal);
	delay(1);
}

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

	I2Cdelay_long(LongDelayVal * 2);
	I2CStartLong();

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

	I2CStopLong();
}


BYTE I2CReadDatatt(BYTE SelNack)
{
	int i;
	BYTE value=0;

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

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

	I2C_SCL = 1;	I2Cdelay_long(LongDelayVal);	
	I2C_SCL = 0;

	return value;

}


void ReadI2Ctt(BYTE addr, 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);

//	return ReData;

}

#endif	//SUPPORT_TELETEXT

⌨️ 快捷键说明

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