SPI veya I2C düşünürken tradeoff?


117

Bir SPI veya I2C arayüzü kullanmaya karar verirken hangi tradeolojileri dikkate almalıyım?

Bu ivmeölçer / gyro koparma kartı, her arayüz için bir tane olmak üzere iki modelde mevcuttur. Bir Arduino projesine entegrasyonu daha kolay olur mu?

http://www.sparkfun.com/products/11028

görüntü tanımını buraya girin


13
I2C ve SPI'nin güçleri var. I2C kurulum için daha karmaşıktır, karar verdikten sonra kolayca uzatabilirsiniz (otobüs kablolamanız çok uzun veya büyük olmadığı sürece). SPI'nin kurulumu kolaydır .. Gerekirse çok kolay şekilde ısırmaya başlayabilirsiniz. Genişleme, tüm yonga seçimleri ile G / Ç tüketir. Eğer I / O ve bağlayıcı alan lüksüne sahipsem ve herhangi bir otobüse ihtiyacım yoksa, her zaman SPI ile giderdim.
Hans

I2C nasıl daha karmaşık? Her iki otobüsü de farklı mikrofonlarda (küçük PIC'ler ve uygun boyutta ARM'ler) kullandım ve her durumda I2C kurulumu daha basitti (yani yazmak için daha az kayıt). Bir şey varsa, SPI saat polaritesi ve veri örnekleme seçeneklerinden dolayı daha karmaşıktır.
Armanda'lar

6
@Armandas - mümkün değil! SPI, saat / veri polaritesi için 4 olası moda sahiptir ve bunlardan ikisi hakimdir - Neredeyse tüm SPI cihazları bir saatin düşen kenarındaki MISO çıkışlarını günceller ve saatin yükselen kenarındaki MOSI girişlerini okurlar. Hangisine birkaç dakikada bir veri sayfasını bakarak karar verebilirsin ve sonra işin biter. Yanlış modu yanlışlıkla seçerseniz, osiloskop izlerine baktığınızda hızlıca çözersiniz. SPI veri hataları nadirdir ve sizi I2C'nin yaptığı gibi garip durumlara sokmaz.
Jason S

6
I2c'nin çok daha karmaşık olduğunu söylüyorum, çünkü bir zamanlar bir ARM işlemcisinde bir I2C sürücüsü yazmak zorunda kaldım. NXP belgelerinin devlet makinesini takip ettim ve yaklaşık 20 eyaletti. Son bayt okunduğunda / yazıldığında vs. onaylamamı anlamak iyi bir zaman aldı. SPI ile ilgili bu sorunlardan hiç birini almadım, sadece saat ve verileri ayarlamak zorunda kaldım.
Hans

1
@JonL, iyi açıkçası, ben OP kullanmak isteyen belirli koparma kurulu konuyu görüşmek ve işaret etmek sadece biriyim yana olduğunu, şu ana kadar tam bir cevap vermiş tek kişi benim değil mevcut SPI ve I2C, ama sadece I2C ikisi de - o vardır o bu özel tahta kullanmak istiyorsa I2C kullanmak. Diğerleri sadece, hangi arabirimin (SPI veya I2C) arabirimin daha kolay olduğunu ve bunun da benim de içinde bulunduğumu söyledi.
tcrosley

Yanıtlar:


98

özet

  • SPI daha hızlı.
  • Mikrodenetleyicinizde I2C kontrol cihazı yoksa, I2C daha karmaşıktır ve kullanımı kolay değildir.
  • I2C sadece 2 satır gerektirir.

I2C, SDA hattında çift yönlü veri içeren bir veriyolu sistemidir. SPI, ayrı hatlarda (MOSI ve MISO) veri girişi ve çıkışı olan noktadan noktaya bir bağlantıdır.

Temelde SPI , verileri diğer birinden çıkarırken bir vardiya kaydında verileri saatine geçirdiğiniz bir çift vardiya kaydından oluşur. Genellikle veri bayt cinsinden her defasında 8 saat darbeli olarak yazılır, ancak bu bir SPI gereksinimi değildir. Dilerseniz 16 bit, hatta 13 bit kelime uzunluklarına da sahip olabilirsiniz. I2C'de senkronizasyon SPI'deki start dizisi ile yapılırken, SS yükselmesiyle yapılır (SS aktif düşük). Bu saat kaç darbeden sonra kendinize karar verin. 13 bit kelime kullanırsanız, SS, 13 saat darbesinden sonra bitlerle geçen sonuncuyu kilitleyecektir.
İki yönlü veri iki ayrı satırda olduğu için arayüz kullanımı kolaydır.

NN+3N+2

Tcrosley’in dediği gibi SPI, I2C’den çok daha yüksek bir frekansta çalışabilir.

I2C biraz daha karmaşık. Bir veri yolu olduğundan, aygıtları ele almak için bir yol gerekir. İletişiminiz benzersiz bir başlatma dizisiyle başlar: saat (SCL) yüksekken veri hattı (SDA) aşağı çekilir, çünkü iletişim verilerinin geri kalanının yalnızca saat düşük olduğunda değişmesine izin verilir. Bu başlangıç ​​sırası her iletişimi senkronize eder.
İletişim adreslemeyi içerdiğinden, herhangi bir sayıdaki cihaz için sadece iki hat gerekir (en fazla 127).

düzenleme
Veri hattının çift yönlü olduğu açıktır, ancak bunun saat satırı için de geçerli olduğunu belirtmekte fayda vardır. Slave'ler bus hızını kontrol etmek için saati uzatabilir . Bu, I2C'yi seviye değişimi veya tamponlama için daha az uygun hale getirir. (Standart modda SPI satırlarının tümü tek yönlüdür.)

Her bayt (adres veya veri) gönderildikten sonra, alıcı SDA'ya bir onaylama nabzı koyarak makbuzu onaylamalıdır. Mikrodenetleyiciniz bir I2C arayüzüne sahipse, bu otomatik olarak halledilir. Mikrodenetleyiciniz desteklemiyorsa, hala bit-bang yapabilirsiniz, ancak okumak için bir G / Ç pimi kullanmıyorsanız, her onaylama veya okuma verisi için G / Ç pimini çıktıdan girişe çevirmeniz gerekir. yazmak için bir tane.

400kHz'de standart I2C, SPI'dan çok daha yavaştır. 20 MHz SPI'dan çok daha yavaş, 1 MHz'de çalışan yüksek hızlı I2C cihazları var.


7
I2C'nin tüm köşe kasalarını, bir I2C uzmanı olmadan gerekmeksizin uygun hata tespiti ve kurtarılması gereken tüm durumlarda ele alan bir mikroişlemci ile tanışmadım. SDA düşük tutulurken cevapsız saat durumuyla başa çıkmak için her zaman "akıllı" I2C çevre biriminden geçici olarak ısırmaya düşmek zorunda kaldım.
Jason S

(ama cevabınızın geri kalanıyla aynı fikirde olduğumdan beri +1)
Jason S

Bu işin çevresinde 3.4MHz'de bile I2C cihazları var, ancak bunların daha yavaş cihazlarla birleştirilip birleştirilemeyeceğinden emin değilim (tüm aygıtların veri yolu adreslemesini takip edebilmesi gerekir). Ayrıca 3.4MHz I2C'nin zamanlamalarının biraz farklı olduğuna inanıyorum.
Hans

@Hans - HS I2C , en yaygın 400kbit cihazlarla aşağı doğru uyumlu görünüyor . Açıkçası, (kapsamlı araştırma olmadan) HS'yi (henüz) destekleyen bir mikroişlemci görmedim, bu yüzden bundan bahsetmek istemedim.
stevenvh

@ stevenvh: Bazı kontrol cihazlarının iki telli uygulamaları (örneğin, Cypress PSOC), SCK'nın kilitlemeden önce iç saatin en az bir veya iki çevrimi için düşük olmasını gerektirir ve kötü çalışmayacaktır. Sistem saati darbesi olmadan neden bir I2C başlatma koşulunu algılayıp neden uzatamadıklarını bilmiyorum, ancak bu tür davranışlar böyle bir çip düşük bir sistem saat hızında çalışırken, veriyolundaki tüm I2C işlemlerinin yapılması gerektiğini belirtir yavaş koşmak). 400 MHz bile çalıştırma, 3 MHz'de çalışan bir PSOC için çok hızlı.
supercat,

39

(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.


5
IIC'den hoşlanmadığın dini burada bir yere sahip değil. Hem IIC hem de SPI, yaptıkları işte iyidir ve her birinin kendi yeri vardır. IIC'ye itirazlarınızın çoğu, uygunsuz kullanımından kaynaklanıyor. Akıllı malzemeleri kontrol etmek için güç kaynağı endüstrisinde rutin olarak kullanılmasına rağmen, IIC sadece yerleşik olarak düşünülmelidir. Kendinizi IIC arabellekleri ararken bulursanız, bu güçlü bir gösterge IIC'nin doğru çözüm olmadığını gösterir. Ancak, IIC, aynı karttaki düşük hızlı cihazlar için çok iyi çalışıyor.
Olin Lathrop

2
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 . Hayır, bu yanlış. IIC mantık eşikleri sabit gerilimlerdedir. Hatları sadece 3.3 V'a çekerek 5 V ve 3.3 V sistemlerini çok iyi bir şekilde karıştırabilirsiniz.
Olin Lathrop

5
I2C'nin dini olmayan bir dini değil, I2C'nin pratik bir beğenisi değil. Yerleşik sistemlerle daha kolay olduğu konusunda haklısınız; Mantıklı geldiğinde kullanacağım, ancak yazılım maliyeti de artıyor ve çok fazla donanım mühendisi daha fazla yazılım baş ağrısına neden olan tradeofları tartışmadan bir I2C cihazını bir kart üzerine yapıştırıyor.
Jason S

3
IIC, elektriksel olarak uygulanması biraz daha kolaydır ve SPI ürün yazılımı içinde belki biraz daha kolaydır. Her ikisi de, her iki açıdan da oldukça kolay ve anlaşılırdır.
Olin Lathrop

2
@Olin - Sabit 1,5 V eşik geçmişte kullanılmış gibi görünüyor, ancak spec eşiklerin son sürümüne göre gerçekten 0.3 Vcc ve 0.7 Vcc. Teknik özelliklerden alınan bu teklif , eski cihazlar için 1,5 V değerindedir.
stevenvh

16

SparkFun'daki cihaz için ana kart aslında sadece I2C versiyonu içindir (MPU-6500). MPU-6000 sürümü aynı çip üzerinde hem SPI hem de I2C arayüzüne sahiptir ve SparkFun'un bu çipli bir anakartı olduğunu görmüyorum. Bu nedenle, söz konusu tahtayı kullanmak istiyorsanız, I2C kullanmakla sınırlı olduğunuza inanıyorum. Ancak aşağıdaki nedenlerden dolayı durumunuzda I2C'yi kullanmanızı tavsiye edecektim.

Genel olarak, I2C veri yolunun donanım açısından SPI veri yolundan daha kolay olduğunu göreceksiniz. I2C 2 kablolu bir veriyolu (SCL / SDA):

SCL – Serial clock.
SDA – Serial data (bidirectional).

SPI 4 kablolu bir otobüsdür (SCLK / MOSI / MISO / CS):

SCLK– Serial clock.
MOSI – Master-out, Slave-in. Data from the CPU to the peripheral.
MISO – Master-in, Slave out. Data from the peripheral back to the CPU.
CS – Chip select.

Bir I2C veriyoluna bağlı birkaç cihazınız olabilir. Her cihazın yongada yerleşik kendi adresi vardır. Adres aslında veri yolu üzerinden her komutun ilk baytı olarak yayınlanır (bir okuma / yazma biti ile birlikte). Bu, diğer bazı ek yüklerle birlikte, aynı işlevsellik için I2C veriyoluna karşı SPI gönderilmesi için daha fazla bit gerektirir.

Farklı cihaz sınıflarının (bellek, G / Ç, LCD vb.) Farklı adres aralıkları vardır. Genellikle bir sistemde (PCF8574 I / O genişletici gibi) bir kereden fazla kullanılan bazı cihazlar, düşük bitleri belirtmek için yüksek veya düşük olarak bağlanabilen bir veya daha fazla adres satırı (PCF8574 için AD0-2) kullanır. Adresin MPU-6500 böyle bir adres hattına (AD0) sahiptir, bu nedenle ikisi aynı sistemde kullanılabilir.

Ayrıca bir SPI veriyolunda birden fazla cihazınız olabilir, ancak her cihazın kendi yonga seçimi (CS) hattına sahip olması gerekir. Bu nedenle, 4 telli açıklama bir yanlış adreste bir parçadır - gerçekten üç telli bir arayüz + cihaz başına bir ek teldir. Arduino serisi anakartlar konusunda tecrübeli değilim, ancak bunun Arduino'da SPI kullanmanın daha zor olacağını düşünüyorum, çünkü çok fazla talaş seçme hattı gerekiyorsa, bu, çeşitli kalkanlar tarafından kullanılan genel pin atamaları ile hantallaşmaya başlar. .

Arduino kurullarının çoğunun 5 voltta çalıştığını düşünüyorum, bazılarında da yeniler 3.3v'de çalışıyor. MPU-6500 3.3v'da çalışıyor. Bir 5v işlemcideki I2C veriyolu için minimum "yüksek" gerilim 3V veya daha düşükse, SCL ve SDA hatlarında 10K'lık çekme dirençleri 3.3V'a kadar veri yolu açık olduğundan, seviye dönüştürme sorunlarından kaçınabilirsiniz. kolektör. Bir CPU üzerindeki 5v dahili çekimlerin devre dışı bırakıldığından emin olun.

Ancak ATmega2560 için veri sayfasını kontrol ettim (örnek olarak ADK 5v Arduino'yu kullanarak) ve minimum 'yüksek "voltaj girişi, 3.3v'den daha büyük olan 0.7 * Vcc veya 3.5v'dir. Dönüştürme Çipin hem 5v hem de 3.3v taraflarında çekme dirençleri gerektiren TI PCA9306 , tek miktarlarda sadece 78 kuruşa mal oluyor.

Neden o zaman I2C üzerinden SPI'yi seçtiniz? Temelde, SPI'nin çok daha hızlı çalışabilmesi nedeniyle - bazı durumlarda 10 MHz'e kadar. I2C genellikle 400 KHz ile sınırlıdır. Ancak bu gerçekten MPU-6050/6000 ivmeölçer için bir sorun değil, çünkü I2C için 400 KHz'de ve SPI için sadece 1 MHz'de çalışıyor - fark bu kadar değil.


3
SPI'yi I2C üzerinden seçmenin başka bir nedeni: Tüm çizgiler tek yönlüdür ve seviye değiştiriciler gibi işleri biraz daha kolaylaştırır.
Mart'ta

3
I2C, SPI'dan daha kolay mı ?! I2C ile ilgili daha kolay olan tek şey, her şeyi birlikte bağlayabilmeniz durumunda bağlantı. Aksi halde I2C'de sinyal bütünlüğü daha zor ve sağlam yazılım uygulaması I2C'de daha zor.
Jason S

2
@JasonS, I2C'yi kullanarak onlarca gömülü yazılım projesini tamamladım ve yazınızda bahsettiğiniz kilitlenme sorunlarına hiç rastlamadım. Kötü deneyimlerinden dolayı hoşlanmadığını anlıyorum. Şu anda piyasada, ses çıkışı için I2C DAC kullanan ve aynı anda bir SD kartındaki bir sonraki veri tamponunu SPI üzerinden okurken piyasaya sürdüğüm bir ürün var. Harika çalışıyor. Otobüs çekimlerini aldığımdan ve ses geldiğinden beri SPI'yi hem DAC hem de SD kart için kullanamadım. Mikro (düşük seviye bir) sadece bir SPI ve bir I2C portuna sahiptir.
tcrosley

1
Bir I2C DAC'ye ses verebildiğiniz için etkilendim! (azami saat hızı nedir?) Kısa devrelerde yerleşik IC'leri kullanıyorsanız, kilitlenmeye başlama olasılığı son derece düşüktür, ancak hala mevcuttur. (Ayrıca sadece I2C'ye veri yazıyorsanız, hiçbir zaman bu sorunla karşılaşmazsınız. Kayıp / fazladan bir saat olduğunu düşündüğü şeyi sonsuza dek beklemek isteyen bir cihazdan okumanızı gerektirir.)
Jason S

1
@JasonS, ses sadece ses kalitesi, 8KHz - Her 16 bitlik örnek için bir 128 us interrupt kullanıyorum. I2C ayrıca kendi kesmesiyle de çalışır. Boş zaman, verileri SD karttan okumak için kullanılır. Kilitlenmeyle ilgili iyi bir nokta asla yazı üzerinde oluşmaz. ADC'ler dışında, genellikle çıkış cihazları için I2C kullandım. Ancak - Wii remote ve Wii Nunchuck arasındaki (3 'kablo üzerinden olan) salt okunur arayüzü (3' kablo üzerinden olan) 400 KHz'de I2C olduğunu biliyor muydunuz? Web üzerindeki birçok bilgi bu cihaz arayüzünü hackliyor.
tcrosley

15

Genel olarak, SPI daha hızlı bir veriyoludur - saat frekansı MHz aralığında olabilir. Bununla birlikte, SPI iki yönlü iletişim için en az 3 hat ve veri yolu üzerindeki her cihaz için ek bir slave seçimi gerektirir.

I2C, kaç tane cihaza sahip olduğunuza bakmaksızın (tabii ki limitler dahilinde) sadece 2 hat gerektirir. Bununla birlikte, hız kHz aralığındadır (100-400kHz tipik).

Günümüzde çoğu mikrodenetleyici her iki veri yolu için donanım desteğine sahiptir, bu yüzden her ikisi de kullanımı aynı derecede kolaydır.


4
@Jason: IIC'ye karşı bir miktar önyargıya sahip görünüyorsun, ama bunun için başkalarını öldürmek haksızlık. Hem IIC hem de SPI, her biri kendi kırışıklığına sahip olan "kolaydır". SPI, kolay olmayan ekstra hatlara ihtiyaç duyar. IIC biraz daha karmaşıktır, ancak zaman zaman yaptığım tüm firmware uygulamalarını yapmak hala kolaydır. Bu kadar kod almıyor. Her ikisi de kendi yerlerine sahip ve her ikisi de ne yaptığını bilen kimseye bir etmen olmayacak kadar kolay.
Olin Lathrop

5
@Jason: Yeni kontrol ettim ve IIC'in 8 bit PIC'lere firmware uygulaması için genel IIC kodum yalnızca 311 satır ve muhtemelen bunların yarısı yorum. Bu, IIC veri yoluna başlama, koyma, alma, durdurma, vb. Yordamlar düzeyinde yordamsal bir arayüz sağlar. Basit bir EEPROM kullanmaya çağıran bir modül 272 satır, yine de 1/2 yorum ve varsayılan veriler, UART hata ayıklama arayüzü, vb. Gibi bazı üst düzey yönetim içeriyor. SPI daha anlamsız.
Olin Lathrop

2
@Andrew Kohlsmith - I2C is designed for on-board applications.- Görünüşe göre I2C cihaz üreticileri size katılmıyor. TMP100'ü alın . Ürün sayfasında açıkça belirtildiği gibi: The TMP100 and TMP101 are ideal for extended temperature measurement in a variety of communication, computer, consumer, environmental, industrial, and instrumentation applications.Aynı TMP75
Connor Wolf için

5
@FakeName Sen hatalısın; 13 yıl boyunca endüstriyel güç elektroniği yapıyorum. (BÜYÜK üç fazlı yükleyicilerin başlatılması ve izlenmesi ÇOK gürültülü bir ortamdır) SPI'nin daha güvenilir olması ile ilgili değildir, sistemi planlanmış ve hesaplanmış tüm arıza modları ile tasarlamak ve gerektiğinde sistemde yerleşik kurtarma seçeneklerine sahip olmakla ilgilidir. Hiçbir zaman, hiçbir zaman I2C (veya bu konudaki SPI) konuşmalarımı öldüren bir gürültü spike'ım olmadı, ama aynı zamanda sadece benim için her şeyi yapmak için yalnızca I2C kontrolörüne güvenmedim. Bir otobüsün daha iyi olması değil, planlama ve tasarım meselesi.
akohlsmith

2
@akohlsmith: Tek-master tek-slave I2C bir "bit-bang" ustası ile sağlam olmalıdır. Birden fazla köle varsa ve ikisi aynı anda farklı şekillerde "karışık" hale gelirse, veri yolu kurtarılamaz bir şekilde kilitlenebilir (örneğin, sıfırla dolu iki veya daha fazla bellek yongası her ikisinin de ustanın bunları okumaya çalıştığını düşünür, ancak bit sayaçları) öteki de iddia edildiğinde senkronizasyon dışı, daha sonra her dönemlerde ise yalnızca SDA yayınlayacak olan ve bütün köleleri overdrive kadar güçlü bir "yüksek" sürebilirsin sürece ana yapabileceği bir şey otobüsü açacak.
SuperCat

12

SPI, I2C'den çok daha hızlı çalıştırılabilir (bazı SPI aygıtları 60MHz'in üzerindedir; "resmi" I2C spesifikasyonunun 1MHz'in üzerindeki aygıtlara izin verip vermediğini bilmiyorum). Her iki protokolü kullanarak bir ikincil cihazın uygulanması donanım desteği gerektirirken, her ikisi de "yazılım bit-bang" ustalarının kolay uygulanmasını sağlar. Nispeten minimal donanım ile, bir başka el sıkışma tellerine ihtiyaç duymadan, ana bilgisayar bir anda 500us'a kadar veriyolunu görmezden almaya karar verse bile doğru şekilde çalışacak olan I2C uyumlu bir köle inşa edilebilir. Bununla birlikte, güvenilir SPI işlemi, donanım desteği ile bile , genel olarak, birinin bir el sıkışma kablosu eklemesini veya başka bir konağın, kölenin en kötü durum yanıt süresine eşit her bayttan sonra "elle" bir gecikme eklemesini gerektirir.

Eğer dolandırıcılarıma sahip olsaydım, kontrolörlerin SPI desteği, toplam üç tek yönlü kablo kullanarak el sıkışma ve uyandırma yeteneklerine sahip kontrolörler arasında 8 bitlik saydam çift yönlü veri aktarımı sağlamak için birkaç basit ekstra özellik içerirdi (Clock ve MOSI [master] Master'dan-köle-içinde], köle MISO [köle-içinde-master]. Karşılaştırıldığında, "stok" SPI portlu mikrodenetleyiciler arasında verimli ve güvenilir iletişim, her iki işlemcinin keyfi bir süre boyunca bağımsız olarak ertelenebildiği durumlarda, çok daha fazla kablo kullanılmasını gerektirir (Chip-Select, Clock, MISO ve MOSI) artı, köle tarafından bir tür onay teli. Eğer köle eşzamansız olarak gönderilecek veriyi almaya başlayabilirse (örneğin, birisi bir düğmeye bastığından dolayı), biri "uyandırma" olarak başka bir kablo kullanmalıdır.

I2C, "gelişmiş" SPI’mın sahip olabileceği tüm yetenekleri sağlamaz, ancak SPI’nin sahip olmadığı yerleşik el sıkışma yetenekleri sunar ve çoğu uygulamada, usta bir yazılım bit-bang. İşlemciler arası iletişim için, SPI'nın sağlayabileceğinden daha yüksek hızlara ihtiyaç duyulması ve fazladan pin kullanımı kabul edilebilir olmadıkça, SPI üzerinden I2C'yi şiddetle tavsiye ederim. Düşük pin sayısının gerekli olduğu işlemciler arası iletişim için, UART'lerin bunları önerecek çok şeyi var.


1MHz'e izin veren yüksek hızlı I2C sürümü var; normal I2C 400 kHz'dir.
Direnç

@ Direnç: Normal I2C'nin 400kHz olduğunu biliyorum, ancak sürümleri 1MHz'e kadar belirlenmiş. Bilmediğim şey daha hızlı sürümlerin belirtilmiş olup olmadığı.
supercat,

400kbps (kHz değil, yanlış birimleri kullandım) özelliğine göre Hızlı mod, 1Mbps Hızlı mod Artı ve 3.4Mbps'ye kadar yüksek hızlı mod var. Ultra hızlı 5 Mbps'ye kadar çıkar, ancak tek yönlüdür.
Direnç

@ The Resistance: Teşekkürler. Daha sonraki versiyonları duymamıştım. 'Tek yönlü' ile tam olarak ne kastediyorsunuz? SPI köle-master iletişiminin hızının master-slave'den daha hızlı olabileceğini biliyorum, çünkü kölenin master'dan sonra saatini alma garantisi var, ancak I2C için eşdeğer bir konsept olduğundan emin değilim. Bir link var mı?
supercat

Spesifikasyonu burada bulun . 23. sayfada, Ultra-fast'un ACK bile değil, veri geri göndermeyen aygıtlar için kullanılabildiği yazıyor.
Direnç

8

Bu soru, buradaki mükemmel cevaplarda detaylı bir şekilde incelenmiştir, ancak belki de bir çip üreticisinin bakış açısından sunabileceğim I 2 C'ye bir bakış açısı daha var.

I 2 C'nin elektrik arayüzü açık bir kollektördür . Şimdi nefes al ve sonuçları düşün. I 2 C kullanarak , bus çalışma voltajına tamamen agnostik bir çip tasarlayabilirim. Yapmam gereken tek şey, eğer beni memnun ederse, SDA hattını düşük seviyeye çekmek ve SCL ve SDA'nın voltajlarını seçebileceğim yer referanslı bir eşik voltajıyla karşılaştırmak. Ve normal yüksek yan koruma yapılarını dışarıda bırakırsam ve onları diğer yapılarla değiştirirsem, sistemin geri kalanından bağımsız olarak kendi hayatını tamamen yaşayabilecek bir çip yapabilirim - SCL, SDA hiçbir zaman çipime ve herhangi bir akımı beslemiyor. kesinlikle bu pinlere akım beslemeyecek. Bu yüzden gerçek zamanlı saatler ve bunun gibi düşük güç tüketen diğer şeyler için böyle güzel bir otobüs.


4

Diğer cevaplarda bahsetmediğim bir şey de, I2C'nin aynı veri yolu üzerindeki çoklu ustaları desteklemesidir. İki yönlü iletişime ihtiyacınız varsa ve yoklama tabanlı bir yöntem kullanmak istemiyorsanız, I2C işi halleder.

Uzun mesafelerde, CAN aynı kapasiteye sahiptir ve daha sağlamdır. Ancak CAN, donanım desteği ve bir alıcı-verici gerektiren bir asenkronize bir protokoldür, bu nedenle düşük maliyetli bir sistemde bir seçenek olmayabilir.


İyi nokta (çoklu ana cihazda), kesme pimli SPI cihazları da gördüm, bir cihaz hala ana cihaz olsa da her ikisi de (iki yönlü) iletişimi başlatabilir. Oradaki uzak cihazlar için elbette daha sağlam ve daha iyi seçenekler var (CAN gibi).
Paul

0

SPI protokolünü kullanın ve senkronizasyon saati yükselirken bitlerinizi doğrudan cihaza yazın. Xnor mantık devresi, istenen cihazı bir i2c cihazmış gibi seçmek için bellekteki "ev yapımı" adresiyle eşleştirmek için kullanılabilir.

İ2c, otorite devresini cihazın formatına entegre eder, standart ... vb. Karmaşık ve farklıdır, bir spi ile bir videoyu ekranda göstermek için bir spi belleği kullanabilirsiniz, ancak i2c'yi değil.

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.