1: #include 2: #include "hardware.h" 3: #define __DEBUG 4: void init_i2c(void) { 5: char x ; 6: #ifdef __DEBUG 7: TRISB5=0; // RA4 reflete l'état du dernier ACK du SONAR 8: RB5 = 0 ; 9: #define ACKLED RB5 10: #endif 11: TRISC3 = 1 ; //SDA et SCL en entrée 12: TRISC4 = 1 ; 13: SSPSTAT = 0x80 ; // Pas de controle de slew rate, niveaux i2c 14: SSPCON = 0x28 ; // enable i2c 7bits master mode 15: SSPADD = 9 ; // fclock = 100khz = Fosc/(4(SSPADD+1) 16: x = SSPBUF ; // vide le buffer et raz flags 17: } 18: 19: unsigned int read_compass(void) 20: { 21: char bh,bl; 22: unsigned int b ; 23: SEN = 1; // send start bit 24: while(SEN); // and wait for it to clear 25: ACKDT = 0; // acknowledge bit 26: 27: ACKSTAT=1; 28: SSPIF = 0; 29: SSPBUF = 0xC0; // C0 - write command 30: while(!SSPIF); // wait for interrupt 31: SSPIF = 0; 32: #ifdef __DEBUG 33: ACKLED=ACKSTAT; 34: ACKSTAT=1; 35: #endif 36: SSPIF = 0; 37: SSPBUF = 0x02; // adress of cmd register 38: while(!SSPIF); // wait for interrupt 39: SSPIF = 0; 40: #ifdef __DEBUG 41: ACKLED=ACKSTAT; 42: ACKSTAT=1; 43: #endif 44: PEN = 1; // send stop bit 45: while(PEN); // 46: 47: 48: SEN = 1; // send start bit 49: while(SEN); // and wait for it to clear 50: ACKDT = 0; // acknowledge bit 51: 52: SSPIF = 0; 53: SSPBUF = 0xC1; // 11000001 - read command 54: while(!SSPIF); // wait for interrupt 55: SSPIF = 0; // then clear it. 56: 57: RCEN = 1; // start receiving 58: while(!STAT_BF); // wait for data 59: bh = SSPBUF; // and get it 60: ACKEN = 1; // start acknowledge sequence 61: while(ACKEN); // wait for ack. sequence to end 62: 63: RCEN = 1; // start receiving 64: while(!STAT_BF); // wait for data 65: bl = SSPBUF; // and get it 66: ACKDT=1; // very important ?? 67: ACKEN = 1; // start acknowledge sequence 68: while(ACKEN); // wait for ack. sequence to end 69: 70: PEN = 1; // send stop bit 71: while(PEN); // 72: #ifdef __DEBUG 73: ACKLED=1; 74: #endif 75: 76: b = (bh<<8) + bl ; 77: 78: return b ; 79: 80: 81: }