Bir sistemden diğerine veri aktarımı için genel protokol?


18

Bir sistemden diğerine bilgi göndermek için genel protokol nedir? Örneğin, başka bir mikrodenetleyiciye göndermek istediğimiz süre boyunca mikrodenetleyiciden toplanan bazı bilgilerimiz olduğunu varsayalım. SPI ve I2C arayüzlerini duydum, ancak bir yöntemi diğerine göre nasıl kullandığınızı ve nasıl uyguladığınızı bilmiyorum. SPI ve I2C dışında yaygın olan başka yöntemler var mı? Uygulama süreci farklı mikrodenetleyiciler için benzer mi? Temelde alıcı mikrodenetleyici üzerinde yaptığım veri bayt ayrıştırma mı?


4
Yapmak istediğiniz somut şey nedir?
starblue

Bir sistemin farklı parçalarını birbirlerine küçük bir kutuda nasıl aktaracaklarını düşünmek, böylece mesafenin çok kısa olduğu varsayılabilir. Bir kutuda farklı parçalara sahip olmanın nedeni, her parçanın kendi işlevine sahip olması için fonksiyonları basitleştirmektir (umarım bu mantıklıdır ..)
O_O

2
insanların normalde sistem dediği şey bu değildir. Bunlar daha çok alt sistemler olarak tanımlayacağım şeyler. Bunlar, tek bir görevi yerine getiren tek bir sistem olarak düşünebileceğiniz şeyin bir parçasını oluşturur. Anlambilimdir, ancak bence cevaplarınızın çoğu çok geniştir çünkü sorudan ne aradığınız konusunda mükemmel bir fikirleri yoktur.
Kortuk

1
Kortuk'un söylediği gibi, sorunun tanımlanmasına yardımcı olur. Kendinize sormanız gereken önemli bir soru, bağımsız alt sistemleri aynı işlevin farklı uygulamalarıyla değiştirmek isteyip istemediğiniz veya bu tasarımın bir kerelik olduğu gibi olup olmadığıdır. Gerçek otobüs kullanabilir ve cpu için alt sistemlerin uygulanması ayrıntıları açığa Eğer bir iletişim arayüzü kullanırsanız, öyle ise, o zaman bir alt sistem değişikliği değil olsun, denetleyici için değişim w / olarak gerektirir nasıl bir (değiştirilmesini uygulamak ) aynı ileti protokolünü karşıladığı sürece.
JustJeff

Görevleri ayırmaktan başka bir nedenden ötürü işlevselliği birden fazla cihaza bölmek daha kolay değildir. İletişim ve senkronizasyon aynı mikroda iki işleme sahip olmaktan daha karmaşıktır. Şimdi, bu süreçler özellikle uyumsuz gecikme profillerine sahipse (biri hızlı bir şekilde güncellenmelidir, diğeri bir parçayı tamamlamak biraz zaman alabilir), o zaman bunları bölmek için geçerli bir neden olabilir. O zaman bile, daha yaygın çözüm kesintileri kullanmak veya daha uzun görevi daha da yıkmak için bir yol bulmaktır. Açıkladığınız şeyle bunu yeniden düşünmeniz gerektiğini düşünüyorum.
darron

Yanıtlar:


10

SPI ve I2C benzerdir, çünkü gerçekte sistemler arasında veri aktarımından ziyade çevresel aygıtları bir denetleyiciye veya CPU'ya bağlamak için daha fazla kullanılırlar. USB, insanların aslında bir çevresel bağlantı veri yolu olan bir iletişim sistemi olarak ele almak istediği başka bir arabirimdir.

Sistemler arasındaki iletişim, bir veriyoluna bir aygıt takmak gibi değildir. Veri yolu eki, işlemcinin bir aygıttaki kayıtlara doğrudan vurmasına izin verirken, bir iletişim arabirimi veri akışları göndermenizi / almanızı sağlar. Bir otobüse bağlı bir cihaz genellikle bir aygıt sürücüsüne ihtiyaç duyarken, iletişimde, ana bilgisayar söz konusu olduğunda, diğer ucunda neyin bağlı olduğu gerçekten önemli değildir .

Tabii ki, bu her zaman daha tehlikeli bir sınır haline geliyor. PCI ve ISA gibi şeyler tartışılmaz otobüslerdir; I2C, SPI, USB tartışmalı otobüslerdir; oysa RS232, RS485 ve ethernet kesinlikle iletişim arayüzleridir. Ama sonra CAN veri yolu ve 1553 gibi, kesinlikle veriyi hareket ettirmekle ilgili, ancak çok ilgili bir şey var.


CANbus çok ilgili ve ethernet dahil değil mi? CAN, basit ileri geri mesajlaşma için çalışmak için çok basittir. Bunlar özel çiplerdir ve çoğu aile kendi mikro denetleyicilerine destek verir.
Kortuk

@Kortuk - 232 gibi bir şey bir tür eşler arası simetriye sahipken, 1553 veya CAN bir master / slave ilişkisi uygular, evet. Ethernet'in basit olduğunu, sadece uç noktalara bir otobüs denetleyicisi / otobüs cihazı ayrımı dayatmadığını söylediğime inanmıyorum.
JustJeff

ayrıca, tam açıklama - CAN hakkındaki düşüncem tamamen teğetsel maruziyetten; üzerinde çalıştığım birkaç sistemde kullanılmayan isteğe bağlı bir çevre birimi oldu, ancak belgelerin yüzlerce geçişinden sonra, sadece osmoz tarafından kullanılmayan seçenekler hakkında biraz emilirsiniz. Bu yüzden CAN'ın denetleyici / kontrollü aygıt mimarisi olduğu varsayımı altında çalışıyorum.
JustJeff

Bence otobüsün farklı bağlamlarda farklı anlamları var. Şematik bir seviyeden, birden fazla sinyale sahip herhangi bir arayüz bir veri yolu olarak düşünülebilir. Daha soyutlama ile daha yüksek seviyelere hareket ettikçe, otobüs anlamları değiştirir. Biraz daha yüksek olan veri yolu genellikle birden fazla cihazın dahil olduğu veya olabileceği anlamına gelir. Örneğin RS485 çoklu noktası kesinlikle bir otobüstür. Çok daha yukarı, Linux cihaz bakış açısından, RS485 tekrar bir iletişim arayüzü haline gelir ve bir otobüs olmaktan çıkarılır ... siz üstüne kendi protokol katmanınızı ekleyene kadar tekrar otobüse dönüşür. Her seviyede farklı anlamları vardır.
darron

11

Veri göndermenin tek bir yolu yoktur, mesafeye, veri hızına, çevreye, uygulamaya bağlı olarak iletişim kurmanın birçok farklı yolu vardır ...

En alt katman, bitleri gerçekten hareket ettiren fiziksel katmandır .

  • SPI ve I²C, cihazın içinde iletimi bozabilecek çok fazla gürültünün olmadığı kısa mesafeler içindir.

  • Birkaç metreye kadar mesafelerde çok hızlı iletişim için RS-232 üzerinden seri iletişim iyi bir seçimdir.

  • Daha fazla gürültü veya daha uzun mesafe varsa, örneğin RS-485'te fark sinyalleri kullanılır. Daha hızlı veri iletimi için giderek daha popüler hale gelen Ethernet var.

  • Ayrıca çeşitli kablosuz standartlar da var.

Fiziksel katmanın üstünde, iletimdeki hataları tespit etmek ve düzeltmek, bir ağda yönlendirme ve diğer pek çok şey için verilerin nasıl gönderileceğini düzenleyen daha fazla katman vardır. Örneğin, internet protokolü, tipik olarak Ethernet protokolünün üstünde olmak üzere, birkaç katmanın oldukça karmaşık bir yığınıdır.


7

Basit bir seri UART kullanılabilir (bir Tx ve bir ayrık saat içermeyen bir Rx hattı) ve optoizolatörler veya manyetik izolatörler ile farklı potansiyeller (birincil ve ikincil devreler arasında) geçiş yapmak için kolayca uyarlanabilir .

Protokollere gelince, tanımlı komut baytları ve bir çeşit sağlama toplamı şeması olan her şey iyi çalışır. Gerçekten tüm iletişim türlerine uyan bir kapak-üstü standart protokol yoktur. I2C'nin bir sinyalizasyon standartları vardır (adresleme, durma, başlatma vb. Tanımlayan), ancak gerçekte iletilenlerin protokolü yalnızca geliştiriciye bağlıdır.

Örneğin PMBus , fiziksel ortamı olarak I2C kullanan bir güç kaynağı iletişim protokolüdür.


6

Gerçekten bir "genel" protokol yoktur, ne kullanmak sonunda uygulama bağlıdır. Size daha iyi bir cevap verebilmemiz için ihtiyaçlarınızı biraz daha iyi anlamamız gerekiyor. Birbirinizle alt sistemler olarak konuşan ayrı mikro denetleyicilerin olmasını istediğinizi belirtiyorsunuz.

Bu uygulama hakkında bazı sorular:

  1. Bu projede 2'den fazla mikro denetleyici olacak mı?
  2. Hız ve verimlilik gereksinimleriniz nelerdir? Bilgilerin oraya ne kadar hızlı ulaşması gerekir ve ne sıklıkla veri gönderip alırsınız?

1. soruya HAYIR yanıtı verdiyseniz:

Bu projede sadece 2 micrco-kontrolör varsa, aralarında kesinlikle UART kullanabilirsiniz. Her ikisinin de iletişimi başlatması gerekiyorsa, akış kontrolünü kullanın, aksi takdirde verileri bir yönde göndermek önemsiz olmalıdır. Daha yüksek baud hızlarından birini seçtiğinizde, çoğunlukla "yeterince hızlı" olmalıdır. I2C ve SPI tipik olarak sadece master / slave mimarisi için iyidir.

1. soruya EVET (2'den fazla denetleyici) yanıtı verdiyseniz:

  • Projenizde 2'den fazla mikro denetleyici varsa hangisi iletişimi başlatır? Sadece bir ana denetleyici mi olacak (yani master-slave mimarisi)? Veya herhangi bir alt sistem herhangi bir zamanda konuşabilir mi?
  • Alt sistemlerden herhangi birinin birbiriyle konuşmasına ihtiyaç var mı? örneğin: A, B ve C cihazları için: A B ve C'ye gönderebilir ve B hem A hem de C'ye gönderebilir, vb.

Artık adreslenebilir cihazları ortak bir veriyoluna bırakabileceğiniz daha ölçeklenebilir bir şeye ihtiyacınız var. Bu takip sorularının cevabı I2C ve SPI (master-slave) veya CAN (multi-master) gibi bir şey arasında karar vermenize yardımcı olacaktır.

Mikro denetleyicinizde büyük olasılıkla bir UART çevre birimi vardır, diğerleri (özellikle CAN) yalnızca daha yüksek uç yongalarında kullanılabilir. Her iki durumda da, baytları taşımak için bu çevre birimlerinin nasıl kullanılacağına dair çok sayıda belge olmalıdır.


5

@Jon'un belirttiği gibi, bir iletişim arayüzü seçmeyle ilgili bir sorun, bir işletmenin iletişimi başlatmaktan her zaman sorumlu olup olmayacağı veya birden fazla işletmenin bu kadar sorumlu olup olmayacağıdır. İlgili bir konu, bir işletmenin her zaman istenmeyen iletişimler almaya hazır olup olmayacağıdır. SPI, bir tarafın her zaman iletişim almaya hazır olacağı uygulamalarda sıklıkla kullanılır. Örneğin 74HC595 kaydırma yazmacı gibi bir şey asla "meşgul" olmaz. SPI, bir mikrodenetleyici ve mikroun kontrol etmesi gereken donanım arasındaki iletişim için iyi olsa da, iki mikrodenetleyici arasındaki iletişim için gerçekten iyi değildir. I2C donanımına sahip iki işlemci bunu iletişim kurmak için kullandığında, yazılım olup bitenlerle başa çıkmak istediği sürece (çok cömert kısıtlamalar dahilinde), veri kaybına neden olmadan. Bir işlemci, gelen her baytı işlemek için 100 mikrosaniye alacak olsaydı, bu, verimi ciddi şekilde sınırlardı, ancak gönderen, alıcının yetişebileceği kadar yavaşlayacaktır. Genellikle SPI ile gerçekleşebilecek tek yol, el sıkışma için ayrı bir telin olması.

I2C gerçekten harika bir protokoldür. Akla gelebilecek en mükemmel protokol olmasını engelleyen en büyük sınırlamalar

  1. Hızı biraz sınırlı; SPI çok daha hızlı gidebilir ve hatta UART'lar bazen biraz daha hızlı gidebilir
  2. (2) I2C'nin sadece iki kabloya ihtiyaç duyması çok uygun olsa da, her iki kablonun çift yönlü açık kollektör iletişimi yapabilmesi gerekir. Bu, I2C'yi tekrarlayıcılarla göndermeyi zorlaştırır.

Şahsen, denetleyici satıcılarının el sıkışma dahil üç telli bir SPI varlığını desteklediğini görmek istiyorum. Yine de, bunu yapan herhangi bir denetleyicinin farkında değilim.


Komik bundan bahsetmelisin ... Çip seçtiğimden çok daha fazla cihazın otobüse katılmasını sağlamak için bir SPI arayüzünü çift yönlü I2C benzeri bir arayüze (ilk bayt bir adres) dönüştürmek zorundayım . Slave cihazlarınızın hepsi FPGA ise çalışır. :) Ben de bu iki büyük senkron standart arasında bir şey olmasını diledi.
darron

Oh, sanırım çıkışın köleler üzerindeki adres bayt alınana kadar etkinleşmediğini ve tek çip seçimi dağıtılıncaya kadar açık kaldığını açıklığa kavuşturmalıyım ... bu yüzden normal SPI + yüksek seviyeden biraz farklı. protokol. Bununla birlikte, ana cihaz bakış açısından standart SPI ile tamamen uyumludur. (bir mikroişlemci gibi)
darron

@ darron: Güzel. Endüstrinin, tellerin aktif olarak yüksek ve alçak bir şekilde sürüldüğü açık standart üç telli bir iletişim veriyolunu kullanmaya başlaması için ne olacağını merak ediyorum? Pasif pull-up'lardan kaçınmak ve herhangi bir cihazın bir kesintiye işaret etmesine izin vermek arasında hafif bir çatışma var, ancak bu, efendiye bağlanabilecek veya kölelerin rahatlığında değil bir kesme pimi eklenerek giderilebilir (şu anki uygulama protokolün sadece bir bağımlısı vardır, bu nedenle servis yapmak istediğinde zaman uyumsuz olarak sinyal vermek için veri dönüş telini kullanabilir).
supercat

@darron: Bir çip seçme pimi kullanmak zorunda kalmamak için, master, saat düşükken veri kablosuna iki yükselen kenar göndererek komutun başlatılmasını işaret eder; slave'ler, saat ve verilerin düşük (boşta) olduğu zaman bir durum değeri çıkararak son veri baytlarının geçerli olup olmadığını gösterebilir; aksi halde saat düşük ve veri yüksek olduğunda dikkat istediklerini belirtirler. Bu protokol için ana donanım tasarlıyorsam, veri telinin yansıtılmış saatine 8 saat darbesi gönderme yeteneğini
eklerdim

@darron: ... bir veri baytı. Beş veya daha fazla olursa, bayt yok sayılır (köle, efendinin bir bayt veri almakla ilgilendiğini, ancak aslında söylemek istediği hiçbir şeyi olmadığını varsayar). Bununla birlikte, kölenin saat düşükken son bayt durumunu bildirmesi (yani, köle cihazı bir işlemci olsaydı, efendinin köle hazır olmadığını bilmesine izin vermek gibi) neredeyse önemli olmayacaktır. ve son 'işlem fırsatını' kaçırmıştı
supercat

3

Belirli bir sırayla, aynı kutudaki 2 CPU için en popüler fiziksel katman örnekleri aşağıdaki gibi görünmektedir:

  • papatya dizimi SPI (JTAG tarafından kullanılanlar gibi)
  • köle başına tel seçimi
  • "TTL seviyesi RS-232" aka "asenkron start-stop seri iletişim" (bir CPU'nun UART TX pinini başka bir CPU'nun UART RX pinine doğrudan bağlama)
  • I2C
  • 8 bit veri + flaşör (IEEE 1284 yazıcı bağlantı noktası paralel bağlantı noktası gibi)
  • paylaşılan bellek (adres / veri / kontrol veri yolunu aynı anda yalnızca bir CPU çalıştırır)

Bu fiziksel katman örnekleri (ve ayrı kutulardaki 2 CPU için diğer fiziksel katman örnekleri), genellikle yazılıma iletişim sisteminin daha yüksek seviyelerini uygulayan bir bayt akışı sağlar.

Akıllı programcılar yazılımı, donanım adamı bir fiziksel katman örneğini yırtmaya ve tamamen farklı bir fiziksel katman örneğiyle değiştirmeye karar verdiğinde, baytların çıkış akışını beslemek için sadece birkaç işlevi yeniden yazmaları gerektiği şekilde yazar. donanıma aktarın ve donanımdan gelen bayt akışını okuyun ve tüm üst düzey protokoller değişmeden çalışmaya devam eder.

Bir CPU'dan başka bir CPU'ya bilgi gönderme protokolü neredeyse her zaman bayt akışını bir paket serisi olarak yorumlamayı içerir:

  1. önsöz
  2. başlık
  3. (muhtemelen çıkış) serileştirilmiş veriler
  4. tanıtım videosu

Bazı insanlar, (3a) başlık yapısının birçok çeşidinden birini (3a) birçok çeşit veri ile (3b) serileştirilmiş verilerden (4) birçok römork türünden biriyle kaçmak.

Verileri bir pakete kapsüllemek için en basit protokollerden bazıları şunlardır:

Verileri bir pakete kapsüllemek için biraz daha karmaşık protokoller şunları içerir:

Adresinde uzun bir protokol listesi var

Radia Perlman'ın protokol tasarımının nasıl yanlış gidebileceğini anlatan "Protokol Tasarımı Folkloru" nu okumaktan keyif alabilirsiniz.


3

Tek bir 'genel' protokol yoktur. Seçim (örneğin) şunlara bağlı olabilir:

  • mesafe
  • gerekli verim
  • özel çevre birimlerinin kullanılabilirliği
  • gürültü seviyesi
  • optik izolasyon ihtiyacı
  • kritiklik (tolere edilebilir arıza oranı)
  • her iki uçta avialable CPU gücü
  • her iki uçta mevcut G / Ç pimleri

Çoğu durumda, fiziksel katmanı (sinyal seviyeleri) veri bağlantı katmanından (verilerin kodlanma şekli +/-) ayırmanız gerekir (OSI modelini kontrol edin, alt 2 ..4 katmanları). Olası fiziksel katmanlar örneğin:

  • basit 5V veya 3.3V veya hatta 1.8V TTL
  • yukarıdakilerden herhangi biri ancak itme-çekme yerine açık kollektör
  • dengeli lov voltaj sinyali (genellikle FPGA'larla kullanılır)
  • dengeli higer volatge (RS485, RS432)
  • tek uçlu yüksek voltaj (RS232)
  • dengeli trafo bağlı (çeşitli ethernet sürümleri, PDIF ses)
  • optik (optik ethernet, toslink)

Veri ve saat bilgilerini taşımak için bir satır kullanabilir veya bunu birden çok satıra bölebilirsiniz. Sonuncusu eskiden popülerdi, ancak günümüzde çoğu yeni / hızlı protokol bir çizgi (veya bir çizgi gibi davranan bir çift) kullanma eğilimindedir.

Bir satırdaki verileri ve saati kodlamanın birçok yolu vardır. RS232 geleneksel olarak NRZ kullanır, Machester kodlama vardır, ve meraklı isimler hattı 2.7 RLL ile sabit disklerde çeşitli format kullanımları.

Özetlemek gerekirse: Sistemler arasında iletişim kurmanın gazilyon yolları vardır. Konektörlerden veya hata algılama ve kurtarma, veri kodlama, sıkıştırma ve şifreleme gibi daha üst düzey yönlerden bile bahsetmedim ...

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.