Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
07/18/00 17:32
Read: times


 
#3827 - RE: 80552 I²C Interfacing
here's come code i wrote a few years ago for the 552. you should be able to get a idea of whats required from this.




#define MASTERXMIT 0xC1
#define MASTERXMIT_50 0x41
#define MASTERXMIT_12 0xc0
#define ENABLEBUSINT 0x20
#define BUSPRIORITY 0x20
#define STARTBIT 0x20
#define NOTSTARTBIT 0xDF
#define STOPBIT 0x10
#define ACKBIT 0x04
#define PCF8574 0x40
#define LCD 0x4E
#define TRANSMIT 0x00
#define RECEIVE 0xFF
#define CLRSI 0xF7
#define TRANSFERFINISHED 0xFF
#define LCDRS 0x01
#define NOTLCDRS 0xFE
#define LCDREAD 0x02
#define LCDENABLE 0x04
#define NOTLCDENABLE 0xFB


unsigned char SLAddress; /* address of device to transmit to or recieve from */
unsigned char Direction; /* 0 to recieve 1 to transmit */
unsigned char ByteNum; /* number of bytes to transmit or recieve */
unsigned char *ByteList; /* pointer to array for tx or rx bytes */
unsigned char CurrentByte;
unsigned char BusStatus;

unsigned char SwitchStatus;

GetSwitchStatus()
{
SLAddress=PCF8574;
Direction=RECEIVE;
ByteNum=1;
WaitForBus();
ByteList=&SwitchStatus;
StartBusTransfer();
WaitForBus(); /* Don't return until SwitchStatus is valid */
}

LightLeds()
{
SLAddress=PCF8574;
Direction=TRANSMIT;
ByteNum=1;
WaitForBus();
ByteList=&SwitchStatus;
StartBusTransfer();
}

WaitForBus()
{
unsigned int x;
x=0;
while((BusStatus)&&(x++<0x8000));
}

SetUpBus()
{
CurrentByte=0;
BusStatus=0x40;
Port1|=0xc0;
I2CControl=MASTERXMIT;
IntEnable0|=ENABLEBUSINT;
IntEnable0|=0x80;/* enable all */
IntPriority0&=~BUSPRIORITY;
}

StartBusTransfer()
{
CurrentByte=0;
BusStatus=0x80;
if (Direction)SLAddress|=0x01;
I2CControl=MASTERXMIT;I2CControl|=STARTBIT;
}

INTERRUPT(_I2CInt_)BusIntService()
{
I2CControl=MASTERXMIT|~CLRSI;
switch (I2CStatus)
{
/* Master Transmitter Mode */
/* Start has been transmitted */
case 0x08:I2CData=SLAddress;BusStatus=0x08;break;
/* Repeated Start Transmitted */
case 0x10:I2CData=SLAddress;BusStatus=0x10;break;
/* SLA + W Transmitted ACK received */
case 0x18:I2CControl&=NOTSTARTBIT;
if(ByteNum)I2CData=ByteList[CurrentByte++];
else I2CControl|=STOPBIT;
/*if(I2CControl&&STARTBIT);*/
BusStatus=0x18;break;
/* Data transmitted ACK received */
case 0x28:if(CurrentByte<ByteNum){I2CData=ByteList[CurrentByte++];
BusStatus=0x28;}
else {I2CControl|=STOPBIT;BusStatus=0x00;}
break;
/* Data transmitted NOT ACK received */
case 0x30:I2CControl|=STOPBIT;BusStatus=0x00;break;
/* Arbitration Lost */
case 0x38: CurrentByte=0;I2CControl|=STARTBIT;BusStatus=0x38;break;
/* Master Receiver Mode */
/* SLA + R transmitted ACK received */
case 0x40:if(ByteNum)I2CControl|=ACKBIT;
else I2CControl&=~ACKBIT;
BusStatus=0x40;
break;
/* SLA + R transmitted NOT ACK received */
case 0x48:I2CControl|=STOPBIT;BusStatus=0x00;break;
/* Data Byte Received ACK Returned */
case 0x50:ByteList[CurrentByte++]=I2CData;
if(CurrentByte<ByteNum)I2CControl|=ACKBIT;
else I2CControl&=~ACKBIT;
BusStatus=0x50;
break;
/* Data byte received NOT ACK returned */
case 0x58:I2CControl|=STOPBIT;BusStatus=0x00;break;
/* error states */
case 0x00:I2CControl|=STOPBIT;BusStatus=0x00;break;
case 0xf8:BusStatus=0x00;break;
default :I2CControl|=STOPBIT;BusStatus=0x00;break;

}
/* clear interrupt */
I2CControl&=CLRSI;
}


List of 5 messages in thread
TopicAuthorDate
80552 I²C Interfacing            01/01/70 00:00      
RE: 80552 I²C Interfacing            01/01/70 00:00      
RE: 80552 I²C Interfacing            01/01/70 00:00      
RE: 80552 I²C Interfacing            01/01/70 00:00      
RE: 80552 I²C Interfacing            01/01/70 00:00      

Back to Subject List