Bonjour,
j'essaie de communiquer avec le capteur de température TC74A3 en I2C, mais j'ai à chaque fois une collision sur le bus. Je n'arrive pas à trouver d'où cela provient, quelqu'un aurait une piste?
Voici mon code :
j'utilise les fonctions d'I2C fournies par microchip.
Code:void Init_I2C() { // errata code from errata pdf TRISBbits.RB0=0; TRISBbits.RB1=0; LATBbits.LATB0=0; LATBbits.LATB1=0; TRISBbits.RB0=1; TRISBbits.RB1=1; SSPSTAT =0x00; SSPCON1 = 0x00; SSPCON2 = 0x00; SSPBUF = 0x00; //Réglage de l'I2C SSPSTATbits.SMP = 0; // slew rate disabled for standard speed mode SSPSTATbits.CKE = 1; // enable SMBus specific inputs SSPCON1bits.SSPEN =1; // configure pins for I2c and not I/O SSPCON1bits.SSPM = 0b1000; // master mode SSPCON1bits.CKP = 0; PIR1bits.SSPIF = 0; // Clear MSSP interrupt request flag OpenI2C(MASTER, SLEW_ON);// Initialize I2C module SSPADD = 9; //Paramétrage de la fréquence des signaux I2C --> 100kHz PIR1bits.SSPIF = 0; // Clear MSSP interrupt request flag PIR2bits.BCLIF = 0; // clear collision flag while(SSPCON1bits.SSPM!=0b1000); }Code:void IdleI2C( void ) { while ( ( SSPCON2 & 0x1F ) || ( SSPSTATbits.R_W ) ) continue; }et voici le début de ma communication, ou dès le premier test, à chaque tentative, il y a collisionCode:void StartI2C1( void ) { SSP1CON2bits.SEN = 1; // initiate bus start condition }
Code:Init_I2C(); ClrWdt(); // Reset du WatchDog Timer IdleI2C(); //Attente de la disponibilité du bus I2C StartI2C(); //Envoi d'une condition START while (SSPCON2bits.SEN); //Attente de la validation de la condition START IdleI2C(); //Attente de la disponibilité du bus I2C if (PIR2bits.BCLIF) // Test d'une éventuelle collision sur le bus { SSPCON1=0x00; SSPCON1=0x28; // 1 au SSPEN pour pins SDA/SCL, et config master mode PIR2bits.BCLIF = 0; return 1; // Retour d'une erreur de collision sur le bus }
-----