複数のuartインターフェイスを取得する方法


30

OK、1つのuartインターフェイス(TXD GPIO 14、RXD GPIO 15)があります。少なくとももう1つのuartインターフェイスが必要です。

可能な解決策:

  • ビットバンギング:2つの無関係なスペアGPIOを使用します。標準のLinuxではタイミングが問題であることを理解しています。非常に低いボーレートで信頼性がありますか?

  • 切り替え:RPIは、いつどのデバイスと通信するかを決定します。CD4066BCなどを使用します。

  • spi to 2 x uart bridge:適切な部品が見つかりませんでした(可用性、価格、dilパッケージ)

  • usbからuart:高価

他のオプションはありますか?できるなら、私は切り替えたいと思っています。何をアドバイスしますか?


回答:


10

FTDIなどのUSB UARTはそれほど高価ではありません。他のすべてのオプションは、コストがかかるかもしれない〜$ 13よりも部品と時間のコストが高く、信頼性が低いか遅いように聞こえます。次のような高速でトラブルのないオプションを選択してください。

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

Sparkfunも販売しています。実際、古いUSBデバイスから1つを抜くか、それが何をするのかわからないジャンクストアから購入することができます。

ArduinoプロジェクトのSPI-UARTアダプターを台無しにしたため、既存のライブラリがなかったため、独自に作成しました。最終的には問題なく動作しましたが、もし私がたった15ドルの部品を落とすことができたなら、持っていたでしょう。実際、費用がかかったので、4つのシリアルポートを備えたメガが必要でした。

あるいは、多数のシリアルポートが必要な場合は、RS485シリアルを参照できます。RS485シリアルは、マルチドロップをサポートする232(互換性はありませんが)に似ています。


1
これは、ソフトウェアの観点からも簡単なオプションです。FTDIには、すぐに使用できるLinuxドライバーがサポートされています。他のすべてのオプションでは、骨の折れるドライバー作業が必要になります。
BERを計算

cp2102は私のお気に入りのusb uartチップです。アマゾンで簡単に検索すると、ケーブルが含まれていると、$ 6.99(実際には$ 1.50を編集)で表示されます!それに勝てない!
portforwardpodcast

6

余分なハードウェアの追加をスキップして、ビットバンギングのルートに進むことにした場合、これは想像するほど難しくありません。

最初に、通信スレッドはリアルタイムに移行する必要があります。

#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;
}

これからは、スレッドがタイムリーに(、またはを介して)喜んで制御を返さない限り、スレッドは毎秒*から950ミリ秒間先取りされません。850MHz CPUを使用すると、ビットバンギングループは、最速であってもほとんどの時間アイドル状態になります。sched_yield()usleep()

残念ながら、時々、制御を返すという要件は、「相手」が送信したものが何であれ、スレッドがスリープしている間、永久に失われることを意味します。しかし、そのためにトランスミッションコントロールを使用できます。降伏する前にプルダウンし、制御を復元するときにバックアップするCTS回線にさらにGPIOを割り当てます。

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

または(できれば)XON / XOFF伝送制御を使用する-スリープする前にRS232でXOFF文字を送信し、操作を再開した後にXONを送信します。これらのデフォルトのASCIIコードは'\x13'、XOFF /「送信停止」および'\x11'XON /「送信再開」用です。

もちろん、リモートデバイスはこれらに従う必要があります。そうでない場合、一部のデータが失われます。


4

私が探しているのは、UART / IrDA / GPIOブリッジへのI2C / SPIスレーブです。

シングルバージョンとデュアルバージョンがあります(1つまたは2つの追加のUART)。それら(NXP)も(必要に応じて反対側に)UART / IrDA / GPIOブリッジへのI2C / SPIマスターを持っています。

詳細については、これらのチップについては見つけることができるここマスター対応。

マキシムには、まったく同じことを行うチップもあります


良い情報ですが、NXPリンクはここでHTTP 403を提供します。
トム

関連データシートは次のとおりです。nxp.com / documents / data_sheet / SC16IS752_SC16IS762.pdf
トム

3

USB-UARTブリッジは安価ですぐに入手できますが、タイミング特性が非常に劣っています。Newarkは、ベアメタルコードを記述できるSTM32F ARMプロセッサを搭載した「Embedded Pi」ボードを販売しています。そのチップには3つのUARTが搭載されており、かなり高速に動作できると思います。1つを使用してRaspberry Piと通信する場合、2つを他の目的に使用できます。免責事項:これらのボードの1つを購入しましたが、まだI / Oのニーズに直接対応するためにRaspberry Pi自体を使用しています。

多くの低速なUARTが必要な場合、特にArmアセンブリ言語を作成する場合は、Embedded Piボード上のSTM32Fがおそらくかなりの数を処理できます。単一のボードに16個のI / Oピンのグループが2つある場合、16個の同時ソフトウェアUARTをすべてかなりのボーレートで同時に動作させることが可能です(格納するボーレートの3倍または5倍の周期的な割り込み受信ポートからバッファへの16ビットラッチ値、およびバッファから送信ポートへの16ビットの事前計算値の出力。これを行う場合、ソフトウェアUARTの平均サービス時間が長すぎなければ、ワーストケースヒットが時々発生するかどうかは関係ありません(たとえば、16個のポートすべてが同時にバイトを受信するなど)。

「一般的なケース」コードは個々のUARTを調べる必要さえないので、このアプローチは実際に受信に対して非常に効率的に機能します。5xでデータをサンプリングしており、バッファーの最後の47バイトがその直前に複製されているとします。データが昇順でバッファに書き込まれると仮定すると、次のように言うだけで、16個のチャネルのいずれかでバイトが完全に受信されたかどうかを確認できます。

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

場合はbytes_readyゼロで、データは受信していません。そうではなく、たとえばビット2 bytes_readyが設定されている場合、受信データバイトがdata [rx_ptr-40]、data [rx_ptr-35]、data [rx_ptr-30]などのビット2で見つかる可能性があることを意味します。データ、armed_flagのビット2をクリアし、約44サンプル後にリセットされるように調整します。

このアプローチでは、1バイトのデータが完全に受信されるサンプルで少し作業が必要になります(16チャネルすべてに1バイトのデータが一度に到着した場合、潜在的に多くの作業が必要になります)。わずか。64個のI / Oピンがある場合、「一般的な」ケースに余分な作業を追加することなく、このアプローチを使用して最大32個のUARTを処理できます。


1

Picaxeなどのマイクロコントローラーは、1つのピンでシリアルデータを取得し、特定のピンでシリアルデータを適切に出力できます。これにより、出力するピンをPicaxeに伝える必要がある場合、より多くのシリアル出力が効果的に得られます。同じことを行うこともできますが、逆の場合、複数のデバイスからシリアルデータを受信し、Raspberry Piに送信できます。別のオプションは、接続されたデバイスに修飾子を要求させることです。つまり、デバイス1は、たとえばシリアルラインでさらにデータをリッスンする前に、データ「d1」を受信する必要があります。デバイス2は、修飾子として「d2」を持つことができます。つまり、デバイス1に「hello」と言うには、UART行で「d1hello」を送信するだけで済みます。

Picaxesはかなり安価です。http: //www.techsupplies.co.uk/で入手できます。また、ピンの数が異なるなど、さまざまなサイズがあります。


1

複数のUARTスレーブデバイスとの通信を並行して行う必要がない場合は、1つの使用可能なUARTポートをデバイス間で共有できます。トランジスタを使用して、現在通信したいデバイスへのRxD / TxD接続のみを有効にすることができます。これらのトランジスタは、他のRaspberry Pi GPIOピンで制御できます。


1

Raspberry Pi 4は、デバイスツリーオーバーレイを使用して有効にする必要がある最大4つのUARTインターフェイスをサポートします。これを行う方法と、現在使用されているピンをここで見つけることができます。

https://www.raspberrypi.org/forums/viewtopic.php?t=244827

RPi財団はまだこのためのドキュメントを準備しています。



0

SPI to 2xUARTコンバーターであるSC16IS752 ICを使用しています。Raspbian Stretchでうまく機能します。

FTDIチップよりも少し高価ですが、2つあり、貴重なUSBポートを使用する必要はありません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.