Problème I2C
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Problème I2C



  1. #1
    marc2009

    Problème I2C


    ------

    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...)

    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 #
      }
    }
    C'est dans cette fonction que le WCOL se met à 1, juste après la ligne en gras/soulignée :
    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();
    }
    Code:
    void main(void)
    {
    	TRISD = 0xFF;
        ADCON1 = 0xC7;
    	TRISA = 0xFF;
    	TRISC=1;
    	INTCONbits.GIE = 1;
    	I2C_Init();
    	ar1000_tune_hilo(760);
    while(1) {
    	
    }
    }
    S'il y a des questions ...

    Merci !

    -----

  2. #2
    zhal

    Re : Problème I2C

    Salut

    Ton code a l'air correct, de plus si le programme compile c'est bon signe, pour ma part je pense que l'erreur serai materielle. Sur quoi teste tu ton prog ?

  3. #3
    marc2009

    Re : Problème I2C

    une carte électronique J'ai monté tous les composants, le module aussi et tout !

    Le module fonctionne à 3.3V et le pic à 5V ! Donc mon prof m'a fait ce circuit pour "adapter" les signaux 5v <--> 3v (voir PJ)

    Mais, voilà, même si j'essaie juste (après l'appel de ma fonction I2C_Init() ) de faire un WriteI2C(AR1000_W); mais même chose, dans "Watch" j'ai WCOL qui passe à 1 ... je vois pas pourquoi ! Car là c'est en début de programme que j'essaie une écriture il devrait pas me faire ne erreur collision ... si c'est matériel, ca serait une soudure mal faite ? ou un des transistors qui est capoute ? ...

    Merci
    Images attachées Images attachées  

  4. #4
    zhal

    Re : Problème I2C

    Je suis tresetonne de ton cablage pour l'i2c ou l'a tu trouve ?

  5. A voir en vidéo sur Futura
  6. #5
    DAUDET78

    Re : Problème I2C

    Citation Envoyé par zhal Voir le message
    Je suis tresetonne de ton cablage pour l'i2c ou l'a tu trouve ?
    c'est un truc qui passe de l'I²C 5V en I²C 3V
    http://www.standardics.nxp.com/suppo...df/an97055.pdf

    Mais il faut des pullups en haut
    J'aime pas le Grec

  7. #6
    marc2009

    Re : Problème I2C

    Oui oui, il y a des résistances de pull ups !

    Ci joint la photo ^^

    et donc même mettre uniquement ce code avant le while :
    I2C_Init(); --> sans la ligne du ar1000_init() bien sur
    StartI2C();
    WriteI2C(AR1000_W);

    j'obtiens un WCOL .... bizarrement j'ai tout le temps les bits BF et R/nW à 1 ... normal ? oO (lecture ou écriture ... normalement ils doivent passer à 0 automatiquement non?)
    Images attachées Images attachées  

  8. #7
    marc2009

    Re : Problème I2C

    Ah bah non, tiens, ca marche, j'ai pas de WCOL si j'exécute le code basique :
    I2C_Init();
    StartI2C();
    WriteI2C(AR1000_W);
    WriteI2C(0); // adresse 0
    StopI2C();

    ... 'fin bon, ca va c'est une bonne nouvelle lol

    le souci donc que je viens de remarquer, c'est si j'appelle un autre WriteI2C, donc une écriture de plus, là j'ai un WCOL ... je sais pas pourquoi ! (avec BF et R/nW à 1 toujours...)

Discussions similaires

  1. probleme I2C
    Par invite91a552e4 dans le forum Électronique
    Réponses: 6
    Dernier message: 15/05/2010, 11h16
  2. Problème i2c PIC18F4550
    Par invitec7e0ab97 dans le forum Électronique
    Réponses: 0
    Dernier message: 08/02/2010, 18h12
  3. Problème de bus I2C
    Par invited67456b2 dans le forum Électronique
    Réponses: 6
    Dernier message: 28/02/2009, 10h57
  4. Problème de communication I2C
    Par todd_terry dans le forum Électronique
    Réponses: 7
    Dernier message: 02/05/2008, 19h54
  5. Probleme I2C
    Par invite47dfc8ff dans le forum Électronique
    Réponses: 4
    Dernier message: 14/05/2006, 01h24
Découvrez nos comparatifs produits sur l'informatique et les technologies.