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

Problème I2C



  1. #1
    invitebe2a9ce7

    Problème I2C


    ------

    Bonjour à tous,
    Je suis face a un problème de communication I2C entre mon micro STM32L152RB ( STM32L-Discovery) et ma mémoire EEPROM M24LR64 ( ANT2-M24LR-A)
    Je met en fichier joins ce que j'obtiens sur l'oscillo, après le start j'ai un temps d'attent dont je ne sais pas d'ou il vient, ensuite j'envoie bien mon adresse, seulement l'acquitemment qui doit venir de la mémoire est un peu bizarre et je sais pas pourquoi.
    je vous joins aussi mon code:
    I2C_GenerateSTART(I2C2, ENABLE); Delay(10);
    /* adresse */
    I2C_Send7bitAddress(I2C2,0xA0, I2C_Direction_Transmitter);Del ay(10);

    I2C_SendData(I2C2,0x10);Delay( 10);// Send Data
    I2C_SendData(I2C2,0x01);Delay( 10); // Send Data
    I2C_GenerateSTOP(I2C2, ENABLE);
    Delay(10);


    Donc si quelqu'un avait une idée d’où le problème pourrait venir, sa m'aiderait beaucoup ( je buche depuis pas mal de temps la dessus)
    En tous cas merci d'avance et bonne journée.


    Nom : tek00000.png
Affichages : 245
Taille : 30,9 Ko

    -----

  2. #2
    invite5637435c

    Re : Problème I2C

    Bonjour,

    Les temps que tu ne comprends pas viennent de l'usage de tes delay.
    introduire des delay n'est pas indiqué en I2C, je te conseillerai plutôt de surveiller si le bus est iddle (libre) ou pas et de gérer correctement les bits ACK.

  3. #3
    invitebe2a9ce7

    Re : Problème I2C

    même sans les délay ce temps là est toujours présent, si j'enlève les delay partout je ne visualise que le bit d'adresse, les acquitemement sont autorisé mais celui que j'attend ne vient pas du micro mais de la mémoire, si je change l'adresse il reste en front haut, et avec la bonne adresse il y a ce truk bizarre

  4. #4
    invite5637435c

    Re : Problème I2C

    Je ne vois pas de restart dans ton code à la suite de l'adressage de ton E²PROM.

    Le code que tu postes est un peu court, il faudrait voir l'ensemble des déclaratifs I2C.

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

    Re : Problème I2C

    Je ne comprend pas l'utilisation du mot "restart"
    je te met l'init des i/o:

    GPIO_InitTypeDef GPIO_InitStructure;
    I2C_InitTypeDef I2C_InitStructure;

    /* Enable I2C clock */
    RCC_APB1PeriphClockCmd(RCC_APB 1Periph_I2C2, ENABLE);

    /* Enable GPIOA clock */
    RCC_AHBPeriphClockCmd(RCC_AHBP eriph_GPIOB, ENABLE);
    /* Configure PB.10 & PB.11 in alternate function -------------------------*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource10,GPIO_AF_I2C2) ;
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource11,GPIO_AF_I2C2) ;

    /* Enable I2C2 -------------------------------------------------------------*/
    I2C_DeInit(I2C2);
    I2C_Cmd(I2C2, ENABLE);

    /* Init I2C */
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycl e = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_OwnAddre ss1 = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_ClockSpe ed = 200000;
    I2C_InitStructure.I2C_Acknowle dgedAddress=0;
    I2C_Init(I2C2,&I2C_InitStructu re);

  7. #6
    invite5637435c

    Re : Problème I2C

    Un maître peut enchaîner plusieurs trames en renvoyant une condition de départ (restart) à la suite d'une première trame émise en l'occurence lorsque l'acquisition des données doit accéder à des sous registres comme dans le cas d'une E²PROM par exemple ou d'une RTC genre DS1307.
    Je vais regarder ton code.
    @+

  8. #7
    invitebe2a9ce7

    Re : Problème I2C

    Je suis ce qui a sur ce site:
    http://col2000.free.fr/i2c/protocol/i2c_pro.htm
    donc dans le cas d'une écriture je ne devrais pas avoir a refaire de START.
    Je me sus aussi pas mal inspiré de cet autre site:
    http://www.micromouseonline.com/2011...#axzz1tiC1K8mE
    Mais je sais pas pourquoi l’acquittement ce ma mémoire est comme ça, et pourquoi quand je ne met pas de delay, je n'observe que le bit d'adressage et directement après le Stop comme si il n'y avait rien d'autre dans le code.
    Merci pour ton aide en tous cas

  9. #8
    invite5637435c

    Re : Problème I2C

    Tu as pris quoi comme fréquence pour ton bus?

  10. #9
    invitebe2a9ce7

    Re : Problème I2C

    400Khz mais j'ai aussi fait pour 200 pour voir s'il y avait une différence

  11. #10
    invitebe2a9ce7

    Re : Problème I2C

    Bonjour,
    Personne n'a d'idée?

  12. #11
    invite333c9ba0

    Re : Problème I2C

    Est ce que tu a vu ça : http://www.keil.com/forum/18440/

    Il me semble que tu devrais attendre la fin de l’évènement avec while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_M ODE_SELECTED ));

    Sinon, pour l'@dresse tu as bien fais attention qu'elle était codé entre les bits 1 et 7?

  13. #12
    invitebe2a9ce7

    Re : Problème I2C

    Je l'ai est enlevé pour voir la suite mais en effet normalement il doit il y avoir un while de ce type a chaque fois que je fait un appel pour envoyer recevoir...
    mais mon soucis principale est donc pourquoi l'acquittement de la mémoire est comme ça, si je change l'adresse j'ai un front haut directe ( signe que c'est pas la bonne)
    le 8ème bit correspond en effet au r/W je l'ai mis a 0 vu qu eje veut écrire

  14. #13
    invite5637435c

    Re : Problème I2C

    Cette E²PROM est un peu particulière, il faut se plonger dans la datasheet et j'ai pas trop le temps pour ça, mais il semblerait qu'elle ait une fonction "mot de passe" pour être accédée en écriture sur certains secteurs, as-tu bien regardé cet aspect?
    Je serai toi pour valider le coté soft je ferai un test avec un circuit I2C des plus communs genre PCF8574 ne serait-ce que pour valider tout ce qui est stop, start, ack, et compagnie.
    Si tu parviens à dialoguer sans problème c'est que ton soucis est du coté de cette mémoire E²PROM, donc il va te falloir plonger vraiment dans la doc car il doit y avoir une procédure particulière pour aller y écrire.
    Voir à partir de la page p23 de la doc.

  15. #14
    invite5637435c

    Re : Problème I2C

    Code:
    I2C_GenerateSTART(I2C2, ENABLE);	  Delay(10);
           /* adresse */ 
       I2C_Send7bitAddress(I2C2,0xA0,  I2C_Direction_Transmitter);Del  ay(10);  
     
       I2C_SendData(I2C2,0x10);Delay(  10);// Send Data
       I2C_SendData(I2C2,0x01);Delay(  10); // Send Data
       I2C_GenerateSTOP(I2C2, ENABLE); 
       Delay(10);
    Ne connaissant pas ton compilateur, je ne vois pas clairement où est déclaré le R/W, selon l'appelation (I2C_Send7bitAddress) on dirait que tu n'envoies que 7 bits, où est passé le 8ème?
    Si tu pouvais commenter ton code ça serait pas mal.
    @+

  16. #15
    invitebe2a9ce7

    Re : Problème I2C

    Bonjour,
    Je viens de recevoir une EEPROM basique une M24C64, et le problème est le même, toujours pas d'ack bien franc.
    le I2C_Send7bitAddress envoie bien 8 bit c'est juste que l'adresse est codé sur 7 bit et le dernier bit correspondant au R/W.
    Ce qui me choque c'est qu'après le start il y a ce long moment avec de continuer et selon la doc I2C il est supérieur au temps maximal ce qui pourrait vouloir dire que finalement la EEPROM se considère peut être pas en START, et je ne vois pas pourquoi li y aurait ce temps car le generate start il y a ceci dedans:
    void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState)
    {
    /* Check the parameters */
    assert_param(IS_I2C_ALL_PERIPH (I2Cx));
    assert_param(IS_FUNCTIONAL_STA TE(NewState));
    if (NewState != DISABLE)
    {
    /* Generate a START condition */
    I2Cx->CR1 |= I2C_CR1_START;
    }
    else
    {
    /* Disable the START condition generation */
    I2Cx->CR1 &= (uint16_t)~((uint16_t)I2C_CR1_ START);
    }
    }

    Et donc après c'est dans les registre, donc au lieu de me faire un I2C par moi même avec un timer :S

  17. #16
    invite5637435c

    Re : Problème I2C

    Il faut regarder de près la doc du compilo, il te manque, comme je le disais plus haut et également pixtache, une fonction vérifiant que le bus est libre.
    Une tempo ne suffit pas, car tu ignores le temps nécessaire selon les périphériques qui peuvent être très différents de l'un à l'autre.

    Sans ce test ça ne pourra pas fonctionner correctement, car c'est ton EEPROM qui doit dire si elle est prête à recevoir une commande, ou à émettre.
    Si tu ne lui laisses pas le temps de te répondre, ben pas de ack

    Va voir par là:
    https://my.st.com/public/STe2ecommun...communications

  18. #17
    invitebe2a9ce7

    Re : Problème I2C

    je les ai ajouté, ce qui me donne:


    I2C_GenerateSTART(I2C2, ENABLE);
    while(!I2C_GetFlagStatus(I2C2, I2C_FLAG_SB));
    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)) ;
    I2C_Send7bitAddress(I2C2,0xA0, I2C_Direction_Transmitter); Delay(20);
    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_M ODE_SELECTED));
    /* adresse */
    I2C_SendData(I2C2,0x07);//Delay(20);// Send Year register address
    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMIT TING));
    I2C_GenerateSTOP(I2C2, ENABLE);

    Et je bloque au while de après Send7bitAddress

  19. #18
    invite5637435c

    Re : Problème I2C

    Tu peux faire voir ton schema electrique correspondant a ta maquette?
    Si tu bloques dans le while() c'est que l'EEPROM ne repond pas, or elle semble correctement adressee pourtant...
    Tu as mis des pull-up sur SCL et SDA?

  20. #19
    invite5637435c

    Re : Problème I2C

    Code:
    while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
    I2C_AcknowledgeConfig(I2C2, ENABLE);
    I2C_GenerateSTART(I2C2, ENABLE);
    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
    I2C_Send7bitAddress(I2C2, 0xA0, I2C_Direction_Transmitter);
    while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    
    
    I2C_GenerateSTOP(I2C2, ENABLE);

    Essaye comme ca pour voir.
    @+

  21. #20
    invitebe2a9ce7

    Re : Problème I2C

    Saloute,
    J'ai mis des pull up en effet, même si parfois j'ai l'impression qu'elles ne servent à rien.
    J'ai essayé ton code et j'ai joins la copie d'écran pour le résultat.
    Globalement ça ne change rien :S et évidemment le programme est bloqué dans le dernier while.
    Elle bien adréssé mais peut être que vu que le start est bien avant elle se considère en repos, peut être.
    Images attachées Images attachées  

  22. #21
    invite5637435c

    Re : Problème I2C

    Poste ton schema, ce n'est pas normal que cela ne change rien.
    Quelle est la valeur de tes pull-up, la distance entre ton microcontroleur et ton EEPROM?
    Le laps de temps que dure le start et ce qui suit est tout a fait normal, le control du bus est pris c'est ca qui compte.

  23. #22
    invitebe2a9ce7

    Re : Problème I2C

    voici le schéma de la carte que j'ai:
    http://www.st.com/internet/com/TECHN...covery_sch.pdf
    J'ai mis des résistances de 4.7kohm, la longueur entre l'EEPROM et les pull up doit être de 20cm a peu prêt.

  24. #23
    invitebe2a9ce7

    Re : Problème I2C

    Chose encore étrange quand j'envoie par exemple 0x20, il devrait y avoir SDA à 1 juste aux troisième front du SCL, seulement c'est décalé, et de ce qu'il en ressort j'ai en faite ça:
    4.2.1.8.4.2.1 ( l'ordre des poids)
    Seulement quand j'envoie l'adresse il n'y a pas cette erreur, peut être cela vient des DELAY car j'ai essayé en ne passant pas par les fonctions mais directement par les registre et j'ai toujours ce décalage.
    En exemple pour que cela soit plus compréhensible, avec ce code:
    Code:
    I2C_AcknowledgeConfig(I2C2, ENABLE);	
       while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY)); 
       I2C_GenerateSTART(I2C2, ENABLE);
       while(!I2C_GetFlagStatus(I2C2, I2C_FLAG_SB));	  
       while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT)); 
       I2C2->DR = 0xA0;Delay(17);  // Pour l'adresse
       I2C2->DR = 0xF0;Delay(17);  // pour la zone mémoire	
       I2C2->DR = 0x20;Delay(17); // data
    voici le résultat:
    Nom : tek00002.png
Affichages : 204
Taille : 25,5 Ko
    et chose d'autant plus bizarre le deuxième envoie qui correspond à la zone mémoire ce fait squouizzé et du coup le data est affiché deux fois de suite après, de quoi rendre fou, et ça marche...

  25. #24
    invitebe2a9ce7

    Re : Problème I2C

    J'ai enfin trouver la solution, il manquait dans la configuration des I/O a mettre en Open Drain du coup l'ack passe bien et plus besoin de mettre les delay et les while passe.
    Merci beaucoup pour ton aide HULK

  26. #25
    invitebe2a9ce7

    Re : Problème I2C

    Bonjour à tous,
    Je reviens vers vous encore pour des problèmes d'I2C,
    La lecture et l'écriture fonctionne de manière toute a fait correcte, mais je ne sais pas pourquoi le programme bloque dans un des whiles lors que je met 2 read à la fois, et quand je met 2 write à la suite il écrit ce que je devais mettre dans le 2ème dans la première adresse.
    Du coup c'estplus de l'ordre de l' I2C le problème et non du STM32, est ce qu'après chaque fin de lecture il faut faire quelque chose de spécial? j'ai l'impression qu'un delay est utile mais ce n'est pas très approprié pour ce que je fais.

Discussions similaires

  1. Problème I2C
    Par marc2009 dans le forum Électronique
    Réponses: 6
    Dernier message: 22/03/2011, 13h01
  2. probleme I2C
    Par invite91a552e4 dans le forum Électronique
    Réponses: 6
    Dernier message: 15/05/2010, 12h16
  3. Problème i2c PIC18F4550
    Par invitec7e0ab97 dans le forum Électronique
    Réponses: 0
    Dernier message: 08/02/2010, 19h12
  4. Problème de bus I2C
    Par invited67456b2 dans le forum Électronique
    Réponses: 6
    Dernier message: 28/02/2009, 11h57
  5. Probleme I2C
    Par invite47dfc8ff dans le forum Électronique
    Réponses: 4
    Dernier message: 14/05/2006, 02h24
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...