| ??? 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; } |
| Topic | Author | Date |
| 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 |



