L’esclave I2C n’ACK pas assez rapidement

Conor Patrick

L’esclave I2C n’ACK pas assez rapidement


Je programme un microcontrôleur pour parler avec un appareil esclave via I2C. Mes transactions I2C obtiennent toujours NACK’d, mais je crois que l’esclave est ACK’ing la transaction, juste un peu trop tard et mon microcontrôleur se prend pour un NACK. Corrigez-moi si j’ai tort, s’il-vous plait.

Voici une trace de la transaction.

I2c Trace

L’esclave conduit SDA bas à la fin pour ACK la transaction. Mais ma bibliothèque I2C le signale toujours comme un NACK. De plus, l’esclave maintient SDA bas car ce n’est pas une 9ème impulsion d’horloge, et mon périphérique I2C se bloque en essayant de terminer la condition d’arrêt.

Ma bibliothèque I2C est une bibliothèque fiable du fabricant que j’ai utilisée plusieurs fois avec succès avec différents appareils. Je pense que l’esclave est juste un peu trop lent avec l’ACK.

La trace actuelle est à 100 KHz mais j’ai essayé à 10KHz et ça fait la même chose. Des suggestions pour résoudre ce problème?

Plus de détails :

  • esclave: AMS AS3955

  • maître: Silicon labs EFM32 Pearl

Mettre à jour

J’ai mordu l’opération I2C en question et ajouté le 9ème cycle d’horloge. Le même problème se produit. Après l’opération, je déconnecte le SDA et le mesure côté microcontrôleur et côté esclave. Le Micro-SDA est haut (correct) mais le SDA esclave est encore bas. Il semble donc que cela puisse être plus un problème avec le périphérique esclave qu’un problème I2C, non?

entrez la description de l'image ici

Update 2

Voir ma réponse publiée.

Ale..chenski

Il semble que votre hôte se comporte mal. Même si un esclave est lent, votre hôte doit enregistrer une condition, ACK ou NACK, cela ne devrait pas avoir d’effet sur la fin du paquet. L’esclave ne peut pas supprimer l’ACK car il doit y avoir une autre phase « LOW » de l’horloge, qui ne provient pas de votre hôte.

Le photon

Qu’est-ce que l’esclave?

Dave Tweed ♦

Est-ce un esclave que vous avez utilisé auparavant? Il devrait générer l’ACK sur le neuvième front descendant de l’horloge, mais il semble attendre le front montant suivant. Comme cela se produit à n’importe quelle vitesse, ce n’est pas un simple problème de timing.

Dave Tweed ♦

BTW, il y a neuf impulsions d’horloge – étant donné que l’état de veille de l’horloge est élevé, vous devez compter le nombre de fois où elle devient faible, et il y en a neuf. 9 fronts descendants qui déclenchent l’un ou l’autre appareil pour changer l’état de la ligne de données, et 9 fronts montants où ils les échantillonnent tous les deux.

Conor Patrick

Ceci est un nouvel esclave pour moi. Il s’agit de la puce AMS AS3955 NFC.

Réponses


 Conor Patrick

Il s’avère que mon esclave I2C ne prend pas en charge I2C.

L’AMS AS3955 est configuré en tant que périphérique SPI ou I2C en usine. Mon appareil est un SPI et je ne l’ai pas remarqué.

Merci pour les discussions!

Érable

ROFL Tu nous as sûrement fait sauter à travers les cerceaux


 Érable

L’esclave conduit SDA bas à la fin pour ACK la transaction.

Je ne vois pas ça. La ligne SDA ne doit pas monter du tout. L’esclave lit les données entrantes sur le front montant de l’horloge. Ainsi, lorsque la 8ème horloge monte, l’esclave sait déjà si c’était la bonne adresse, il tire donc SDA presque immédiatement après la descente de SCL.

Assurez-vous que l’adresse est correcte.

De plus, l’esclave maintient SDA bas car ce n’est pas une 9ème impulsion d’horloge, et mon périphérique I2C se bloque en essayant de terminer la condition d’arrêt.

Comment savez-vous que c’est l’esclave qui maintient la ligne basse? Il est fort possible que votre bibliothèque fiable ne gère pas correctement NACK.

Henry Crun

btw, les esclaves ne lisent pas les données sur le front montant (car ils peuvent changer à chaque fois que SCL est bas et peuvent ne pas s’être stabilisés lorsque SCL augmente). Ils l’ont lu sur le front descendant.

Érable

@HenryCrun Quelle charge de baloney! Les esclaves ne peuvent pas savoir quand le front descendant entre . Techniquement, ils lisent SDA pendant l’état haut de SCL, mais la lecture est déclenchée par le front montant, et c’est exactement ce qu’on appelle la « lecture sur front montant ». Apprenez les bases avant de donner des conseils.

Henry Crun

"Slaves cannot possibly know when falling edge comes in." Je pensais que regarder SCL leur permettrait de voir le front descendant?

Érable

L’échantillonnage SDA sur front descendant n’a aucun sens, en particulier à des fréquences d’horloge plus élevées. Cela crée toutes sortes de problèmes, voyez ceci par exemple. D’un autre côté, l’échantillonnage sur front montant est parfaitement sûr, car SDA doit déjà être défini bien avant.

Érable

@ConorPatrick La condition d’arrêt est une transition SCL faible à élevée tandis que SDA est faible. Et si SDA est déjà bas, rien n’empêche le maître de faire descendre et remonter l’horloge. À partir de votre maître de capture d’écran, il n’essaie même pas de le faire. Il semble plutôt que la bibliothèque ne sait pas quoi faire avec NACK. Vous envoyez l’adresse 0x50. Êtes-vous sûr que les 3 bits inférieurs n’ont pas été remplacés dans l’EEPROM?


 Henry Crun

Vous affichez seulement 8 impulsions d’horloge pour les données et n’affiche pas le 9e front descendant de l’impulsion d’horloge ACK.

Le SDA ne devrait pas chuter en même temps que le SCL augmente. Il aurait dû s’installer bas dans quelques-uns d’entre nous de la chute de SCL, et avant la hausse de SCL. Le maître doit sortir le 9e front descendant de l’horloge et échantillonner le SDA juste avant / au front descendant.

Je soupçonne que votre esclave n’accuse pas (l’adresse est fausse) car SDA reste élevé, et votre bibliothèque abandonne et force SDA bas peut-être.

S’il s’agit d’un maître matériel, il n’est peut-être pas défini pour I2C, c’est-à-dire qu’il fait 8 horloges et non 9. (car il est en mode SPI)

Si c’est un peu bash master, alors vous devriez échantillonner SDA juste avant de faire tomber SCL (ce que vous ne faites pas), et certainement quelques-uns d’entre nous après le front montant.

Jetez un oeil à cette note d’application que j’ai écrite, qui vous montre comment voir quelle puce (maître ou esclave) tire la broche vers le bas. Il parle de SCL, mais fonctionnera de la même manière pour SDA

schématique

simuler ce circuit – Schéma créé à l’aide de CircuitLab

BTW, par expérience, les bibliothèques des fabricants sont rarement entièrement fonctionnelles ou correctement déboguées.

Elliot Alderson

Je pense que ce circuit pourrait rendre les niveaux de basse tension logiques trop élevés pour un fonctionnement fiable. Le maximum

Henry Crun

Non, VIL est ce qui compte (0,3 VDD = 1,5 V). Ça fonctionne bien. Lisez l’appnote. Il existe un cas particulier où vous avez besoin de schottkys: prolongateurs de bus et isolateurs. Ceux-ci doivent utiliser un seuil pour déterminer la direction de conduite. Mais si vous avez des schottkys, ils fonctionnent bien ou mieux aussi.

Elliot Alderson

Vous supposez que

Henry Crun

Elliot, il s’agit d’un gabarit de test simple permettant à quelqu’un de déterminer quelle puce conduit. Ça ne va pas mars. Il n’a pas été nominé pour un prix Nobel et ne fonctionne pas dans de l’azote liquide ni n’aide le camarade Kim à atterrir sur le soleil la nuit. Dans les traces de portée (vous avez bien regardé?) La tension est de 0,7V avec de vraies puces. Ça marche bien sur terre, quand je n’ai pas à porter de chaussettes. Peut-être pas sur mars.

Elliot Alderson

Ma préoccupation est que quelqu’un qui ne connaît pas mieux essaiera d’utiliser ce circuit pour déboguer un système fonctionnant à, disons, 3,0 V (sur Terre, à température ambiante, avec des chaussettes) et finira par tourner en rond quand rien fonctionne du tout. Oui, vous avez réussi à le faire fonctionner à 5V avec un certain ensemble d’appareils, je le vois. Je viens de faire écho à des informations qui se trouvaient dans votre propre note au cas où le lecteur ne cliquerait pas dessus.

 

#pas, assez, I2C, L’esclave, n’ACK, rapidement

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *