非標準シリアル信号を効率的にデコードする方法


11

私は、RF送信ASICと、最終的にPCにデータを送信する必要があるワイヤレスレシーバーを含むプロジェクトに取り組んでいる研究チームの学部生です。

レシーバーは高速、連続、非同期、非標準のシリアル信号(SPI、I2C、UARTなどではない)を出力するので、私の仕事は、レシーバーをコンピューターに接続するマイクロコントローラーソフトウェアを作成することです。現在の私のアプローチは、エッジトリガー割り込みを使用してデータを循環バッファーに配置し、メインループでビットごとのデコードプロセス全体を実行することです。マイクロコントローラーは、USB(仮想COMポート)を使用してこのデータを同時にコンピューターに出力する必要があります。

これが私が抱えている問題であり、私が予期している問題の1つです。

  1. 非常に強力な72 MHz ARM Cortex M3プロセッサを使用しても、バッファリングされたデータを十分に速く処理できません。ビットレートは400 Kbps(2.5 us /ビット)です。参考までに、ビットあたり180サイクルしか残しません(デコードとISRを含み、オーバーヘッドは30サイクルまで!)。MCUは、メインループでポーリングする他の多くのタスクも処理する必要があります。

  2. USB仮想COMポートドライバーも割り込みベースです。これにより、ドライバーが最終的にプロセッサに長い間中断され、ビットが送信される可能性のある2.5マイクロ秒(180サイクル)のウィンドウを見逃すことになります。このような割り込みの競合/競合が通常はどのように解決されるのかわかりません。

だから問題は単純に、これらの問題を解決するために何ができるのか、これはまったく正しいアプローチではないのですか?私は、ソフトウェア中心のアプローチを少なくすることも検討します。たとえば、デコード用に何らかの種類のハードウェアステートマシンを備えた専用のUSBチップを使用しますが、これはなじみのない領域です。


私が言わなければならないことは、私が回答したい多くの提案がすぐにあなたの質問によく話すことを私が見るのはまれであることです。データバーストについて詳しく知りたいです。それらは突発的で、突然フルスピードになり、その後データ量が少ない期間ですか、それとも継続的なデータで長期間に及ぶ可能性が高いですか?
Kortuk

ASICに電力が供給されている限り、データの継続的なストリームを送信します。まったく破裂しない。これは、コンピューターの読み出し機能を備えたリアルタイムの医療検知アプリケーションです。心電図を見たことがありますか?
キーガンジェイ

ここには非常に多くの素晴らしい答えがあります。割り込みの変更を含むソリューションと、専用のハードウェア/デジタルロジックを含むソリューションとの間に明確な違いがあることを確認しました。私がよく知っているFPGAやVerilogのようなものですが、まだ経験していないため、長期間保存する必要があります。短期的な@rocketmagnetsでは、割り込みを多用しない方法が適しています。単純なタスクをデジタルロジックに専念させ、真の計算のためにARMを節約する優雅さが好きです。将来的には、ARMのパワーがワイヤレスシリアルデータの分析とフィルタリングに使用されます。
Keegan Jay

信号は同期ですか、非同期ですか?
2012年

非同期。4スタートビット、10データビット、2ストップビット。送信しているASICの性質により、HIとLOの時間はチップごとに大きく異なります。ボーレートを推定するアルゴリズムはすでに書いています。
キーガンジェイ

回答:


5

別の答え:割り込みの使用を停止します。

人々は非常に簡単に割り込みを使用するためにジャンプします。個人的には、あなたが発見しているように、実際には多くの時間を浪費しているので、それらを使用することはほとんどありません。

多くの場合、すべてを非常に高速にポーリングするメインループを作成して、レイテンシが仕様の範囲内であり、無駄な時間がほとんどない可能性があります。

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

ループ内には、他のものよりもはるかに頻繁に発生するものがある可能性があります。たとえば、着信ビットの場合、その場合、それらのテストをさらに追加して、より多くのプロセッサがそのタスク専用になるようにします。

loop
{
    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (serial_byte_ready)
    {
        // decode serial data
    }

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (enough_serial_bytes_available)
    {
        // more decoding
    }        

    if (serial_bit_ready)
    {
        // shift serial bit into a byte
    }

    if (usb_queue_not_empty)
    {
        // handle USB data
    }        
}

このアプローチの待ち時間が長すぎるイベントが存在する可能性があります。たとえば、非常に正確なタイミングのイベントが必要になる場合があります。その場合は、割り込み時にそのイベントを実行し、ループ内に他のすべてを保持します。


他のRocketmagnetの人の答えよりもあなたの答えが好きです。Rocketmagnetは、より多くのハードウェア、より高速なハードウェアの代わりに、より少ない、より良い、よりシンプルなことを提案します。

さて、私は割り込みがソリューションをはるかに良くする多くのケースを見てきました。彼らは素晴らしいことをして、よく構造化されたコード、低いレイテンシと他の多くの利点を許します、しかし私はここであなたに同意しなければなりません。プロセスが非常に激しいようである1コントローラーは、シリアルストリームの処理にすべての注意を払う必要がある場合があります。デジタルフロントエンドは理想的に聞こえますが、多くの場合、学校のプロジェクトの場合、いくつかのマイクロがあり、FPGAがないため、マイクロを最初に処理することに専念し、後でFPGAに適合させて置き換えます。費用。
Kortuk

これはおそらく私が短期的に行くソリューションです。これは、既存のシリアルドライバーのかなりの部分を書き換える必要があるので、これを避けたいと思っていましたが、短期間で私の能力の範囲内にあるエレガントなソリューションです。
Keegan Jay

1
@JayKeegan-はい、それはおそらくソリューションへの最速のルートです。PSoCとFPGAは次のプロジェクトへのアプローチかもしれません。
Rocketmagnet

6

マイクロコントローラーの代わりにFPGAを使用して、ワイヤレスデータストリームをデコードおよびバッファリングすることができます。次に、ARMプロセッサを使用してFPGAバッファをフラッシュし(SPIインターフェイスを使用するなど)、コンテンツをUSB通信ポートに送信します。それは機能しますが、FPGAは、ハードウェアバッファーがオーバーランしないことを保証するのに十分な頻度でサービスを提供できる限り(または、プロトコルのより高いレベルでドロップされたデータを処理できる場合)、簡単に追いつくことができるはずです)。


これは、長期的には優れたソリューションになる可能性があります。ソフトウェアソリューションに加えて、多くのデジタルロジック/ハードウェアソリューションを受け取って欲しいと思っていました。残念ながらまだFPGAの経験はありません。
Keegan Jay

6

簡単:PSoC 5マイクロコントローラーを使用します。

PSoC

マイクロコントローラーは使いやすく、さらにCPLDが含まれているため、Verilogで独自のハードウェアペリフェラルを作成できます。シリアルデータデコーダーをVerilogで記述し、DMAを使用してUSBポートにストリーミングするだけです。

一方、強力な32ビットARMコアは、そのThumb命令をいじる可能性があります。


概要ページには、私の疑いを引き起こしたクロック周波数がリストされていません。データシートには40MHzと記載されています(6MHzで6mAも記録しました)。これはOPの現在の半分です。「MCUは他の多くのタスクも処理する必要がある」ので、これが良いアイデアかどうかは、それらが何であるかに依存する場合があります。
stevenvh

それらは67MHzまで上がります。したがって、OPの現在のプロセッサとほぼ同じ速度ですが、ほとんどの作業がハードウェアで行われるため、CPUの空き時間が大幅に増えます。
Rocketmagnet

1
すべてのデータシートを見たわけではありません。私が最初に選んだのは40MHzだと言った。
stevenvh

@stevenvh-スピードグレードが異なります。PNの3番目の数値はスピードグレードです。(4 = 48MHz、6 = 67MHz)。
Rocketmagnet

1
これは、FPGAのアイデアによく似た、長期的に見ても素晴らしいソリューションです。私はこのタイプのチップについて聞いたことがありませんが、それは私のボードの残りの部分の多くの機能を1つのチップにもたらします。将来的には、これはレシーバー全体がサムドライブのサイズに収まることを意味する可能性があります。これが私のプロジェクトリーダーのビジョンです。次のセメセターはVerilogです。
キーガンジェイ

4

私はあなたが作るために古典的なエンジニアリングの選択を持っていると思います:速く、安い、うまくいく:2つ選んでください。

@vicatcuのソリューションは確かに良いものですが、ハードウェアを追加できないか、追加しない場合(これにはより高速なプロセッサが含まれます)、選択する必要があります。このシリアルリンクが最も重要な場合は、すべてのビットが収集されるまでISRに座っておく必要があります。ビットあたり180の命令は実際にはまったく問題ありませんが、すべてを実行しようとしないでください。転送の開始を検出したら、転送が完了するまでスピンします。結果をFIFOに詰めてから、通常の処理を再開します。

各送信の長さは言いませんが、短くてバースト性がある場合、これは実行可能な解決策です。仮想COMポートの実装にはハードウェアバッファリングも含まれているので、そのための「遅延」割り込みサービスはそれほど問題にはならないはずです。MCUが実行する必要がある残りの部分については...設計上の決定を行う必要があります。


このソリューションは、ロケットマンのソフトウェアアプローチを補完して、割り込みベースのドライバーの数を減らします。私が述べたメインシリアルドライバーを割り込みベースとして維持することができます。また、ご指摘のとおり、フレーム全体が読み込まれるまで回転を試みます。
キーガンジェイ

3

まず第一に、私はここですでにいくつかの答えが好きで、いくつかは私の賛成票を獲得しています。

しかし、別の可能なソリューションを投入するためだけに:プロジェクトの制約を考えると、2番目のマイクロコントローラーを追加することは悪いことでしょう(それは別のボードの実行を伴うでしょうか)?多分、SPIのような高速ペリフェラルを介してCortex-M3に接続するシンプルな8ビットマイクロコントローラー。選択した8ビットコントローラーは、選択した回答と同じようにビットをポーリングしてバイトを形成しますが、バイトがある場合は、SPIデータレジスタにダンプして転送します。

cortex-M3側は、受信したSPIデータで単純に割り込みます。これにより、以前の400 KHz外部エッジトリガー割り込みが50 KHzに削減されます。

私がこれを提案している2つの理由は、他の方法(PSoCまたは追加されたFPGA)のいくつかが少し高価であるためです(ただし、これは少量の学術プロジェクトでは重要ではない可能性があります)、および現在のコードの構造。

それ以外は、PSoCのアイデアは、DMAを介してUSBに転送する独自のカスタムペリフェラルで素晴らしいと思います。


これは実際にこれを投稿することについて私が考えていた計画です。割り込み(選択した回答)への依存を減らすことでソフトウェアを合理化できない場合は、これが確実に私がすることです。しかし、はい、それは私が最初に私のデザインを正しいものにするのが苦手なため、おそらく2回のボードランが必要になります。
Keegan Jay

@JayKeegan、ハハ、クラブへようこそ!
Jon L

2

データ形式がUARTの形式に似ているが、まだ予測できないボーレートの場合、CPLDを使用して入力データのすべてのワードをSPIまたは標準非同期形式に変換する傾向があります。CPLDの領域に完全に押し込む必要はないと思います。実際、ディスクリートロジックでもほぼ機能する場合があります。必要なデータレートの5倍を超えるsmidginであるクロックを生成できる場合は、いくつかのゲートを備えた5分周および16分周カウンターを使用できます。5分周カウンターを調整して、入力がアイドルで16分周カウンターがゼロになるとリセットされるようにします。それ以外の場合は、SPIクロックパルスを生成し、5で除算カウンターが2にヒットするたびに16で除算カウンターをバンプします。

5倍のクロックがあれば、16V8(現在入手可能な最小かつ最も安価なプログラマブルロジックデバイス)を使用してSPIクロックを生成できます。2番目の16V8または22V10は、5xクロックを生成するフラクショナルレートディバイダーとして使用できます。または、少し大きいチップ(CPLD)を使用してすべてを1つに実行することもできます。

編集/補遺

さらに検討すると、CPLDを使用する場合、回路にいくつかの拡張機能を簡単に追加できます。たとえば、少なくとも1.5ビット時間のストップビットとそれに続く3.5ビット時間のスタートビットを受信するまで、回路をストールさせるロジックをかなり簡単に追加できます。短すぎるスタートビットを受信した場合は、ストップビットの検索に戻る必要があります。また、SPIを使用している場合は、/ CS信号を使用して、受信デバイスが正しくフレーム化されたデータを確実に認識するようにすることができます。SPIデータを受信するデバイスが10ビットフレームを処理できる場合、そのようなフレームを直接送信できます。それ以外の場合、各10ビットフレームは、LSBが設定された8ビットフレーム(7ビットのデータ)、およびすべてのLSBがクリアされたフレーム(3ビットのデータ)として送信できます。SPIクロックはストップビット中に加速されるため、すべてのデータが送信されます。

一部のマイクロコントローラーは、外部信号によってリセット状態に保持され、そのような信号のリリースにタイミングを同期させる機能などを含む、かなり用途の広いPWM生成モジュールを備えています。マイクロコントローラーがそれを実行できる場合、その正確な機能によっては、CPLDまたはタイミング生成回路を大幅に簡略化する可能性があります。

Rocketmagnetがいくらか触れたもう1つのアプローチは、シリアルデータをデコードしてメインマイクロで使用できる形式に変換することを唯一の目的とする小さなマイクロを使用することです。ソフトウェアのデコードでは400KHzのデータレートはかなり高速ですが、PICのようなものは、同時に他に何もする必要がない場合でも処理できます。使い慣れたデバイスによっては、CPLDを使用するよりも簡単または難しい場合があります。


これはすべて、デコード用のデジタルロジックを設計するときに非常に役立ちます。確かにSPIとして出力します。とりあえず、スタンドアロンMCU(時間制約)を使用してデコードを行っています。ありがとうございました!
キーガンジェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.