📄 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"
#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 + -