mirror of https://github.com/tongzx/nt5src
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
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();
|
|
|
|
}
|
|
|