(düzenleme: Açıkçası, aşağıdaki kaygılardan birçoğunun, Olin'in doğru şekilde işaret ettiği gibi I2C / SPI cihazlarının kart-kart kullanımından kaynaklanan sinyal bütünlüğü ile ilgisi vardır.)
Sizi daha az kabloya doğru zorlayan kısıtlamalarınız olmadığı sürece (her ek temasın oldukça pahalı olduğu hermetik olarak kapatılmış bir konektörü olan bir projemiz vardı), mümkün olduğunda I2C'den kaçının ve SPI'ye bağlı kalın.
SPI, bir donanım ve yazılım temelinde başa çıkmak için oldukça kolaydır. Donanımda iki paylaşılan veri hattı vardır: Master tarafından oluşturulan paylaşılan bir saat Master In Slave Out (MISO veya SOMI) ve Master Out Slave In (MOSI veya SIMO) ve cihaz başına bir yonga seçimi. CS hattı alçalır, saat döner ve esasen giriş bitlerinde kayar ve işlem bitene kadar CS hattının yüksek olduğu noktada çıkış bitlerini kaydırır. CS çizgileri yüksek olduğunda, bağımlı cihazlar iletişim kurmaz: CLK ve MOSI hatlarını yok sayarlar ve MISO pimlerini başkalarının kullanmasına izin vermek için yüksek empedanslı bir duruma getirirler.
Birkaç SPI cihazı kullanan bir mikrodenetleyiciniz varsa ve yerleşik bir SPI çevre birimine sahipse, mikrodenetleyicinin CS çıkışını bir ayırıcıya (örneğin 74HC138) gönderin ve SPI işlemleri arasında aygıtı seçmek için adres satırlarını kontrol edin; Bir sicile çıktılarını sıraya koymak için sözcükler yazarsınız ve CS pimi yükseltildikten sonra tekrar okursunuz.
SPI sinyallerinin hepsi tek yönlü olduğundan, bunlar tamponlanabilir, dijital izolatörlü bir izolasyon bariyeri boyunca kullanılabilir ve LVDS gibi hat sürücüleri kullanılarak panodan panoya gönderilebilir. Endişelenmeniz gereken tek şey, maksimum sıklığınızı sınırlayacak gidiş dönüş yayılma gecikmesidir.
I2C tamamen farklı bir hikaye. Bir kablolama noktasından çok daha basit olmasına rağmen, sadece iki telli SCL ve SDA ile, her iki hat da harici çekmeli açık tahliye cihazları kullanan iki yönlü hatlardır. I2C için bir cihaz adresi ileterek başlayan bir protokol vardır, böylece her biri kendi adresine sahipse birden fazla cihaz kullanılabilir.
Bir donanım açısından, I2C'yi önemli gürültü yapan sistemlerde kullanmak çok zordur. I2C hatlarını tamponlamak veya izole etmek için egzotik IC'lere başvurmanız gerekir - evet, varlar, ama çok fazla değiliz: tek bir projede kullandık ve tek bir izolatör kullanabileceğinizi anladınız ama seri olarak iki tane kullan - hangi tarafın işlerin sonu olduğuna karar vermek için küçük voltaj düşüşleri kullandı ve iki seri düşüş iki tane oldu.
I2C'nin mantık seviyesi eşikleri Vcc'ye bağlıdır, bu nedenle aynı sistemde 3V / 3.3V ve 5V cihazları kullanıyorsanız gerçekten dikkatli olmalısınız.
Bir ya da iki ayaktan daha büyük bir kablo kullanan herhangi bir sinyal, kablo kapasitansı için endişelenmelidir. 100pf / meter kapasitansı çok iletkenli kablo için sıra dışı değildir. Bu, ekstra kapasitansı doğru bir şekilde ele alabilmeniz ve yükselme süresi gereksinimlerini karşılayabilmeniz için otobüsü yavaşlatmanız veya daha düşük çekme dirençleri kullanmanıza neden olur.
Diyelim ki iyi tasarladığınızı düşündüğünüz bir sisteminiz var ve sinyal bütünlüğü sorunlarının çoğuyla başa çıkabilirsiniz ve gürültü nadirdir (ancak hala mevcut). Endişelenecek neyin var?
Başa çıkmanız gereken bir sürü hata koşulu var:
Slave cihazı belirli bir baytı onaylamaz. Bunu algılamanız ve iletişim sırasını durdurup yeniden başlatmanız gerekir. (SPI ile, hatasız alındığından emin olmak istiyorsanız, genellikle gönderdiğiniz verileri okuyabilirsiniz.)
Bir köle cihazından bir veri baytı okuyorsunuz ve cihaz saat satırındaki gürültü nedeniyle "hipnotize" ediyor: o baytı okumak için gerekli 8 saati gönderdiniz, ancak gürültü nedeniyle köle cihazı onu düşünüyor 7 saat aldı ve veri hattında hala 0 iletiyor. Cihaz 8. saati almış olsaydı, veri hattını yüksek olacaktı, böylece ana bir ACK ya da NACK bitini iletmek için ana veri hattını kaldırabilir ya da indirdi ya da ana bir durma (P) koşulu iletebilirdi. Ancak, köle hala veri hattını düşük tutuyor, boş bir zaman için boşuna bekliyor. Bir master ekstra saatler denemek için hazır değilse, I2C veriyolu kilitlenmeye sıkışmış olacaktır. Normal ACK / NACK koşullarını işleyen birkaç mikrodenetleyici kullanmış olmama rağmen,
Gerçekten çok kötü olan bir durum, bir ana cihazın bir ikincil cihaza veri yazması ve bir başka kölen cihazın adresini yanlış yorumlaması ve iletilen verinin bunun için olduğunu düşünmesidir. Bu nedenle, zaman zaman yanlış ayarlanan kayıtlara sahip olan I2C cihazlarımız (G / Ç genişleticileri) vardı. Bu vakayı tespit etmek ve gürültüye dayanıklı olmak neredeyse imkansızdır, tüm kayıtları düzenli aralıklarla ayarlamanız gerekir, böylece bu hatayla karşılaşırsanız en azından kısa bir süre sonra düzeltilecektir. (SPI hiçbir zaman bu problemi yaşamaz - CS hattında bir aksaklık olursa, uzun süre kalıcı olmaz ve yanlışlıkla yanlış bağımlı cihaz tarafından okunan verileri alamazsınız.)
Hata tespiti (CRC kodları) olsaydı, protokolde bu koşulların birçoğu uygun şekilde ele alınabilirdi, ancak çok az sayıda cihaz buna sahipti.
Bu koşulları yerine getirmek için I2C ana cihazımda karmaşık bir yazılım geliştirmem gerektiğini düşünüyorum. Bana göre, kablolamadaki kısıtlamalar bizi I2C kullanmaya ve SPI kullanmaya zorlamadıkça, buna değmez.