Paylaşılan otobüs hareketini OR olarak yapma


10

Sabırsız için arka planı atlayabilirsiniz.

Arka fon

SPI ile iletişim kuran bir dizi mikrodenetleyici programlıyorum. nOtobüsü paylaşan bir efendi ve köleler var. Çip seçimi yok. (Kötü bir tasarım değildir, ancak nbüyüktür ve nfazladan çizgiler için yeterli alan yoktur ).

Bu nedenle, MISO'larını yüksek empedansta tutmak ve en fazla birini konuşmak kölelerin sorumluluğundadır. Bu sadece kimlikleri sorgulandığında yanıtlanarak yapılır.

Şimdi, ustanın, kimlikleri ona bağlı olan kimlikleri keşfettiği ilk keşif aşamasına sahip olmak istiyoruz. Hayatı kolaylaştırmak için (bazı yönlerden), kimliği benzersiz kılmak istiyoruz (ve dolayısıyla 32 bit). Bu, ustanın kimlikleri tek tek yok etmesini ve kimin cevap verdiğini görmesini imkansız hale getirir (çok fazla olasılık vardır).

Bu sorunu çözmek için, kölelerin toplu olarak yanıt verdiği ve ustanın hızlı bir şekilde minimum kimliği bulabildiği bir ikili arama varyasyonu tasarladım. Bu kimliğe sahip köle artık katılmaması söyleniyor ve algoritma tekrarlanıyor. (Ayrıntılar önemsizdir).

Yine de bir sorun var. Toplu yanıtın tüm yanıtların mantıksal OR (veya mantıksal AND) olması gerekir. Hattın, MISO veri yolunun mantıksal bir OR gibi hareket edebileceği şekilde yapılandırılabileceği söylendi. Bana söylenenler:

  • MISO'yu master olarak Pull-up olarak ayarlayın ve
  • Her köle için MISO'yu Open-drain olarak ayarlayın.

Bunu denedim, ancak tek bir köle bile, bu yapılandırma çalışmıyor (osiloskop hatta sabit bir sıfır gösterir). Master üzerinde MISO'yu yüksek empedanslı giriş olarak yapılandırırsam, osiloskop ile voltajın iki slave'den çıkış bitlerinin farklı olduğu yarıya düştüğünü görebiliyorum (temelde kısa devre I varsayıyorum).

Not: MISO'yu master üzerinde yüksek empedans ve köleleri itme-çekme olarak yapılandırırken, aynı veriyolunda birçoğu olsa bile her biri ile ayrı ayrı konuşabilirim. Demek istediğim, bu çizginin kendisinin bir problemi.

Soru

Benim sorum, eğer bu mümkün ise ve eğer öyleyse, master ve slave'lerin giriş ve çıkış pinlerini nasıl paylaşabilirim, böylece paylaşılan MISO hattı mantıksal VEYA (veya mantıksal VE) olarak hareket eder?


Düzenle

  1. Sonuçta negatif-gerçek mantığı olan bir OR olur (temel olarak bir AND).

  2. Tek slave ile ilgili problem, master üzerindeki çekme pimine 1 yazılmasıyla çözüldü. Daha önce başlangıç ​​durumu 0 idi.

Düzenle 2

Çıktı ST köle, MISO'nun GPIO yapılandırmamı açık drenaj olarak geçersiz kıldı ve bir tanesi yazıldığında onu zorladı. SPI'nın susturulmasına ve MISO'nun bu durumda manuel olarak çıkarılmasına karar verdim.


Sormaktan nefret ediyorum, çünkü bunu düşündüğünüzden eminim, ama I2C veya CAN kullanmayı düşündünüz mü? N cihaz için tasarlanırken, SPI gerçekten her cihaz için bir çip seçimi ile kullanılmak üzere tasarlanmıştır.
Bob

@bob, evet. Çok yavaşlar. Her neyse, sorumun cevabı "imkansız" ise, o zaman biraz manuel iş yapmak zorunda kalırız, ancak yine de nihai ürün SPI ile çok daha iyi.
Shahbaz

1
Adres olarak 32 bit kullanmanız üzücü çünkü 24 bit (16,772,216 varyasyon) kullanıyorsanız, bir "find" komutu gönderebilir ve 16,772,216 saat bekleyebilir ve tüm köle bilgilerinizi alabilirsiniz. 10 Mbps'de bu, 2 saniyeden daha az sürecek ve anlaşılması gereken çatışmalar olmayacak. Hey ho - bunun için + 1 düşünmemi sağladın.
Andy aka

@Andyaka, 24 bit de kötü olmayabilir (ancak 32 bit kesinlikle daha iyidir). eğer seni doğru anladıysam, her bir köle id 1 saatinde 1 ile cevap verir ve efendi hangi saatlerin bir saat ürettiğine bakar? Köleler bayt olarak yanıt vermediği sürece bu kötü değil. Bu yüzden her köle 8 bitle yanıt verir ve otobüsün VEYA gibi hareket etmesini sağlayamazsam, yine de bir köle gelen yanıt diğer köle tarafından verilen yanıtlar içinde "kaybolur" (bir köle gelen 1, 0'lardan aşağı çekilir) geri kalan).
Shahbaz

@Shahbaz köle kodu üzerinde kontrolünüz varsa, köle tahsis edilen zamanda sadece 1 bit ile cevap bu bir "özel" yapabilirsiniz. Evet, musilerimin özünü aldın.
Andy aka

Yanıtlar:


5

Seçmeden SPI'nız, Microchip'in MCP23017 yongalarında (ve diğerlerinde) kullandığı şeydir. Bu yaklaşımda yanlış bir şey yok.

Evet, istediğiniz şey mümkündür, ancak kölelerin açık tahliye olmasını sağlamalısınız. Açık drenaj gibi davranmalarını sağlayamazsanız, her bir çıkışla (schottky) bir diyot sererek hile yapabilirsiniz.

Numaralandırma yaklaşımınız, numaralandırma için Dallas tek telli veri yolu ve tahkim için CAN veri yolu tarafından kullanılanla aynıdır.

Ancak yaklaşımınızın ciddi bir dezavantajı, hızın artık çekme direnci tarafından yönlendirilen yükselme süresi ile sınırlı olmasıdır. Bu, bir itme-çekme çıkışı tarafından sürüldüğünden daha yavaş olacaktır ve muhtemelen veri yolunu çalıştırabileceğiniz hızı sınırlayacaktır.

Her slave'e yedek iki pim varsa, onları papatya dizimi yapabilir ve papatya zincirindeki yerlerine göre bir numaralandırma düzenine sahip olabilirsiniz.


Evet (ben yaklaşık 20 kat (4Mpbs aşağı 128Kbps aşağı) yaptı) hızını azaltmak gerektiğini söylendi bahsetmeyi unuttum. Yine de bu bir başlangıç ​​aşamasıdır ve algoritmam daha düşük hızla başa çıkabilir (hala oldukça hızlıdır). Ne yazık ki, şimdi donanımı yeniden tasarlayacağımızdan şüpheliyim. Maliyet, sadece bu aşamayı görmezden gelmekten ve ustaya kimliğin ne bekleyeceğini söylemekten daha fazlasıdır.
Shahbaz

Soruya geri dönersek, köleleri zaten açık tahliye olarak yapılandırdım. Master'ı nasıl yapılandırmalıyım?
Shahbaz

1
Master'ın MISO pininde, çekme hariç özel bir şey yok. Bir pull-up tasarımı ile 128Kbps'ye ulaşacağınızdan şüpheliyim, ancak YMMV. Bazı derinlemesine I2C belgelerini okumak yardımcı olabilir, bu bir tel veya yukarı çeken veri yolu, bu yüzden orada uygulanan her hile size yardımcı olabilir.
Wouter van Ooijen

Çok teşekkürler. Ne olduğunu görmek için otobüsü daha da yavaşlatmayı deneyeceğim. Sanırım nihayet bu çekmeli, açık drenajlı ve diğerlerinin aslında ne anlama geldiğini araştırmam ve anlamam gerekiyor. (Yazılım mühendisi burada!)
Shahbaz

1
Otobüse bir osiloskop koyun ve ne olduğunu kontrol edin. Yükselme süresi çok yavaş olabilir, ancak çalma da olabilir.
Wouter van Ooijen

4
  • MISO'yu master olarak Pull-up olarak ayarlayın ve
  • Her köle için MISO'yu Open-drain olarak ayarlayın.

Bunu denedim, ancak tek bir köle bile, bu yapılandırma çalışmıyor (osiloskop hatta sabit bir sıfır gösterir).

Çekme modunda ana g / Ç piminin eşdeğer direncinin ne olduğunu kontrol etmeniz gerekir.

Tipik olarak, çekme modu çok yüksek bir dirence sahiptir, belki 50 kOhms veya daha yüksektir. Pim, emi veya diğer gürültü nedeniyle aksaklıktan korumak veya çok yavaş kontrol sinyalleri için bir varsayılan ayarlamak ve aynı zamanda bunu yaparken çok fazla güç harcamamaktır.

Wouter'ın belirttiği gibi, bir açık tahliye veriyolunda hız, çekme direnci ile sınırlandırılır. Daha yüksek direnç değerleri veri yolunu yavaşlatır. I2C'deki (100 veya 400 kHz alan) tipik değerler 1 ila 5 kOhm'dur. Benzer bir hıza ulaşmak için benzer bir çekme direnci isteyeceksiniz.

Bu şemanın çalışması için master'ın i / o pin pull-up'ı yerine harici bir pull-up direnci (1 ila 5 kOhm veya daha fazla) kullanmanız gerektiğini düşünüyorum.


İpuçları için teşekkürler. Ben elektronik adam değilim, ama iş arkadaşımdan önerinizi gözden geçirmesini istemem gerekir. Kabloluya ihtiyacım var - ya da sadece programın ilk aşaması için ve normal aşamada pim pull-up olarak yapılandırılmamış. Bu nedenle muhtemelen harici direnç bir seçenek değildir.
Shahbaz

Ana mikro üzerinde bir adet ücretsiz i / o piminiz varsa, bunu 5 kOhm ile veri yoluna bağlayabilirsiniz. Daha sonra veriyolu numaralandırması sırasında yüksek ve normal iletişim sırasında yüksek-Z konumuna getirin.
Foton

1

Bir kablolu ve otobüsün çalışması için, otobüs üzerindeki düğümlerin açık tahliye olması gerekir, yani iletim yapmaları gerekir

  • kuvvetle aşağı çekerek mantığı düşük ve
  • otobüsün bağlantısını keserek mantığı yüksek.

Ayrıca, otobüs zayıf bir şekilde yukarı çekilmelidir.

Tek bir verici olmayan master ve tek bir verici slave ile gördüğünüz tuhaf davranış, ya güçlü bir şekilde yukarı çeken ya da zayıf bir şekilde aşağı çeken köle ile açıklanabilir.

Yukarıdakilerden hangisinin gerçekleştiğini belirlemeniz gerekir.

Slave'i yüksek empedans moduna getirin ve 10k direnç üzerinden veri yolunu toprağa bağlayın. Hat voltajı önemli ölçüde değişmezse, master güçlü bir şekilde yukarı çeker ve bunu düzeltmeniz gerekir. Aksi takdirde, aynı prosedürü slave ile yapın (bu kez direnci Vcc'ye bağlayın); hat voltajı önemli ölçüde yükselirse, slave zayıf bir şekilde aşağı çekiyor (düzeltin). Aksi takdirde, çevrenizdeki alandaki zaman alanı bozulmalarını arayın.


Elektronikteki cehaletimi affedin, ancak köle güçlü bir şekilde aşağı çekilirse, otobüs VE olarak hareket etmez mi? Yüksek olan kölelerin bağlantısı kesildiğinden ve düşük olanların aşağı çekildiğinden, genel sonuç düştüğünden, değil mi?
Shahbaz

@Shahbaz, kötüm, tabii ki otobüs kablolanacak ve cevabı düzelttim. Kablolu istiyorsanız - veya sadece kutupları ters çevirin (master zayıfça aşağı çekin, köleler güçlü bir şekilde yukarı çeker).
avakar

Vikipedi'de okuduğumda, bunu kablolu ve / veya kablolu-veya negatif-gerçek mantıkla ifade ettiklerini fark ettim.
Shahbaz

1

Otobüste pasif bir pull-up veya aşağı çekme (pull-up olduğunu varsayacağım) ve söyleyecek bir şey olduğunda otobüse aktif olarak (yüksek sürüş ve düşük sürüş) sahip olmak öneririm. . Bir adresi ve bir maskeyi alan ve her slave'e, adresi ve maskeyi sevip sevmediğine bağlı olarak 00 çıktısını vermesini veya hiçbir şey yapmamasını (çıkışını yüzmeye devam etmesini) bildiren sorgu-adres komutlarına sahip olun. Mümkünse, efendiler köleler sürmeye başlamadan önce bir süre aktif olarak otobüse binsin. Çekme kuvvetine ve master'ın veri yolunu yüksek sürüp sürmediğine bağlı olarak, kölelerin düşük çekmesine izin verilmeden önce, kurulum aşamasında veri yolu hızını sınırlamak gerekebilir. Diğer yandan, kurulum tamamlandığında,


İki köle aktif olarak yüksek ve alçak sürüyorsa, otobüsten ne okumam bekleniyor?
Shahbaz

Birinin bir köle yüksek sürmeye çalışırken diğerinin düşük sürmeye çalışmasından kaçınmalıdır. Bir köle otobüse binmelidir (1) bunun tek şey olacağını biliyorsa veya (2) bunun ve otobüsü kullanan herkesin pasif rölantinin tersine gideceğini bildiğinde durum.
supercat

Peki bu ne anlama geliyor? ... seçilen her köle aktif olarak hem yüksek hem de düşük seviyeleri sürmek otobüsün izin verir ...
Shahbaz

@Shahbaz: Bir köle söyleyecek bir şey olduğunda, "1" bit iletmek için aktif olarak otobüsü yüksek ve "0" bit iletmek için düşük sürmelidir. Bir köle söyleyecek bir şey olmadığında, otobüsü hiç sürmemelidir. Kölelerin "1" bitleri göndermek istediklerinde aktif olarak otobüsü yüksek sürdüğüne dikkat edin, otobüsün, otobüsü yükseğe sürmek için pasif bir çekişe dayanacağından çok daha hızlı çalışmasına izin verir.
supercat

@Shahbaz: Supercat söylemeye çalıştığı şey, numaralandırma durumunda bir direncin hattı çekmesi ve kölelerin sadece "0" ya da hiçbir şey (açık drenaj çıkışı) göndermesi, ancak normal iletişimde, sadece bir tek slave aynı anda aktif olmalı ve aktif slave "0" veya "1" (normal çıktı) göndermelidir. Böylece, çekme direnci ve hat kapasitansı sadece numaralandırma sırasında bit hızını sınırlar. Daha sonra, normal iletişimde, aktif sürüşün izin verdiği gibi bit hızı daha yüksek olabilir.
Laszlo Valko
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.