I2C kullanarak uzaktan bağlı bir FRAM (Ramtron FM24C04) ile iletişim kurmaya çalışıyorum. Bu bellek, sisteme / sistemden herhangi bir zamanda takılabilen ve çıkarılabilen bir kart üzerine yerleştirilmiştir (bellek çıkarılmadan önce iletişim düzgün şekilde sonlandırılır).
Sorun şudur: FRAM içeren kartı taktıktan hemen sonra, bazen adresi kabul etmez.
Sinyal ölçümleri
Ne olduğunu görmek için sinyalleri ölçtüm ve her iki durumda da zamanlamaların iyi olduğu anlaşılıyor (çalışıyor ve çalışmıyor).
Doğru I2C iletişimi (3 bayt okuma):
I2C FRAM adresi onaylanmadı (slave adresi doğru gönderildi):
Bu sorunu çözmek için zaten yapılan işlemler (başarılı olmadan)
- Güç sırasına uyulmasını sağlamak için gömülü FRAM'lı kart takıldıktan sonra gecikme eklendi.
- Ilave bir adres tespit edildikten sonra I2C durdurma üretimi onaylanmadı
I2C veri yolu yapılandırması
- Bir master (ST'den STM32F205 mikrodenetleyici)
- Üç köle (Microchip'ten EEPROM 24AA1025, Maxim IC'den RTC DS1339C ve Ramtron'dan uzak FRAM FM24C04
- Ana ve FRAM arasındaki iletişime izin vermek için bir I2C seviye kaydırıcı (Maxim IC'den MAX3373E) kullanılır
- Veri yolu frekansı 100 kHz olarak ayarlandı
DÜZENLENDİ (2013-04-17)
Öncelikle, yorumlarınız için hepinize teşekkür ederim.
Çok fazla öneri olduğundan, yaptığım soruşturmaların açıklaması burada.
Şemalar
Aşağıdaki resim I2C veriyolunun basitleştirilmiş bir şemasını göstermektedir:
I2C_SDA ve I2C_SCL sinyalleri doğrudan mikro denetleyiciye bağlanır ve FRAM_SDA ve FRAM_SCL sinyalleri FRAM'a bağlanır. FRAM'a bağlı SDA ve SCL sinyallerinin Murata'dan BLM18 ferritleri kullanılarak filtrelendiğine dikkat edin.
FRAM aşağıdaki gibi bağlanır:
- NC (pin 1) -> bağlı değil
- A1 (pin 2) -> GND
- A2 (pin 3) -> GND
- VSS (pin 4) -> GND
- SDA (pin 5) -> FRAM_SDA
- SCL (iğne 6) -> FRAM_SCL
- WP (pin 7) -> GND (yazma korumalı değil)
- VDD (pin 8) -> + 5V
ÇERÇEVE kartı açıklaması
Bu kart, yalnızca ÇERÇEVEYİ yerleştiren bir "ISA benzeri" karttır.
Araştırmalar
Frekansı yavaşlatma
Testleri SCK frekansı 50kHz ve 10kHz olarak ayarlayarak çalıştırdım. Beklenen frekansta olduğundan emin olmak için SCL sinyalini bir osiloskopla ölçtüm.
Bu değişiklikler sorunu çözmedi. Zamanlamaları kontrol ettim ve bunlar FRAM veri sayfası spesifikasyonları dahilinde.
Güç sekansının sağlanması
@jippie.
- I2C seviye değiştiricisi, FRAM'ı gömen kart yerleştirilmeden önce üç durum moduna geçirilir. FRAM_SDA ve FRAM_SCL sinyalleri düşük çekilir.
- "FRAM kartı" takıldıktan sonra, güç kaynağının dengelenmesini sağlamak için 100 ms'lik bir gecikme eklenir (veri sayfasına göre ilk başlatma koşulundan en az 11 ms gerekir).
- I2C seviye değiştirici etkinleştirilir.
- I2C seviye değiştiricisinin etkinleştirildiğinden ve hatların yukarı çekildiğinden emin olmak için 1 ms'lik bir gecikme eklenir (veri sayfası için ~ 4us gereklidir). FRAM_SDA ve FRAM_SCL sinyalleri yukarı çekilir.
- FRAM'a erişildi.
FRAM_SDA ve FRAM_SCL sinyalleri her adımdan sonra ölçülmüştür.
Sorun hala devam ediyor.
Tekrarlanan başlatma yerine durdurma / başlatma koşulu
@gbarry.
Bayt aktarımı sırasında tekrarlanan başlatmadan önce durdurmaya çalıştım. Bayt transferini osiloskopla ölçtüm: DUR durumu ve ardından BAŞLAT koşulu iyi.
Ne yazık ki, bu çözüm sorunu çözmüyor.
Düşünceler
Bu sorun, yalnızca FRAM gömme kartı bağlandıktan hemen sonra oluşur. "FRAM kartı" takıldıktan ve doğru adreslendikten sonra birkaç bin başarılı okuma erişimi (slave adresleme ve okuma) gerçekleştirdim.
Bana bir donanım sorunu gibi geliyor. Ama I2C seviye değiştiricisiyle mi yoksa I2C veriyolundaki diğer kölelerle mi ilgili olduğunu bilmiyorum.
Başka fikriniz veya öneriniz var mı?
DÜZENLENDİ (2013-04-18)
Sorun çözülmüş gibi görünüyor
FRAM modülü konnektörünü değiştirdim ve doğrudan FRAM üzerinde ölçüm yapmanın bir yolunu buldum. Her şey bu yeni konektörle iyi çalışıyor gibi görünüyor.
Sorunun kötü bir bağlantıdan geldiğinden emin olmak için daha fazla test yapacağım.