236 lines
3.8 KiB
C
236 lines
3.8 KiB
C
//
|
||
// 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();
|
||
|
||
}
|
||
|