1
votes

STM32 I2C définit SDA sur faible

Y a-t-il un moyen de régler les broches SDA et SCL de la connexion I2C1 du STM32 sur un signal bas ou haut?

J'utilise une puce de sécurité et je dois envoyer une condition de réveil, avec la condition suivante:

si SDA est maintenu au niveau bas pendant une période supérieure à 60us, l'appareil sortira du mode basse consommation et après un délai de 1500us, il sera prêt à recevoir les commandes I2C.

J'ai déjà essayé de basculer la broche réelle avec HAL_GPIO_TogglePin (GPIOB, GPIO_PIN_9); , mais cela ne fonctionne pas.

J'ai configuré mon projet avec STM32CubeMX.

Merci pour votre aide.


10 commentaires

De quelle puce s'agit-il? N'y a-t-il pas d'instructions pour y parvenir du côté maître I2C? Il semble que vous devriez simplement faire ceci avant de remettre le contrôle des broches GPIO au périphérique I2C du STM32.


C'est une puce électronique atecc508a. Je n'ai trouvé aucune instruction sur la façon de définir une broche sda ​​ou scl à l'état bas ou haut. Je dois mentionner que j'utilise une bibliothèque pour accéder aux fonctionnalités de la puce. Cela s'appelle cryptoauthlib et là je dois créer ma propre implémentation hal pour interagir avec l'atecc508a.


À la vitesse standard I2C, 100 kHz, 60 µs correspondent à 6 impulsions. Donc, techniquement, vous pouvez envoyer une commande 0x00 pour y parvenir.


@AndreasDuering Ma puce fonctionne en mode rapide plus (1mhz) est-il également possible d'envoyer 0x00?


Tous les périphériques STM32 ne sont pas nécessairement identiques - vous devez spécifier le périphérique exact.


Si la broche B9 est déjà configurée pour sa fonction SDA alternative, la bascule GPIO ne fonctionnera pas. Vous devrez reconfigurer dynamiquement la broche, ce qui est possible si elle n'a pas été verrouillée.


C'est une carte nucléo STM32F767ZI.


Pouvez-vous me donner un exemple sur la façon de reconfigurer la broche?


@TabmanRekoj non, dans ce cas, vous devrez (techniquement) envoyer la commande 8 fois. Cependant, je ne sais pas comment la puce / le périphérique I2C se comporte entre deux octets, si le SDA revient à l'état haut pendant un bref instant (en raison des résistances de rappel) ou non


@AndreasDuering: Étant donné que l'appareil ne répondra pas avec un ACK (car l'adresse zéro ne serait pas valide), l'indicateur AF sera défini et il est normalement nécessaire que le logiciel génère un START ou STOP, ainsi la ligne SDA restera au niveau bas si le maître ne fait ni l'un ni l'autre. La répétition de l'envoi générera nécessairement un START, donc ne fonctionnera pas - au lieu de cela, vous ne devez rien faire exactement pendant la période requise.


3 Réponses :


1
votes

Dans I2C, la condition START nécessite une transition de haut en bas, si vous envoyez ensuite une adresse factice 0, un NACK sera généré (ou plutôt l'absence de réponse sera interprétée comme un NACK). Dans une transaction normale, le logiciel répondrait au NACK en générant une condition START ou STOP répétée, mais cela doit être fait dans le logiciel, donc tout ce que vous avez à faire est de ne rien faire pendant 1,5 ms. Par la suite, vous pouvez générer le START avec l'adresse réelle de l'appareil, et si l'appareil fonctionne, il générera un ACK.

Je ne suis pas familier avec le pilote de bibliothèque HAL, et franchement la documentation est épouvantable, mais il est possible que cela ne vous donne pas le contrôle nécessaire, et vous devrez accéder au périphérique I2C au niveau du registre au moins cette procédure. Vous pouvez essayer un appel I2C_MasterRequestWrite () de longueur nulle à l'adresse zéro suivi d'un délai. Un oscilloscope serait utile ici pour s'assurer que la synchronisation attendue du signal est générée.


0 commentaires

0
votes

Lorsque vous initialisez I2C, le mode des broches GPIO est défini sur MODE ALTERNATIF, donc l'écriture de commandes HAL ne fonctionnera pas dessus.

L'utilisation des bibliothèques HAL normales ne vous aidera pas dans ce domaine. Vous devez configurer vous-même le protocole I2C en utilisant les registres stm32.


0 commentaires

0
votes

Je recommande que la propre adresse de l'adresse esclave utilisant le périphérique du canal I2C utilisant des ensembles comme le code ci-dessous.

I2C_InitStructure.I2C_OwnAddress1 = 0x30; // the unique slave address of the deviecs

car le maître pourrait envoyer l'opération de diffusion et non l'opération unique .


0 commentaires