STM32 I2C1 bit de départ pas défini sur le registre SR1
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
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
ouPEC
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 demandeSTOP
,START
ouPEC
.
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