|
|
//
// MODULE : I2C.C
// PURPOSE : I2C Interface
// AUTHOR : JBS Yadawa
// CREATED : 7/20/96
//
//
// Copyright (C) 1996 SGS-THOMSON Microelectronics
//
//
// REVISION HISTORY :
//
// DATE :
//
// COMMENTS :
//
#include "common.h"
#include "stdefs.h"
#include "memio.h"
#include "i2c.h"
#include "board.h"
#define I2CREG 0x44
#define SCL 0x01
#define SDA 0x02
BYTE i2cShadow;
void NEARAPI I2CSendBit(BOOL Data); void NEARAPI I2CStart(void); void NEARAPI I2CStop(void); void NEARAPI I2CSendByte(BYTE data); void NEARAPI I2CSendDataByte(BYTE data); void NEARAPI I2CGetBit(BOOL * data); void NEARAPI I2CGetByte(BYTE *data); void NEARAPI I2CGetDataByte(BYTE *data);
void FARAPI I2CInitBus(void) { i2cShadow = 0; i2cShadow = SDA; memOutByte(I2CREG, i2cShadow); i2cShadow |= SCL; memOutByte(I2CREG, i2cShadow); }
void FARAPI I2CSettleBus(void) { int i; BOOL b;
i2cShadow &= (~SDA); memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow &= (~SCL); i2cShadow = 0x00; memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow |= SCL; for(i=0; i<100; i++) { memOutByte(I2CREG, i2cShadow); Delay(50); memOutByte(I2CREG, i2cShadow); Delay(50); } i2cShadow |= SDA; memOutByte(I2CREG, i2cShadow); i2cShadow |= SCL; memOutByte(I2CREG, i2cShadow); Delay(50); b = memInByte(I2CREG); b = b >> 1; i = 0; while ((i < 2000) && (!b)) { i2cShadow &= (!SCL); memOutByte(I2CREG, i2cShadow); i2cShadow |= SDA; memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow |= SCL; memOutByte(I2CREG, i2cShadow); i2cShadow |= SDA; memOutByte(I2CREG, i2cShadow); Delay(50); i++; b = memInByte(I2CREG) >> 1; } if(i >= 2000) { // MessageBox(GetFocus(), "I2C Bus is unstable!!","STHal", MB_OK);
} }
void NEARAPI I2CSendBit(BOOL Data) { if(Data) { i2cShadow |= SDA; memOutByte(I2CREG, i2cShadow); } else { i2cShadow &= SCL; memOutByte(I2CREG, i2cShadow); } Delay(50);
i2cShadow |= SCL; memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow &= SDA; memOutByte(I2CREG, i2cShadow); Delay(50);
} extern volatile BYTE *lpBase; volatile BYTE *i2cptr;
void NEARAPI I2CStart(void) { i2cShadow = 0; i2cShadow |= SDA; memOutByte(I2CREG, i2cShadow); i2cShadow |= SCL; memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow = memInByte(I2CREG); if(!(i2cShadow&(SDA|SCL))) { // MessageBox(GetFocus(), "I2C Bus Busy", "STHal", MB_OK);
} i2cShadow &= SCL; memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow = 0x00; memOutByte(I2CREG, i2cShadow); Delay(50); }
void NEARAPI I2CStop(void) { i2cShadow &= SCL; memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow |= SCL; memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow |= SDA; memOutByte(I2CREG, i2cShadow); Delay(50);
}
void NEARAPI I2CSendByte(BYTE data) { int i; for(i=7; i>=0; i--) { if(data & (1 << i)) I2CSendBit(TRUE); else I2CSendBit(FALSE); } }
void NEARAPI I2CSendDataByte(BYTE data) { BOOL ack; I2CSendByte(data); I2CGetBit(&ack); if(ack) { // MessageBox(GetFocus(), "No Ack after send byte", "sthal", MB_OK);
} }
void NEARAPI I2CGetBit(BOOL * data) { i2cShadow |= SDA; memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow |= SCL; memOutByte(I2CREG, i2cShadow); Delay(50); i2cShadow = memInByte(I2CREG); Delay(50); i2cShadow &= SDA; memOutByte(I2CREG, i2cShadow); Delay(50); *data = (i2cShadow >> 1);
}
void NEARAPI I2CGetByte(BYTE *data) { int i; BOOL b;
*data = 0x00; for (i = 7; i >= 0; i--) { I2CGetBit(&b); if(b) *data |= (1 << i); } }
void NEARAPI I2CGetDataByte(BYTE *data) { I2CGetByte(data); I2CSendBit(TRUE); }
void FARAPI I2CSendSeq(WORD unit, WORD num, BYTE *data) { WORD i;
I2CStart(); I2CSendDataByte((BYTE)(unit)); for(i=0; i < num; i++) { I2CSendDataByte((BYTE)data[i]); } I2CStop(); }
|