Question

Je suis en train de programmer le STM32 parler à mon i2c Eeprom, mais il semble que chaque fois que je dis:

I2C_GenerateSTART(I2C1, ENABLE);
while( !(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)) );  the code hangs here

Je suis passé par le débogueur et j'ai trouvé que le bit 0 SR1 drapeau (ce qui est le bit de départ indicateur généré) est pas défini qui est la raison pour laquelle le code se bloque. Je peux voir dans l'oscilloscope que le bit de démarrage a été généré et cela fonctionne parfois. il se casse habituellement quand j'essayé de faire plusieurs écritures de suite. J'ai vérifié le HW est tout semble bien que j'ai vérifié la fréquence que je suis en cours d'exécution sur le bus I2C est bien 100Khz dans le eeprom 24lc1025.

idées,

Merci

Était-ce utile?

La solution

Puisque vous dites que ce casse généralement lorsque vous faites plusieurs écritures de suite, vous pourriez vouloir vous assurer que vous n'êtes pas violer cette note dans la fiche technique STM32 pour le bit STOP dans le registre de contrôle I2C_CR1:

  

Note: Lorsque le bit STOP, START ou PEC est défini, le logiciel ne doit pas effectuer une écriture   l'accès à I2C_CR1 avant ce bit est effacé par le matériel. Sinon, il y a un risque de   établir une seconde demande STOP, START ou PEC.

Une fois que vous avez défini le bit STOP vous devez vous assurer que le matériel a autorisé avant que vous écrivez le bit suivant START.

Autres conseils

Vérifier l'Errata pour votre appareil (l'obtenir à partir du site ST). Le STM32 a beaucoup de bugs dans la mise en œuvre I2C. Le errata donne des solutions de contournement de logiciels pour eux.

En outre, lorsque vous utilisez les fichiers source du pilote généralement fournies avec les plates-formes STM32, ne pas oublier de lire les en-têtes! Ils peuvent être très utiles, surtout pour les novices (comme moi) qui ne savent pas où commencer.

Dans ce cas, vous regarderiez stm32f4xx_i2c.c

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top