?? i2c.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 + -