Bonsoir
J'ai un souci avec le protocole I²C ... j'utilise un pic 18f452 avec un module FM (site), le pic est en maitre et le module en esclave donc !
Voilà les bout de code, je mets pas tout, car l'erreur se situe surtout dans la fonction d'écriture ... en gros, j'ai le bit WCOL qui se met à 1 et je comprends pas pourquoi, même si le programme compile, se lance jusqu'au while ... Mais régler ce souci serait bien
Le pic est alimenté par un quartz de 8mhz, et j'ai pris pour la ligne SCL 400 kHz (soit SMP à 0 et un SSPADD avec comme valeur 4 suivant la formule du datasheet du pic, à priori si j'essaie de mettre 1 MHz ca marche pas...)
C'est dans cette fonction que le WCOL se met à 1, juste après la ligne en gras/soulignée :Code:unsigned char WriteI2C( unsigned char data_out ) { SSPBUF = data_out; // write single byte to SSPBUF if ( SSPCON1bits.WCOL ) { // test if write collision occurred return ( -1 ); } // if WCOL bit is set return negative # else { while(!SSPSTATbits.BF); // wait until write cycle is complete return ( 0 ); // if WCOL bit is not set return non-negative # } }
Code:void ar1000_write(char reg_address, uint16_t reg_value) { char ack; uint8_t value1 = (reg_value & 0xFF00) >> 8; uint8_t value2 = (reg_value & 0x00FF); AGAIN: StartI2C(); //Send start condition ack = WriteI2C(AR1000_W); while (SSPCON2bits.ACKSTAT); ack &= WriteI2C(reg_address); //Send address to write to while (SSPCON2bits.ACKSTAT); ack &= WriteI2C(value1); //Send the two data bytes to be stored while (SSPCON2bits.ACKSTAT); ack &= WriteI2C(value2); while (SSPCON2bits.ACKSTAT); StopI2C(); if(ack == 0) {; goto AGAIN; } }Code:void I2C_Init(void) {int i; SSPCON1 = 0x00; // power on state SSPCON2 = 0x00; // power on state SSPCON1 |= MASTER; // Master Mode selected SSPCON1 |= SSPENB; // enable synchronous serial port SSPADD = 4; SSPSTATbits.SMP=0; // 400 kHz SSPSTATbits.CKE = 0; SSPCON1bits.WCOL = 0; for(i=0;i<9000;i++); ar1000_init(); }S'il y a des questions ...Code:void main(void) { TRISD = 0xFF; ADCON1 = 0xC7; TRISA = 0xFF; TRISC=1; INTCONbits.GIE = 1; I2C_Init(); ar1000_tune_hilo(760); while(1) { } }
Merci !
-----