Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

236 lines
3.8 KiB

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