Birden fazla uart arayüzü nasıl elde edilir


30

Tamam, bir uart arayüzüm var (TXD GPIO 14, RXD GPIO 15). En az bir tane daha uart arayüzü istiyorum.

Olası çözümler:

  • Bit vuruş: İlişkisiz iki yedek GPIO kullanın. Zamanlamanın standart bir linux üzerinde bir sorun olduğunu biliyorum. Çok düşük baudrate ile güvenilir midir?

  • Anahtarlama: RPI hangi cihazla ne zaman konuşacağınıza karar verir. Örneğin, CD4066BC .

  • 2 x uart köprüye spi: Uygun bir parça bulamadınız mı (uygunluk, fiyat, dil paketi)

  • uart için usb: Pahalı

Başka seçenekler var mı? Yapılabilirse, geçiş yapmaya meyilliyim. Ne tavsiye edersin?


Yanıtlar:


10

FTDI gibi bir USB UART gerçekten pahalı değil. Diğer tüm seçenekleriniz, size harcayabilecekleri ~ 13 dolardan daha fazla parça ve zaman harcayacakları ve güvenilmez veya yavaş olacak gibi gözüküyorlar. Sadece hızlı ve sorunsuz bir seçenek için gidin:

http://www.dfrobot.com/index.php?route=product/product&product_id=147#.UOamLG-sh8E

Sparkfun da bir tane satıyor. Aslında, belki eski bir USB cihazından birini çıkarabilir ya da ne yaptığını bilmeyen bir mağazadan satın alabilirsiniz.

Bir Arduino projesi için bir SPI-UART adaptörü ile uğraştım, kendime ait bir kütüphane yoktu. Sonunda tamam çalıştı, ama ben sadece 15 $ bir kısmı düşmüş olabilirdi. Aslında bana mal olduğu zaman verilen 4 seri port ile sadece bir mega almalıydım.

Alternatif olarak, çok sayıda seri bağlantı noktası istiyorsanız, RS485 serisine bakabilirsiniz; bu, 232'ye (uyumlu olmasa da) benzerdir;


1
Bu aynı zamanda yazılım bakış açısıyla seçeneği kolaylaştırır. FTDI kutudan Linux sürücü desteğine sahiptir. Diğer tüm seçenek, özenli sürücü çalışması gerektirecektir.
Ber

CP2102 benim favori usb uart çipimdir. Hızlı bir amazon araması, bir kabloyla birlikte $ 6,99 (aslında 1,50 $ düzenlemeyi) için bunları ortaya koyuyor! Bunu yenemezsin!
portforwardpodcast

6

Ekstra donanım eklemeyi atlamaya karar verirseniz ve sadece bit-lanet rotaya giderseniz, bu bazı resimler kadar zor değildir.

Öncelikle, iletişim dizinizin gerçek zamanlı olması gerekir:

#include<sched.h>

struct sched_param param;               
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
if( sched_setscheduler( 0, SCHED_FIFO, &param ) == -1 )
{
        perror("sched_setscheduler");
        return -1;
}

Şu andan itibaren, ipliğiniz her saniyenin 950ms uzağında engellenmeyecek * , kontrolü zamanında istemediği sürece (hiçbir zaman sched_yield()veya hiçbir zaman usleep()), önceden hiç boşaltılmayacak. 850MHz CPU ile bit-vuruş döngüsünüz, en yüksek hızlarda bile çoğu zaman boşta çalışacaktır.

Maalesef, zaman zaman kontrolü iade etme zorunluluğu, “karşı tarafınız” ne gönderirse göndersin, ipliğiniz uyurken sonsuza dek kaybolacaksınız demektir. Ancak bu amaçla iletim kontrolünü kullanabilirsiniz. Her ikisini de vermeden önce indirdiğiniz ve kontrolü geri yükledikten sonra geri çekeceğiniz CTS hattı için biraz daha GPIO tahsis edin:

  bcm2835_gpio_write(CTS_PIN, LOW);
  usleep(10);
  bcm2835_gpio_write(CTS_PIN, HIGH);

veya (IMHO tercihen), XON / XOFF iletim kontrolünü kullanın - XOFF karakterini uyumadan önce, çalışmaya devam ettikten sonra XON'dan RS232'ye gönderin. Bunlar için varsayılan ASCII kodları, '\x13'XOFF / "göndermeyi durdur" ve '\x11'XON / "göndermeye devam et" içindir.

Tabii ki uzaktaki cihazınız bunlara uymalıdır. Olmazsa, bazı veriler kaybolacak.


4

Aradığınızı buldum: UART / IrDA / GPIO köprüsüne bir I2C / SPI kölesi.

Tek ve çift versiyonlu olarak geliyorlar (yani 1 veya 2 ekstra UART). Ayrıca (NXP) de (gerektiğinde diğer taraf için) UART / IrDA / GPIO köprülerinde I2C / SPI master'ı bulunur.

Daha fazla bilgi Bu çiplerle ilgili bulunabilir burada ve usta muadili.

Maxim’de de aynı şeyi yapan cipsler var.


İyi bilgi, ancak NXP bağlantıları burada HTTP 403'ü veriyor.
Tom


3

USB'den UART'a köprüler ucuz ve kolayca temin edilebilir, ancak gerçekten kötü zamanlama özelliklerine sahiptir. Newark, üzerine metal kod yazabileceğiniz bir STM32F ARM işlemciye sahip bir "Gömülü Pi" kartı satıyor. Bu çipte üç tane UART var ve bence oldukça hızlı gidebilirler; Ahududu Pi ile iletişim kurmak için bir tane kullanacak olsaydınız, bu iki kişiyi başka amaçlar için hazır bırakır. Feragatname: Bu panolardan birini satın aldım, ancak henüz basitçe doğrudan G / Ç gereksinimlerini karşılamak için Raspberry Pi'nin kendisini kullandım.

Çok daha yavaş UART'lar istiyorsanız, Gömülü Pi kartındaki STM32F, özellikle de bazı Arm assembly dili yazmaya istekliyseniz, muhtemelen makul bir rakamı kullanabilir. Tek bir kartta iki grup 16 G / Ç pimi varsa, aynı anda 16 UART'ın bir kerede oldukça iyi bir baud hızında çalıştığı UART'lara sahip olmak mümkün olabilir (3x veya 5x'te saklanan baud hızında periyodik olarak kesme olabilir) Alıcı porttan bir tampon belleğe 16 bitlik mandallanmış değerler ve tampondan iletim portuna 16 bitlik önceden hesaplanmış değerler verir, eğer bunu yaparsanız, o zaman UART yazılımı için ortalama servis süresi çok iyi olmaz. Arada bir en kötü durum isabetinin gerçekleşip gerçekleşmeyeceği önemli değildir (örneğin, on altı portun tümü aynı anda bayt alır).

"Ortak durum" kodunun bireysel UART'lara bakması gerekmediğinden, bu yaklaşım almak için oldukça etkili bir şekilde çalışabilir. Verileri 5x örnekleme yaptığınızı ve arabelleğin son 47 baytının hemen önce çoğaltıldığını varsayalım. Verilerin arabelleğe artan sırada yazıldığını varsayarsak, şunu söyleyerek 16 kanaldan herhangi birinde herhangi bir baytın tam olarak alındığını kontrol edebilirsiniz:

bytes_ready = (armed_flag & data[rxptr] & ~data[rxptr-47] & ~data[rxptr-46] & ~data[rxptr-45] & ~data[rx_ptr-44]);

Eğer bytes_readysıfırdır, hiçbir veri alındı. Aksi taktirde, örneğin bit 2'si bytes_readyayarlanmışsa, bu, alınan veri baytının veri bit 2'sinde [rx_ptr-40], veri [rx_ptr-35], veri [rx_ptr-30], vb. Bulunabileceği anlamına gelir. Veriler, armed_flag'ın bit 2'sini temizleyin ve yaklaşık 44 örnekten sonra yeniden ayarlanmasını ayarlayın.

Bu yaklaşım, bir bayt verisinin tamamen alındığı örnekler üzerinde biraz çalışmayı gerektirir (ve 16 kanalın hepsinde bir bayt verisinin bir defada gelmesi durumunda potansiyel olarak çok fazla çalışma), ancak çoğu numunede iş miktarı çok fazla olacaktır. hafif. Birinin 64 G / Ç iğnesi varsa, bu yaklaşımı kullanarak "ortak" duruma herhangi bir ek çalışma yapmadan 32'ye kadar UART işleyebilir.


1

Picaxe gibi bir mikrodenetleyici bir pin üzerinde seri veri alabilir ve seri verilerini belirli bir pin üzerinde uygun bir şekilde alabilir. Picaxe'a hangi pimin çıkacağını söylemeye hazır olsaydınız, bu size daha fazla seri çıktı verir. Ayrıca aynı şeyi yapabilirdi ancak tersi de, birden fazla cihazdan seri veri alıp Raspberry Pi'ye gönderebilirdi. Başka bir seçenek bağlı cihazların niteleyici gerektirmesi olabilir . Bu, Cihaz 1'in 'd1' verilerini, örneğin seri hattaki diğer verileri dinlemeden önce alması gerektiği anlamına gelir. Cihaz 2, niteleyicisi olarak 'd2'ye sahip olabilir. Bu, Cihaz 1'e 'merhaba' demek için, UART hattına 'd1hello' göndermeniz gerektiği anlamına gelir.

Pikaxlar oldukça ucuzdur, onları http://www.techsupplies.co.uk/ adresinden edinebilirsiniz ve farklı pimler ve sayılarla sayısız boyutta gelirler.


1

Birkaç UART slave cihazıyla iletişimin paralel olarak gerçekleşmesi gerekmiyorsa, mevcut bir UART portunu aralarında paylaşabilirsiniz. Konuşmak istediğiniz cihaza yalnızca RxD / TxD bağlantılarını etkinleştirmek için transistörleri kullanabilirsiniz. Bu transistörler, diğer Ahududu Pi GPIO pinleri tarafından kontrol edilebilir.




0

2xUART çevirici SPI olan SC16IS752 IC kullanıyorum. Raspbian Stretch ile iyi çalışıyor.

FTDI çipinden biraz daha pahalı, ama iki tane var ve değerli USB bağlantı noktasını kullanmak zorunda değilim.


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.