Mon code pour le module I2C ne fonctionne pas
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Mon code pour le module I2C ne fonctionne pas



  1. #1
    schneiderj

    Mon code pour le module I2C ne fonctionne pas


    ------

    Bonjour

    à l'aide de la note d'application de Microchip concernant l'utilsation des EEPROM I2C, j'ai écrit ce flow chart. A partir de celui-ci j'ai rédigé les fonctions suivantes :
    Code:
    void I2Cjms_Initialise()
    {
    	INTCON|=(1<<GIE | 1<<PEIE);	//Enable global interrupt and Perique interrupt
    	I2Cjms_Stop();
    	SSPSTAT = 0;
    	SSPSTAT |= (1 << SMP); // disable the Slew Rate Controle : 100 kHz
    	SSPADD = 0x24; //100 kHz
    	SSPCON1 = 0x28;
    	SSPCON2 = 0;
    	TRISC |= (1 << SCL); //RC3 as input
    	TRISC |= (1 << SDA); //RC4 as input
    	CompteBoucle = 0;
    	SSPIF_flag = 0;
    }
    
    void I2Cjms_Stop()
    {
    	bSSPIF = 0;
    	Start_Flag = 0;
    	//SSPCON2 |= (1<<PEN); // send a stop 
    	while(SSPIF_flag != 1)
    	{
    		Start_Flag = 0;
    	}
    	SSPIF_flag = 0;
    	Start_Flag = -1;
    	SSPCON1 &=~ (1 << SSPEN); // disable the SSP module
    }
    Le problème est que le système reste coincé dans la boucle de la fonction stop. Le flag bSSPIF reste à 0.

    D'où provient mon problème ?

    Merci pour vos commentaires,
    Jean-Marie

    NB : le PIC est 18F252

    -----

  2. #2
    schneiderj

    Re : Mon code pour le module I2C ne fonctionne pas

    Pas grand monde apparemment pour parler d'I2C.

    J'ai supprimé l'appelle à la fonction stop. Grâce à l'enregistreur d'état logique recommandé par Jack j'obtiens ceci :

    Le start est bien là, mais après plus rien. Il semble que je n'obtiens pas de réponse ni ACK ni SSPIF ne passe à 1...

    Cette fois j'appelle directement après l'initialisation la fonction write qui est :
    Code:
    void I2CjmsWrite(unsigned char *I2C_Byte, unsigned char I2C_size)
    {
    	bSSPIF = 0;
    	Start_Flag = 1;
    	bit EcrireByte = 0;
    	SSPCON2 |= (1 << SEN);
    	
    	char Phrase[15] = "Debut I2C Write : ";
    	unsigned char ia = 0;
    	PrintRS232(Phrase, ia);
    	
    	while(Start_Flag == 1)
    	{
    		if (CompteBoucle <= I2C_size)
    		{
    			while(bACKSTAT | SSPIF_flag != 1)
    			{
    				EcrireByte = 1;
    			}
    			
    			if (EcrireByte)
    			{
    				PrintRS232(Phrase, CompteBoucle);
    				SSPBUF = I2C_Byte[CompteBoucle - 1];
    				EcrireByte = 0;
    			}
    		}
    		else if (CompteBoucle == I2C_size)
    		{
    			Start_Flag == 0;
    		}
    	}
    	
    	// attend de recevoir le ACK et que le Flag soit passé à 1 pour être sûr que l'écriture soit terminée
    	while (bACKSTAT | SSPIF_flag != 1)
    	{
    		
    	}
    }
    Une idée ?
    Jean-Marie

Discussions similaires

  1. mon éolienne ne fonctionne pas
    Par invitee6bf19fb dans le forum Environnement, développement durable et écologie
    Réponses: 3
    Dernier message: 18/01/2008, 20h05
  2. mon 68hc908 ne fonctionne pas seul
    Par invite17ef3108 dans le forum Électronique
    Réponses: 14
    Dernier message: 22/10/2007, 21h03
  3. Mon montage ne fonctionne pas :-(
    Par invite59a115ce dans le forum Électronique
    Réponses: 14
    Dernier message: 08/08/2007, 21h34
  4. Mon frigo ne fonctionne pas mais pourtant ...
    Par invite97c5c039 dans le forum Dépannage
    Réponses: 4
    Dernier message: 08/06/2006, 13h35
  5. mes javascript:popupimage ne fonctionne pas sur mon site web mais fonctionne en local
    Par invite4ff499e4 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 6
    Dernier message: 28/01/2006, 18h31
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...