I2C yalnızca 1Mohm ile problandığında veya yüklendiğinde çalışır


9

Bir msp430fr5847 (master) ve bilinmeyen I2C çipli (endüstriyel sensörün bir parçası) bir bağımlı sensör arasındaki iletişimi gidermeye çalışıyorum

Verilerimin tümüyle sıfırlandığı yeni bir sensör grubuyla ilgili sorunlar yaşıyorum, ancak Saleae mantık pro (2Mohm, 10pf) veya osiloskopum (10Mohm, 50pf) ile sorun gidermeye çalışırken, problama sırasında sistem mükemmel çalışıyor SDA pini.

Daha fazla sorun giderme SDA ile toprak arasına 1Mohm direnç eklersem devre düzgün çalışır, ancak yalnızca 10pf veya 100pf kapasitör eklenirse çalışmaz.

3.3v rayıma 4.7k çekme dirençleri kullanıyorum.

Bu soruna ne neden olabilir ve istemeden sorunu gidermeden sorun gidermek için neler yapılabilir.


EDIT: 19/07/2017 İşte sinyallerimin hızlı bir kapsamı.

Bahsetmeyi unuttuğum başka bir şey, sadece SDA'yı araştırmanın kartın çalışmasına neden olması, SCL'yi veya kesme hattımın düzgün çalışmasını sağlamasıdır.

SDA ve SCL'nin kapsamı


DÜZENLEME: 21/07/2017

Çizim kalınlaşır, farklı bir osiloskop bağlamanın devrenin doğru çalışmasını sağlamaz ve tek farkın bir ACK'nın iletilmemesi olduğu görülebilir.

Yeni kapsam resmi

Yukarıdaki resimde, devre düzgün çalışmadığında mavi ve yeşil izler SCL ve SDA'dır. Sarı ve pembe izler, Saleae mantığımı SDA Pin ve toprağa da bağladığımdan ancak USB takmadan (toprak döngülerinden kaçınmaya çalıştığımda).

Sensöre biraz daha fazla arka plan eklemek için, üreticiden satın aldığımız endüstriyel bir basınç sensörüdür. Bu PCB'leri ilk sensör grubumuzla daha önce tasarladık ve test ettik. Son zamanlarda yeni bir parti aldık ve şu anda bu sorunlarla karşılaşıyoruz. Ben soruşturma biraz yapmış ve şiddetle şüpheli içten sensör bir ZSC31014 veya benzeri PDF veri sayfasını kullanan (veri sayfasından benzersiz görünümlü cümleler googling sonra) BURADA


DÜZENLEME: 26/07/2017

Umarım bu sorunun çözümünde son taksit, SamGibson'un ayrıntılı cevabına göre, başlangıç ​​bitinin sonundaki aksaklığı maskelemek için adresin yüksek bitini ayarlama düzeltmesini uyguladım.

Bu çoğunlukla beklendiği gibi gelen verilerle çalışmıştır, ancak şimdi bir yazma işleminden sonraki ilk okuma komutunda (eğer bir grup i2c biti için doğru terim ise), köle bir bit erken ACK yapmaya çalışır ( yazma bitinin konumu). SDA Hattı ile seri olarak küçük (47 ohm) bir direnç ekleyerek hattı aşağı çeken köle olduğunu söyleyebilirim.

Bunu genellikle yeni bir soru olarak başlatırdım, ancak yukarıdaki sorun giderme işleminde hiçbir etkisi olmayan aynı kapsamı eklediğimde, bu sorun ortadan kalkıyor gibi görünüyor, bu kapsam probunu eklesem bile bu gerçekten sınırda bir sorun gibi görünüyor, onu kapsama bağlamadan sorun çözüldü, bu yüzden bir kapasitans sorunu olduğunu varsayıyorum.

Kapsam eklenmemiş konunun grafiği

Kapsamsız çizim

Bağımlı prob sondası takılı, ancak kapsama bağlı değil sorunu, slave ACK biti yerine yazma bitini aşağı çektiğinde biraz daha yüksek gerilime dikkat çekiyor.

Kapsam eklenmiş olarak


1
Herhangi bir kapsam iziniz var mı
Kevin White

1
Saat sinyalinizi yanlışlıkla ters çevirdiniz mi?
Andy aka

6
I2C veri yolunda ortak bir topraklama kablosu bulunduğunu ve kullandığını doğrulayın (I2C sensörüne MSP). 3 kablo gereklidir: SDA, SCL ve GND, SDA ve SCL, çekme dirençleri yoluyla Vcc'ye (olası 4. kablo) kadar çekilmiştir.
Chris Knudsen

1
@Hugoagogo - Yikes! Hem SDA hem de SCL farklı şekillerde anormal. İzin yeni arızalı sensörlerle olduğunu sanıyorum ? Öyleyse, eski çalışma sensörleri ile bir iz sağlayabilir misiniz ? Belki de fark o kadar büyük olmayabilir, yani daha önce bir probleminiz vardı, ama sadece çalışıyordu. Daha fazla arka plan bilgisi yararlı verileri ortaya çıkarabilir, örneğin çipin "bilinmeyen" olduğunu düşünerek bunların "yeni" I2C çipleri olduğunu nasıl biliyorsunuz? Bazı ters mühendislik MSP430 (hangi kontrol?) Bir sensör (kontrol değil?) İle kullanılmasına izin vermek için yapıldığını tahmin ediyorum. Bu "orijinal" yapılandırmadan ne kadar farklı?
SamGibson

1
SamGibson ile hemfikirim. Sivri uçların ölçüm hataları olduğunu söyleyecek kadar hızlı olmazdım. Ölçüm kurulumunuzdan geliyorlarsa veya neden orada olduklarını buluyorlarsa, biraz daha araştırmaya ve ortadan kaldırmaya çalışmanız gerektiğini düşünüyorum. Sonuçta, SCL'nin düşen kenarlarıyla hizalanmış gibi görünüyorlar. Ayrıca sensörü doğrudan PCB'ye bağlamaya çalışacağım. Bu, sorunların kablodan veya sensörün ana karttan uzaklığından kaynaklandığını ortadan kaldırmanıza yardımcı olabilir.
nikkagian

Yanıtlar:


11

Ben düşünüyorum ben cevabı buldum. Bu bilinen bir sorun olduğu ortaya çıktı, ama sadece sorunun nerede olduğuna karar verdikten sonra buldum ve bunu aradım!

İşte yaşadığım süreç, bunu takip edebilirsiniz (ve gerekirse varsayımlarımdan farklı sonuçlar görürseniz araştırmanızı uyarlayabilirsiniz). Sonuç olarak, MSP430 I²C davranışı ile I²C Slave, IDT ZSC31014 olduğundan şüphelendiğiniz aygıtın gerekli I²C davranışı arasında (en azından bir miktar) uyumsuzluk olduğu görülüyor . Bu cihazın veri sayfasına sahip olmak, bunu anlamak için çok önemlidir, bu yüzden bulduğunuz için teşekkür ederiz.

İyi haber şu ki, bu sorun için en azından açıklayacağım (en azından) 2 geçici çözüm var.

Çizim kalınlaşır, farklı bir osiloskop bağlamanın devrenin doğru çalışmasını sağlamaz ve tek farkın bir ACK'nın iletilmemesi olduğu görülebilir.

Yeni izler faydalı, teşekkürler, onları biraz farklı yorumlasam da.

(İlk izlemede beni ilgilendiren SCL sinyal altlığı hala en son izde var. SCL'deki alt sürgünün, özellikle SCL ve SDA sinyalleri arasındaki farklı dikey ölçekler göz önüne alındığında, SDA'daki alt süreden daha büyük görünmesi ilginç. Yine de SCL'nin nihayetinde altını çizdiğini araştırmayı öneririm, ancak ana sorunla ilgili olduğuna inanmıyorum.)

SDA'da bu iki "aksaklık" vardır:

  • Bir I²C Master, bir Slave'in ACK'yi gerçekleştirmesine izin vermek için SDA'nın kontrolünü serbest bıraktığında ve ardından Master SDA'yı tekrar sürdüğünde ACK darbesinin hemen öncesinde veya hemen sonrasında meydana gelen bir aksaklık nadir değildir. Bu yüzden bunu görmezden geliyorum.

  • Öyle erken daha sıradışı olan, ilk SCL darbesi öncesinde, SDA aksaklık. Bu erken SDA aksaklığının genliğinden (daha sonra bakınız) ve sadece bu ilk SCL darbesinden (0 olarak etiketlenmiş) önce gerçekleşmesi gerçeğinden, ancak SDA'da bir aksaklık (SCL gibi) görebileceğimiz daha sonraki SCL darbelerinden önce gerçekleşmez. 4, 5, 6 veya 7 etiketli darbeler), bunun bir ölçüm artefaktı olmadığını veya SCL'den bir bağlanma olmadığını biliyoruz (örneğin).

(Daha sonra başvurmak üzere, erken SDA aksaklığı en son izlemede en az 2V gibi görünür , bu nedenle önceki yorumlardan 3.6V'de Vdd ile SDA aksaklık genliğini en az (2 / 3.6) = 0.55 x Vdd yapar. ilgili I2C mantık düzeyi eşikleri daha sonra ele alınacaktır.)

ACK farkını göz ardı ederek, ikinci ekran görüntüsünde iki iz kümesi arasında başka bir fark gördüğüme inanıyorum. Erken SDA aksaklığının genliği, etiketli üst SDA izi C1(sarı-ish?) Ve etiketli 2. SDA izi M3(mavi) ile karşılaştırıldığında biraz farklı görünmektedir . Şimdi, aşağıda açıkladığım gibi, erken SDA aksaklığının genliğindeki farklılıkların, sorunun ortaya çıkmasına veya kaybolmasına neden olabileceğine inanıyorum.

Özellikle aksaklık üzerinde daha fazla çözünürlük yardımcı olacaktır (bu "uzaktan" sorunlar üzerinde çalışmaya çalışırken sorunun biridir - Ben 'kapsamı kendim çalıştıramazsınız!). Yakınlaştırdığınızda, normal bir I²C mantığı "1" in başlangıcına benzediğini varsayacağım (yani yükselen kenarda bir RC eğrisi, özellikle de çekmeleri geçici olarak zayıflatıyorsanız, örneğin 10k). t Tekrar "0" mantığına geçmeden önce tam pozitif gerilime ulaşın. Daha sonra bağlanan başka bir web sayfasında gösterilen şey budur. Aksaklığınızda farklı bir şekil görürseniz, sonraki analizim geçerli olmayabilir.

I²C Master, I²C Start ile ilk SCL saat darbesi (MSbit olmasına rağmen "0" olarak adlandırdığınız) arasındaki aksaklık noktasında veri yolunu kontrol eder. Yani bu noktada SCL düşük olan rağmen, bir SDA aksaklık, MSP430 davranış beni şüpheli yapılmış olmamalı onlar sonraki SDA durumunu okumadan önce yüksek gitmeye SCL bekliyor olacak şekilde, I²C uyumlu cihazlar etkiler.

Peki, I²C Slave gerçekten I²C uyumlu mu? Görünüşe göre, ZSC31014 " telaşlı " ve diğer I²C cihazlarından daha az toleranslı, tam da MSP430'un bu aksaklığı ürettiğine inandığımda!

ZSC31014 veri sayfası onlar aygıtın I²C davranışını itiraf listeleri 3 alanlar "farklı" dir. Ayrıca, bu listedeki ilk ikisinden başka zamanlarda da etkilenebilirsiniz (bu analizin bir parçası değildir), ancak aşağıda kırmızı olarak işaretlediğim ve bu erken SDA aksaklığıyla ilgili üçüncü nokta:


ZSC31014 veri sayfasından alıntı


Bu erken SDA aksaklığının genliği kritiktir . Bu aksaklık, ZSC31014 tarafından tekrar düşmeden önce mantıksal "1" olarak tanınacak kadar yükselmezse, sorun olmaz - cihaz, bu "kuralı" kırmak için SDA'da düşen bir kenar görmelidir ve yalnızca bir düşme zaten mantıksal bir "1" olarak kabul edilmiştir, kenar.

SDA sinyalinin genliğini etkileyen her şey, örneğin SDA sinyalindeki bir 'kapsam veya mantık analizörünün ek yükü gibi, aksaklığın ZSC31014 tarafından bir mantığa "1" ulaştığı olarak tanınmasını durdurmak için yeterli olabilir ve bu nedenle "düşmemesi" SDA kenarı ", listede üçüncü nokta olabilir (iyi bir günde, gerilimlere, sıcaklıklara vb. Bağlı olarak). Ancak, bulduğunuz gibi, farklı osiloskoplar arasındaki varyasyon, bazılarının sorunu durdurmak için yeterli yük eklediği ve diğerlerinin yapmadığı anlamına gelir. Bu kurulum çok marjinal olmalı!

Bu, önceki "çalışan" sensör gruplarınızın "sadece" çalışıyor olabileceğinden endişe duymamı sağlıyor, çünkü bu "çalışan" kurulumlardaki MSP430 MCU'ları da muhtemelen SDA hataları üretecek. Daha sonra bildirdiğiniz farklı davranışı ("çalışma" grubu ile "çalışmayan" grubu) açıklayabilecek sensör grupları arasındaki olası bir fark hakkındaki teorim daha sonra açıklanmaktadır.

İlginç bir şekilde, ZSC31014, üreticiden bu listede belirtilmeyen başka bir alanda standart I²C'den farklıdır ve bu, sensör grupları arasında neden bir fark gördüğünüzü açıklayabilir.

Standart I²C mantık eşikleri (basitleştirilmiş) - I²C spesifikasyonunda gösterildiği gibi "0" mantığı için 0,3 x Vdd'nin altında ve "1" mantığı için 0,7 x Vdd'nin üzerindedir :


I2C spesifikasyonundan mantık seviyesi eşikleri


Bununla birlikte, ZSC31014'ün farklı eşikleri vardır, 0.2 x Vdd ve 0.8 x Vdd, yani bu eşikler arasındaki "tanımlanmamış bölgesi" tipik I²C cihazlarından daha büyüktür:


ZSC31014 veri sayfasından mantık seviyesi eşikleri


Yani daha büyük "tanımsız bölge" arttırır tanımsız gerilim seviyesi alanına giren aksaklık şansını olabilir mantıksal bir "1" (0.2 x Vdd yukarıdaki şey hatırlamak olarak tanınması olabilir mantıksal bir "1" olarak ZSC31014 tarafından tanınması , tanımlanmamış bölgede her şeye izin verilir - mantık "1" olarak tanınması gerektiğinde yalnızca 0,8 x Vdd'nin üzerindedir ). Ve, gibi daha önce açıklandığı takdirde sorun olması mantık "1" ulaşmış olması olarak ZSC31014 tarafından tanınan, sen I²C davranışı için kırmızı işaretli "kuralı" gerektirdiğini kırdım, o zaman bir mantık "0" tekrar düştüğünde ZSC31014 tarafından.

Bu "tanımlanmamış" gerilim bölgesindeki mantık seviyelerinin tanınması belirtilmediğinden, sensör üreticisi yalnızca "0.7" mantığını tanıyan bir parti yaparsa, yalnızca 0.7 x Vdd'ye ulaşırsa, tanımlayan başka bir parti yaparsa, Örneğin, 0.4 x Vdd kadar düşük bir mantık "1". Bu varsayımsal ikinci partinin, SDA aksaklığını, listelerindeki üçüncü noktaya aykırı olarak düşen bir SDA kenarı olarak görmesi, ancak özelliklerini ihlal etmemesi daha olasıdır.

(Yıllar boyunca üzerinde çalıştığım sorunların birçoğu şöyleydi: İkisi de boşlukları olan bir spesifikasyonu ayrı ayrı kıran iki cihaz var - ancak biri telaşlı ve daha az toleranslı, diğeri , belirsiz davranışlarından dolayı bağlı cihazların daha toleranslı olmasına ihtiyaç duyar ! Bu iki cihazın her biri diğer cihazların çoğuyla iyi bir şekilde bağlantılıdır, ancak birbirine bağlandığında güvenilmez (veya tamamen başarısız).

Peki ne yapabilirsin? İki seçenek düşündüm:

  • MSP430 kullanmayın - bu erken SDA aksaklığını oluşturmayan başka bir MCU kullanın. Ancak, yazılımda çok fazla zaman harcadığınızı ve bu önlenebilirse, kodu başka bir MCU'ya taşımak istemediğinizi umuyorum.

  • Dahili I²C donanım modülünü kullanmak yerine MSP430 üzerindeki I²C protokolünü "bit-bang". Bu şekilde, I²C sinyallerinin kontrolü tamamen sizdedir ve bu aksaklığın oluşmasını önleyebilirsiniz. Ancak, kendi I²C rutinlerinizi oluşturmak, hatalarını ayıklamak ve sonuçta ortaya çıkan kod MSP430 I²C donanım modülünü kullanmaktan daha büyük olabilir, bu da Flash alanınız azsa kendiniz bir sorun olabilir.

Sonra MSP430 I²C sorunlarını aramaya gittim ve MSP430 + ZSC31014'ün bu kombinasyonunun MSP430'daki bu erken SDA aksaklığı nedeniyle bilinen bir sorun olduğunu buldum! Bu konuya TI E2E MSP430 forumunda bakın:

TI E2E forumu: I2C çevre çipi için soruna neden olan MSP430 I2C aksaklık darbeleri

Geçici çözüm, SDA pozitif aksaklık zamanda yüksek olacak şekilde ZSC31014 I²C adresini değiştirmek orada bahsedilen olabilir , meydana ve SDA sonra yine yüksek yapılmış olduğundan, hiçbir orada gerçek SDA aksaklık:

Geçici çözümümüz, ZSC yongasını 6 bitlik biti ile bir adrese sahip olacak şekilde yapılandırmaktır (örneğin, şimdi 0x42 kullanıyoruz) - bu, aksaklık darbesini, adres biti 6 süresi için güzel bir temiz "yüksek" bite dönüştürür. sorunlu düşme kenarı.

Aynı geçici çözüm, ZSC31014 veri sayfasındaki, işaretlediğim kırmızı kutudaki öneriyi tersine çevirir. ZSC31014 I²C adresinin ilk biti (MSbit olan) 0 ise bir SDA aksaklığının önlenmesi gerektiğini söylüyorlar - bu yüzden I²C adresinin MSbit'ini "0" yapmayın, bunun yerine "1" yapın. 7 bitlik I²C adresinde bit 6'yı ayarlayın!

Bu TI E2E forum iş parçacığı ve ZSC31014 veri sayfası I²C adresine odaklandığından, belki de SDA aksaklığı oluşmaz veya veri yoluna başka verilerin gönderilmesi sırasında bir sorun olmaz. Bunu araştırman gerekecek.

Bu nedenle, farklı bir MCU kullanmanın ilk geçici çözümünü yok sayarak, iki (daha pratik) geçici çözüm şunlardır:

  • SDP'de bu aksaklığı oluşturmamak için MSP430 I²C veri yolunu kendi kodunuzu yazarak bitirin veya
  • ZSC31014 I²C adresini 7 bitlik adresinin 6 biti ayarlanacak şekilde değiştirin; bu, aksaklık meydana geldiğinde SDA'nın zaten yüksek olduğu anlamına gelir, bu nedenle ZSC31014 adreslendiğinde SDA'da gerçek bir aksaklık olmaz (bir SDA aksaklığının veri aktarımı sırasında diğer I²C Start olaylarından sonra gerçekleşmezse veya gerçekleşirse, ZSC31014 "üzülmez").

Umarım yardımcı olur!


2
Bu müthiş ve çok yararlı bir cevaptır, kabul edildi olarak işaretlemeden önce, sorun giderme yoluyla size daha fazla destek verebileceğim herhangi bir yol yoktur. Ayrıca, soruyu çözdüğümde geçici çözümümle de güncelleyeceğim.
Hugoagogo

1
@Hugo - Bu çok nazik bir düşünce :-) Sanırım , ödül sebebinin " Mevcut Cevapla Ödül " olacağı bir ödül sunarak yapılabileceğine inanıyorum . Bu süreçte uzman değilim, bu yüzden bundan daha fazlasını söyleyemem. Tabii ki ekstra temsilcim olmaktan mutluluk duyarım (analiz ve yazma ;-) yapmak birkaç saat sürdü) ama bir ödül kullanmak istemiyorsanız veya işlemi anlayamıyorsanız , o zaman endişelenmeyin, her şey zaten olumlu karma :-) Umarım cevabım işe yarar!
SamGibson

@Hugo - Cevapların güncellemelerinden haberdar olup olmadığınızı bilmiyorum, ama sadece FYI, SCL ve onun alt çizgisi hakkında bir paragraf ekledim (hala bir bulmaca, ancak ana sorunla ilgili olduğundan şüpheliyim) ve ben En son kapsam izlemesindeki "erken SDA aksaklığının" genliğini, farklı sensörlerin (veya farklı sensör gruplarının ;-)) tedavi edebileceği "tanımlanmamış" voltaj bölgesine iyi olan en az 0.55 x Vdd olarak tahmin etti. bir mantık olarak "1" olsun ya da olmasın, özelliklerini bozmadan. Bir süre çevrimdışı olacağım, bu yüzden tekrar, iyi şanslar!
SamGibson

1
Ben olduğumda Teşekkür yeniden yardım için Pazartesi günü lütuf ile gitmek zorunda kalacak (Kayıt için ben cevapları güncellemeleri haberdar alamadım).
Hugoagogo

soruya ilişkin son bir güncellemeyi incelemenizi sağlayabilir miyim?
Hugoagogo
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.