I2C slave adresi onaylanmadı (bazen)


11

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): resim açıklamasını buraya girin

I2C FRAM adresi onaylanmadı (slave adresi doğru gönderildi): resim açıklamasını buraya girin

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 veri yolu şeması

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.

  1. 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.
  2. "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).
  3. I2C seviye değiştirici etkinleştirilir.
  4. 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.
  5. 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.


Lütfen şemayı gönderebilir misiniz? Bunun bir fark yaratıp yaratmadığını görmek için daha yavaş bir veri yolu frekansı deneyin.
Suirnder

Sorun yalnızca eklendikten hemen sonra mı oldu, başka zamanlarda değil mi? "Hemen sonra" ne kadar erken?
Kaz

Diğer deneylere ek olarak, diğer köleleri kaldırmayı deneyebilir ve bunun davranışı etkileyip etkilemediğini görebilirsiniz.
Ben Gartner

İki adres pimi doğru şekilde mi alçak mı, yoksa solda mı yüzüyor?
fm_andreas

@Suirnder Şematiği cevabımda yayınladım.
johsey

Yanıtlar:


6

Haberleşmelerinizin takma veya çıkarma işleminden önce uygun şekilde sonlandırıldığını söyleseniz de, I2C veri yolunun veri yolundaki aygıtlardan yalnızca birinin sıfırlanmasından sonra sorun verebileceği bir durum olduğu için bu çözümü denemeye değer olabilir.

Master I2C donanımını başlatmadan önce, SDA'yı bir giriş olarak ayarlayın ve SDA düşük olup olmadığını test edin.

Düşükse, SCL pimini yüksek olarak ayarlayın.

Ardından, SDA yükselene kadar SCL pimini düşük ve yüksek konuma getirin (yani, çevre birimlerinin hala göndermeye çalışabileceği kalan bitleri zaman aşımına uğratın). Bu 8 saatten fazla döngü yapamaz - eğer öyleyse başka bir sorun var.

Bunun sorununuzu çözeceğini garanti edemiyorum, ama benimkini çözdü !.


Master'ı başlatmadan önce bu "veri yolu kurtarma algoritmasını" eklemek kötü bir fikir değildir. Ben uygulayacağım. Teşekkür ederim.
johsey

2

ÇERÇEVE için:

  • önce GND ve Vcc'yi bağlayın;
  • sonra A1, A2 ve WP'nin doğru seviyeye sahip olduğundan emin olun;
  • ancak bundan sonra veri pinlerini bağlayın.

Çip açılmadan önce güç kaynağından başka pimlerin bağlanması sorunlara neden olabilir.


2

10k pulluplarınız için biraz büyük görünüyor ve ön kenarlarınız yavaş görünüyor. Dirençleri yaklaşık 3k'ye düşürün ve yardımcı olup olmadığını görün.

Ayrıca, kapalı voltaj neden zamanla dalgalanıyor?


Çekme dirençlerini 3,3k'ye düşürdüm ve bu yardımcı olmuyor. Bu sürüklenme hakkında hiçbir fikrim yok.
johsey

Ekranda küçük görünüyor, ama yaklaşık 250 mV, sanırım. 3.3V tarafında bir güç kaynağı sorunu yaşıyor olabilirsiniz
Scott Seidman

Haklısın, sürüklenme I2C seviye değiştiricisinin her iki tarafında yaklaşık 300mV. + 3.3V güç kaynağı iyi çalışıyor gibi görünüyor (SCL sinyalindeki sapma meydana geldiğinde çıkışında sapma yok). I2C seviye değiştiricisi ile ilgili olabilir mi?
johsey

Hiç emin değilim. 3.3V nereden geliyor? Dönüştürücü değiştiriliyor mu? Her durumda, şüpheli. Veri sayfası başına 3.3V sağlayan cihazın gerektirdiği MINIMUM akımı çekiyor musunuz? Değilse, beslemenizi bir dirençle yükleyin. İletişime başlamadan bir iki saniye beklerseniz ne olur?
Scott Seidman

3.3V bir SMPS'den (TI'dan LM3103MH) geliyor. Güç kaynaklarında uzman değilim, ancak anladığım kadarıyla, bu cihazla, hafif bir yükte süreksiz iletim modunda çalışabileceğinden minimum gerekli akım yoktur. Aynı sorun, iletişimi başlatmadan önce iki saniye beklersem de oluşur.
johsey

2

Bu tahta ile konuşmaya çalışan başka bir şey olma ihtimali var mı? Bir zamanlar böyle bir sorunum vardı; Zamanın% 60'ını alabildim, ama bir çarpışma gördüğümü hatırlamıyorum. Ben sağlanan i2c bir şekilde gerçek iç otobüs izole şüpheli. Sürekli çalıştırabilirdim ve mesajların sadece% 30'unu bırakacaktı. Sorun, araya giren "arka panel" olmadan doğrudan cihazla (bir güç kaynağı) konuşmaya başladığımız anda ortadan kayboldu.

NAK hatanızdan sonra bir durdurma sırası görmüyorum. Sanırım programı o noktada durduran bir kesme noktanız var mı?

Son olarak, otobüste tek kişi olduğunuzu düşünüyorsanız, tekrarlanan başlatmayı bir durdur / başlat ile değiştirmeyi de deneyebilirsiniz. RS'nin nasıl kullanılacağını tam olarak bilmeyen cihazlar (özellikle özel FPGA'lar) gördüm.

[Yoruma yanıt olarak]: FRAM kartı hakkında söylemediğiniz çok fazla şey var, sanki sadece bellek ya da tüm alt sistem gibi. Ancak, 'kapsamı size sorun veren i2c cihazının uçlarına doğrudan koyabilirseniz ve hala neyin resmedildiğini görüyorsanız, paraziti ekarte ederim. I2C, girişte doğru sinyalleri görürseniz, dahili bir sorunu yoksa çipin düzgün oynaması gerektiği kadar basittir.

Özellikle, bu seviye değiştiricinin FRAM tarafına girmek istiyorsunuz. Sinyalde bir kopma, normalde bir çarpışma olarak düşünülecek olan bir şeyden daha olasıdır.

Bir NAK döngüsünün orada olmayan bir yongadan ayırt edilemez olduğuna dikkat çekeceğim. EEPROM'lar meşgul olduklarını belirtmek için bunu yapar. FRAM yazma zamanı baktı ve tek bir i2c veri bit daha hızlı ... bu yüzden bu bir sorun değil.


I2C veriyolunda sadece bir master var ve FRAM'ı yerleştiren kart sadece bu veriyoluna bağlı. Böylece, başka bir şeyin onunla konuşmaya çalışma şansı olmadığını düşünüyorum. Evet, durma dizisinden önce bir kesme noktası koydum. Bu tekrarlanan başlatmayı, önerdiğiniz gibi bir durdur / başlat ile değiştirmeye çalışacağım ve tekrar test edeceğim. Veri sayfasına göre, FRAM tekrarlı başlatmayı desteklemelidir. Eğer FRAM'ı (örneğin, özel bir I2C veriyolunda) izole edersem bunun sonunda bu sorunu çözebileceğini düşünüyor musunuz?
johsey

FRAM panosu sadece FRAM'i gömer. "ISA benzeri" bir kart. Bu kart plastik bir parçaya gömülü olduğundan sinyalleri doğrudan FRAM pinleri üzerinde ölçmek zordur. Her neyse, bu sinyalleri FRAM'a mümkün olduğunca yakın ölçmenin bir yolunu bulmaya çalışacağım.
johsey

U13'ün ÇERÇEVE tarafına gitmek büyük bir adım olacaktır.
Nisan'da

2

Sorun, çoğaltıldığında, yalnızca cihazın çıkarılması ve yeniden takılmasıyla giderilen kalıcı bir arıza olduğundan, bu iki şeyden biridir: cihaz yalnızca bir güç döngüsünde kurtardığı kötü bir duruma geçer, veya zayıf temas var.

Cihaz, bir güç çevriminde kurtardığı kötü duruma geçerse, MCU'nuzun cihazı kapatmasını sağlayan ek bir devreniz olabilir. Cihaz yazılımı daha sonra cihazdan onay alınmadığında, bir süre çipi kapatıp tekrar açtığı ve tekrar denediği bir kurtarma prosedürü yürütebilir.

Zayıf bir temas varsa, belki de konnektörün güvenilirliğine bakmalı ve daha iyi bir şey bulmalısınız. Bu panolardan daha fazlasını yapmak için aynı konektörü kullanırsanız, alanda sorunlar olabilir. Her durumda, durumu ele almak için insani bir prosedür olabilir. Cihazla çalışan operatör, kartın takılmasıyla ilgili olası sorunun farkında olmalı ve düzgün çalışması için yeniden takılması gerekebilir.

Ana cihazınızın FRAM ile konuşamayacağını belirten bir alarm vermenin bir yolu olabilir: paneldeki ve / veya bip sesindeki veya herhangi bir şeydeki bir "sorun" LED'i. Ya da tam tersi: Kullanıcıya FRAM'ın kabul edildiğini ve iletişimin kurulduğunu bildiren bir miktar ışık yanar. FRAM ana cihazdan uzaksa, ışık FRAM modülüne yerleştirilebilir: LED kullanan başka bir I2C yongası.


0

Sorunun düzensiz doğası, bunun bir zamanlama sorunu olabileceğini düşündürmektedir.

Veri sayfası biri "Standart Mod" ve diğeri "Hızlı Mod" için olmak üzere iki zamanlama grubu listelenmiştir. Ölçümlerinizden, "Standart Mod" zamanlamalarının sınırında olduğunuz görülüyor. Veri sayfasını çipin her iki moda da tam olarak nasıl yerleştirildiğini söyleyemiyorum.

Cihazınızın Hızlı Modda olduğunu varsaymam. Zamanlamaları 2-4 kat azaltabilir, başlangıç ​​koşulu tutma süresi, saat yüksek süresi ve saat düşük süresi için standart mod zamanlamaları içinde olduğunuzdan emin olabilir misiniz ve bu sorunun hala devam edip etmediğini görüyor musunuz?


Cihazım "Standart Modda" (100kHz SCL frekansı). Aslında, bu frekans bu modun sınırındadır. Bunu iki kat azaltmaya ve bazı testler yapmaya çalışacağım.
johsey

0

24c04a, b veya c mi? Eğer bir c04a ise, sağlam bir tasarımdı. B parçası güç kaynağı rampalarına duyarlıdır. Pin8 üzerinde gnd ne ayrıştırma? Sinyal seviyeleri hakkında bir şeyler söyleyecektim ama seviye çevirmeni kullandığınızı görüyorum. U SCL üzerinde çip ekstra bir saat olarak yorumlamak bir aksaklık olmadığını kontrol etmek isteyebilirsiniz.


3
Bunu sadece dokuz düğmeli bir arayüze sahip eski bir cep telefonuna mı yazdınız?
angelatlarge

Kullanılan FRAM FM24C04B'dir . Bu hafızanın güç hassasiyeti ile ilgili bu bilgiyi nereden buldunuz? Bana daha fazla girdi verebilir misiniz? Pim 8'de ayrılma yoktur. Bu modülün tasarımı birkaç yıl önce yapılmıştır ve tüm üretimi tüketmek zorundayız. Osiloskop ile yapılan ölçümlere göre, FRAM modülü bağlandığında ve seviye değiştirici etkinleştirildiğinde SCL hattında herhangi bir aksaklık olmadığı görülmektedir.
johsey

1
Bu yanıtın çok geç olduğunun farkındayım, ancak Vcc duyarlılığıyla ilgili bilgilerim yıllar önce Ramtron için uygulama desteği olmaktan geliyor. Kesin ayrıntıları hatırlamıyorum, ancak belirli rampa oranları ve sıcaklıkları altında, çip aslında kilitlenir ve 'iyi' bir rampa ile güçlenene kadar I2C iletişimine izin vermez. Çipin yakınında bir ayırma kapağının bulunmaması iyi değildir. 0.1uF vs 10uF ayırma işleminin, birinin çalıştığı ve diğerinin çalışmadığı Vcc rampasını değiştirdiğini görebilirsiniz. @angelatlarge, evet üzgünüm bir telefondan ilk cevabımı yazdım.
gman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.