2014-06-06 1 views
5

J'essaie actuellement d'obtenir une paire de stm32l152 (kit de découverte) pour communiquer via I2C. (Je ne suis pas en utilisant la bibliothèque périphérique standard fournie par STM que je veux essayer de mettre en œuvre le i2c moi-même ..)Configuration des ports de sortie STM32 pour I2C

Ma configuration est comme suit:

  • mode d'adressage 7 bits (pas double adresse, seulement OAR1)

  • vitesse de 100kHz

  • ACK activé (slave)

  • ACK dis abled (le maître, étant donné que seul 1 octet est transféré entre le maître/esclave, à tout moment)

  • à la fois maître/esclave, en utilisant GPIOB (PB10) comme SCL et GPIOB (PB11) comme SDA

Voici la partie bizarre: quand je configure les 2 broches GPIOB comme push-pull (pas de pullup/down), je suis capable de voir mon maître envoyer le bit de départ, l'octet d'adresse .. sur l'oscilloscope.

Mais mon esclave ne renvoie pas d'accusé de réception. Je le sais avec certitude car le maître n'a pas affirmé le bit ADDR dans SR1, je ne vois pas d'ack sur la portée et aussi l'esclave n'est pas entré en interruption (j'ai activé l'interruption d'événement I2C sur l'esclave). En regardant de plus près la forme d'onde sur la lunette, j'ai réalisé que le signal (les deux SCL, SDA) ne passait pas complètement à 0 volts pour la logique basse, ils sont à 1 volts à la place. Je devine ceci peut-être pourquoi l'esclave ne peut pas lire l'octet d'adresse du maître et n'a donc pas renvoyé l'ack. Donc, je configure les 2 broches GPIO à ouvrir-drain (pas pullup/down) .. mais maintenant mon maître ne peut pas envoyer le bit de démarrage .. je passe par le code et vu que le bit SB du maître dans SR1 est réglé quand je mets le bit START .. mais je ne vois pas la réponse sur les signaux SDA et SCL sur la portée (les deux sont élevés à 3V). (J'ai tiré à la fois SCL et SDA à 3v en utilisant 10kohms sur chaque ligne).

Répondre

5

ok, je pense que j'ai trouvé la réponse .. J'ai recherché la bibliothèque périphérique standard fournie par STM et suivi leur séquence de configuration. Avant cela, j'utilisais la mauvaise séquence de configuration des ports GPIO ...

La séquence testée à travailler est:

  1. activer l'option i2c et horloges GPIO.

  2. Configurez l'AF souhaité des ports. (AF4 pour i2c dans stm32).

  3. Configurer GPIOs:

    3a. définir GPIO comme AF.

    3b. régler la vitesse du port.

    3c. définir le type de port (drain ouvert).

    3D. mis à aucune pull-up/pull-down.

  4. Configurez i2c. (registres CR2, CCR, CR1, OAR1, ...).

Auparavant, je faisais l'étape 3 AVANT l'étape 2, et il n'y a pas de sortie des ports quand j'ai généré le bit START.

Espérons que cela aide ceux qui ont le même problème.

+0

Vous devriez accepter la réponse si cela a fonctionné. –

Questions connexes