J'essaie de communiquer avec une FRAM connectée à distance (FM24C04 de Ramtron) en utilisant I2C. Cette mémoire est intégrée sur une carte qui peut être insérée et retirée à tout moment vers / depuis le système (la communication est correctement terminée avant la suppression de la mémoire).
Le problème est: juste après avoir inséré la carte qui contient la FRAM, parfois , elle ne reconnaît pas l'adresse.
Mesures des signaux
J'ai mesuré les signaux pour voir ce qui se passe et il semble que le timing soit correct dans les deux cas (fonctionne et ne fonctionne pas).
Communication I2C correcte (lecture de 3 octets):
Adresse I2C FRAM non acquittée (l'adresse esclave est correctement envoyée):
Actions déjà réalisées pour résoudre ce problème (sans succès)
- Délai ajouté après l'insertion de la carte avec la FRAM intégrée afin de garantir le respect de la séquence d'alimentation.
- Arrêt de la génération I2C après détection d'une adresse esclave non acquittement
Configuration du bus I2C
- Un maître (microcontrôleur STM32F205 de ST)
- Trois esclaves (EEPROM 24AA1025 de Microchip, RTC DS1339C de Maxim IC et la télécommande FRAM FM24C04 de Ramtron
- Un sélecteur de niveau I2C (MAX3373E de Maxim IC) est utilisé pour permettre la communication entre le maître et la FRAM
- Fréquence du bus réglée sur 100 kHz
MODIFIÉ (2013-04-17)
Tout d'abord, merci à tous pour vos commentaires.
Puisqu'il y a beaucoup de suggestions, voici la description des enquêtes que j'ai faites.
Schémas
L'illustration suivante montre un schéma simplifié du bus I2C:
Les signaux I2C_SDA et I2C_SCL sont directement connectés au microcontrôleur et les signaux FRAM_SDA et FRAM_SCL sont connectés à la FRAM. Notez que les signaux SDA et SCL connectés à la FRAM sont filtrés en utilisant des ferrites BLM18 de Murata.
Le FRAM est connecté comme suit:
- NC (broche 1) -> non connecté
- A1 (broche 2) -> GND
- A2 (broche 3) -> GND
- VSS (broche 4) -> GND
- SDA (broche 5) -> FRAM_SDA
- SCL (broche 6) -> FRAM_SCL
- WP (broche 7) -> GND (non protégé en écriture)
- VDD (broche 8) -> + 5V
Description de la carte FRAM
Cette carte est une carte de type "ISA" qui n'incorpore que la FRAM.
Enquêtes
Ralentir la fréquence
J'ai effectué des tests avec la fréquence SCL réglée sur 50 kHz et 10 kHz. J'ai mesuré le signal SCL avec un oscilloscope pour m'assurer qu'il était à la fréquence attendue.
Ces modifications n'ont pas résolu le problème. J'ai vérifié les horaires et ils sont conformes aux spécifications de la fiche technique FRAM.
Assurer la séquence de puissance
@jippie.
- Le sélecteur de niveau I2C est mis en mode trois états avant que la carte qui incorpore la FRAM soit insérée. Les signaux FRAM_SDA et FRAM_SCL sont tirés bas.
- Après l'insertion de la "carte FRAM", un délai de 100 ms est ajouté afin de garantir la stabilisation de l'alimentation (au moins 11 ms nécessaires avant la première condition de démarrage selon la fiche technique).
- Le sélecteur de niveau I2C est activé.
- Un délai de 1 ms est ajouté afin de s'assurer que le levier de niveau I2C est activé et que les lignes sont relevées (~ 4us requis par la fiche technique). Les signaux FRAM_SDA et FRAM_SCL sont extraits.
- Le FRAM est accessible.
Les signaux FRAM_SDA et FRAM_SCL ont été mesurés après chaque étape.
Le problème persiste.
Condition d'arrêt / démarrage au lieu d'un démarrage répété
@gbarry.
J'ai essayé de mettre un arrêt avant le démarrage répété pendant le transfert d'octets. J'ai mesuré le transfert d'octets avec l'oscilloscope: la condition STOP suivie de la condition START est OK.
Malheureusement, cette solution ne résout pas le problème.
Pensées
Ce problème se produit uniquement juste après la connexion de la carte incorporant la FRAM. J'ai exécuté quelques milliers d'accès en lecture réussis (adressage et lecture esclaves) après que la "carte FRAM" a été insérée et correctement adressée.
Cela ressemble de plus en plus à un problème matériel. Mais je ne sais pas si cela pourrait être lié au décalage de niveau I2C ou aux autres esclaves sur le bus I2C.
Avez-vous d'autres idées ou suggestions?
MODIFIÉ (2013-04-18)
Le problème semble résolu
J'ai remplacé le connecteur du module FRAM et j'ai trouvé un moyen de faire des mesures directement sur la FRAM. Il semble que tout fonctionne bien avec ce nouveau connecteur.
Je ferai plus de tests pour être sûr que le problème vient d'une mauvaise connexion.