SPI veya I2C: uzunca bir otobüs için kullanılacak


36

Birkaç AVR'nin birbiriyle otobüs üzerinden konuşmasını gerektiren bir projeyi tasarlıyorum. 6 feet kadar ayrılırlardı.

Hem I2C hem de SPI, bir dizi mikrofonun bir otobüs üzerinden iletişim kurmasına izin verebilir gibi görünüyor, ancak bunun ne kadar süreceği hakkında hiçbir şey görmedim. Kimse bu protokolleri birkaç feet mesafeden bağlamayı denemiş mi?


Bir keresinde I2C veri yolunu bir kablo üzerinden geçirdim. Gezerken, bunun yerine CAN veya RS-485 kullanmalıydım (her iki ucunda da mikrodenetleyiciler vardı).
Nick Alexeev

Yanıtlar:


19

Diğerlerinin de söylediği gibi, SPI ve I2C, çekme dirençleri, saat frekansları vb. Sürece uzun mesafelerde kullanılabilir.

Ana alternatifler (daha iyi gürültü bağışıklığı sağlayacak) RS485 ve CAN'dır . Bunların her ikisi de gürültü sorunlarını en aza indirmek için diferansiyel hatları kullanır ve bu veri iletimi uzunluğu için I2C veya SPI'dan daha uygundur. Bununla birlikte, pek çok (herhangi bir?) AVR'nin CAN kullanımını çok kolaylaştıran yerleşik CAN çevre birimleriyle geldiğini sanmıyorum.

Bir otobüs seçerken göz önünde bulundurulması gereken en önemli şeyin, cihazlar arasında iletişim kurmak için kullandığınız protokolün bir CRC veya eşdeğeri olduğundan ve böylece bir mesajın doğru bir şekilde alındığını belirleyebilmenizi sağlamak olduğunu söylemeliyim . Paket). Bunu göz önüne alarak, bozuk bir mesajın tekrar iletilebilmesi için protokolün bir parçası olarak ACK / NACK tipi bir yanıtın olması da yararlıdır.


Biri çalışacak gibi geliyor. Esas olarak bu iki protokolü düşünüyorum, çünkü AVR'lerin çoğu, fazladan bileşen eklemeden onları doğal olarak destekliyor. Aksi takdirde, RS485 veya CAN iyi bir seçim olacaktır.
edebill

Delikli paketlerle sınırlı değilseniz, ST'nin uygun maliyetli ve güçlü STM32 ve CAN'lı STM8 mikroişlemcileri vardır, NXP bir LPC17xx mikroişlemcisine sahiptir ve orada birkaç tane daha vardır. CAN, birçok mikrodenetleyicide giderek daha yaygın (ve uygun fiyatlı) hale geliyor.
DrAl

1
Gerçekten de CAN alıcılarının yerleşik olduğu bazı AVR'ler var, ancak diğer satıcılar gibi, sadece fişlerinin sınırlı bir alt kümesinde bulunuyor.
davr

1
Mikroçip CAN ile birkaç PIC vardır. microchip.com/wwwproducts/Devices.aspx?dDocName=tr010302 . Yine de, özellikle Microchip'in C18 / C30 kütüphanelerinde programlamak için biraz "korkak" olduklarını itiraf edeceğim. Kod incelemesinde, uygulamanın özellikleri nedeniyle okunması çok zor olan bazı kütüphane kodlarını gözlemledik - alma tamponu olarak kullanılan bir aktarım tamponu, aslında temsil ettikleri şeylerin tersi olan bayrak adları. Kesinlikle mikrodenetleyici geliştirmede yeni birisine tavsiye edebileceğim bir şey değil.
J. Polfer

2
CAN ve RS-485 gerçekten elmalar ve portakallar. CAN, bit seviyesi protokolünü ve ayrıca fiziksel elektrik katmanını (PHY) tanımlar. RS-485 sadece fiziksel bir katman özelliğidir, protokol hakkında hiçbir şey belirtmez. RS-485 PHY'nin üzerine gerçek bir protokol bulmak veya uygulamak tamamen size bağlı olacaktır. CAN, çoğunlukla otomobil ve imalat sanayinde kullanılan yüksek gürültülü ortamlar için tasarlanmıştır. Protokolü oldukça karmaşık bir mesaj gönderme sistemidir ve çok fazla ek yüke sahiptir (düşük gerçek veri hızı) ancak yüksek veri bütünlüğüne sahiptir.
Mark

10

Birkaç ayak sorunlu olmamalıdır, mümkünse sadece bükülmüş tel kullanın. SPI'nin arabelleklenmesi (gerekmesi halinde) I2C'den çok daha kolaydır, çünkü SPI sinyalleri tek yönlüdür, I2C'nin sinyalleri de paylaşılan hatlardadır.

AVR mikroişlemcileri I2C ve SPI bağımlı modlarını ve ayrıca ana modları kullanabilir mi? (ikisine de ihtiyacınız olacak)


2
bükülmüş teller I2C verilerini ve saat çizgilerini ASLA bükmeyin! SPI ile bu muhtemelen daha az problem teşkil eder, ancak dengeli bir çift olmadıkça sinyal çizgilerini asla bükemem, bu durumda büküm çok iyi bir fikirdir.
Wouter van Ooijen 11:11

asla asla Deme; Gürültülü güç elektroniğine minik endüktif kuplaj yerine her gün veri + saat arasında küçük kapasitif kuplaj alırdım (bükülmediği için)
Jason S

4
Üzgünüm, kesinlikle katılmıyorum. 1 durumunda, çizgiler oldukça yüksek bir empedansa sahiptir. Yapılan gördüm, başarısız oldu. En iyi seçenek, I2C hatlarının her iki tarafında düşük akım topraklama çizgileri arasında veya daha da iyi olmasıdır.
Wouter van Ooijen 12:11

10

Uzun mesafelerdeki I2C için bazı "I2C bus repeater" çözümlerini aramak isteyebilirsiniz. I2C veya SPI iletişimi için bulabileceğiniz herhangi bir maksimum mesafenin, çoğunlukla bir veriyolundaki iki düğüm arasındaki mesafeden değil, toplam veri yolu mesafesinden kaynaklandığını unutmayın.

Bu tür problemler için RS485'e bakmak isteyebilirsiniz. Diferansiyel hatlar üzerinden iletişim kuran seri bir veri yolu protokolüdür, bu nedenle bükülmüş teller kullanıldığında, gürültü şansı en aza indirgenir. Bu yolla çok uzun mesafelere ulaşılabilir. Dezavantajı, devrenizde ekstra bir RS485 kodlayıcı IC'ye (bir MAX485 gibi, çok pahalı değil) ihtiyacınız olacaktı.


RS485 kesinlikle böyle bir şey için gitmek için iyi bir yoldur.
Scott Murphy

RS485'in RS232'den biraz bağımsız olan iki yönünün bulunduğunu unutmayın: fiziksel diferansiyel mantık seviyeleri ve multimaster yön. Bunları seçebilir + seçebilirsiniz, RS485'in multidrop parçalarına ulaşmak için noktadan noktaya UART (RS232) olan LVDS ve RS485 çevirmenlerini kullandık.
Jason S

2
btw RS485 bir protokol değil! sadece fiziksel katmanı tanımlar. Söyledikten, kesinlikle SPI'yi RS485 üzerinden kullanabilirsiniz !!! Gerekirse iletişimin SPI modunda tutulması temiz bir çözüm olacaktır (sanırım, uzak bir ADC'ye veya benzeri bir yere bağlı olabilir). RS485 üzerinden
SPI'yi

8

SPI’nin I2C’den henüz bahsetmediği bir avantaj, tüm SPI tellerinin tek yönlü olması ve daima yüksek veya düşük sürülmesidir. Bu, I2C ile mümkün olandan çok daha hızlı iletişime izin verir, gürültüye duyarlılığı azaltır ve basit kapıların tekrarlayıcı olarak kullanılmasına izin verir. Yararlı bir başka seçenek de basit asenkron iletişimdir (her yöne bir tel). Zaman uyumsuzluğunu görebildiğim tek dezavantajı, veri alışverişi için genellikle her iki tarafın da "uyanık" olmasını, sabit bir saatle olmasını gerektirmesidir.

Kendime ait bir proje için 3 telli hafif modifiye SPI protokolü kullandım ve sonuçları tatmin edici buldum. 10 bit / saatte veri bitmap verilerini (zaman zaman veri bozulmasının çok fazla olmayacağı yerlerde) ve 2.5 MB / sn'de diğer verileri zorlanmadan gönderiyorum.


Bu çok eski bir cevap, fakat değiştirilmiş SPI protokolünüzü hangi mesafeden gönderdiğinizi söyler misiniz? (Bu sorunun amacı ...)
Daniel Griscom

@DanielGriscom: Tipik olarak yaklaşık 3 metre, çok etkileyici olmayan kablolamada, ancak bazen daha uzun.
supercat

6

Hem I2C hem de SPI kısa mesafeli kalkışlar (birkaç inç) için tasarlanmış olsa da, her ikisi de uygun kablo ve genel veriyolu kapasitansına dikkat edilerek daha uzun mesafelerde kullanılabilir.

SPI konusunda çok az deneyimim olsa da, her zaman çekme direnciniz için uygun boyutu hesaplamanız gerektiğinden I2C çok zor değildir. Ek olarak, kullanımı oldukça kolay olan özel ve ucuz I2C arabellekleri vardır. Ancak, ağınız için uygun boyutta bir çekme direnci kullanmanız gerekecektir.

I2C'yi iki AVR arasında 8 metrelik bir mesafede ağlamak için kullandım, yalnızca çekme dirençleri ve yüksek kaliteli, iyi korunmuş, bükülmüş kablo kullandım.


w / I2C'ye çok iletkenli kablolarla dikkat etmeniz gerekir, kapasitans, veriyolunun önemli ölçüde yavaşlamasına neden olabilir.
Jason S

6

Birçoğunun önerdiği gibi, I2C ve SPI en kısa mesafeler için kullanılır. Bu arayüzlerle bir çözüm uygulamak mümkün olsa da, farklı, "daha standart" bir çözüm aramanızı şiddetle tavsiye ederim (örn. Ethernet, RS485, CAN, vb.). - Özellikle mikrodenetleyiciler arasındaki 6ft mesafeye ulaşmak için kablo kullanmayı planlıyorsanız.


6

Sadece bir FYI, kablosuz Nintendo Wii remote ve Nunchuck arkadaşı arasındaki arabirim, yaklaşık 3 fit uzunluğunda bir kablo üzerinden I2C kullanıyor. Ayrıca toplam uzunluğu 6 ayağa uzatan 3 ayak uzatma kabloları da vardır. Kurulumunuzla tamamen aynı değil (sadece birbirine bağlı iki cihaz), ancak yaygın olarak kullanılan bir tüketici ürününde kablo üzerinden I2C örneğidir.


4

I2C üzerinden haberleşen bir yıldız ağında yaklaşık 80 AVR tabanlı düğüm içeren bir proje üzerinde çalıştım. Bu tam bir karmaşa oldu ve sonunda işe yaramadı. Tüm düğümlere güncellemeleri almak birkaç saniye sürdü ve hatalı bir bağlantı tüm ağı kesecekti. Sonunda düğümleri yapan adamla konuştum, böyle projeler için I2C'yi kullanmayı bıraktığını söyledi. Maalesef burada özellikle I2C'nin neden yetersiz olduğunu bilmiyorum.


1
I2C, SPI'dan çok daha yavaştır ... aynı zamanda, çarpışmalarda projenizin tahkimi nasıl yönettiği konusunda da olabilirdi ... ya da kapasitansın, yavaş bir saat hızı kullanmak zorunda kaldığınız tüm düğümlerde yeteri kadar yüksek olabilirdi.
Jason S

2

Bu kısa mesafelerle kolay olmalı. Yapabileceğiniz şey, bu mesafelerin ve kablonuzun kapasitans ve hat empedansı anlamında ne anlama geldiğini bulmak ve ne tür frekansları (yükselme / düşme zamanları) geçirebileceğinizi görmek. Belli bir noktadan öte, onlara iletim hatları olarak davranmak en iyisidir. Kötü görünüyorsa, EIA-232 veya 422 gibi başka bir seri hatta geçebilirsiniz. Bu, her iki uçta da ekstra bir yonga anlamına gelebilir ancak uzayabilir. Eğer gerçekten hızlı ve uzağa gitmeniz gerekiyorsa, daha fazlasına ihtiyacınız olacak (ethernet, radyo veya lazer saymayın :).


2

Saat hızını kontrol edebiliyorsanız ve yüksek hızlı veri aktarımına ihtiyacınız yoksa, saati yavaşlatmaya çalışmalısınız. Bu, gürültüye daha az duyarlı hale getirecektir.

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.