ソフトウェアでCANプロトコルレイヤーを実装する


12

バックグラウンド

私は、以下の控えめなマイクロコントローラー仕様を必要とするプロジェクトを開発しています。

  • 8個の12ビット、10kHz ADC
  • 1kBのRAM
  • 48-QFN以下のフットプリント
  • 20kbpsのデイジーチェーン可能な耐ノイズおよびエラー修正通信プロトコル

信号処理の要件はかなり低く、ほとんどはシステムのマスタープロセッサにエクスポートできます。最初の3つの仕様は簡単に満たすことができ、2ドル未満で行うことができます。ただし、通信は非常に電気的にノイズの多い環境で行われるため、LINやI2Cなどのノイズの影響を受けやすいネットワークは存在しません。LINに対するもう1つの議論は、5Vまたは3.3Vですべてを実行したいということです。LINトランシーバーには12Vが必要なので、センサーボードごとに追加のレギュレーターまたはワイヤが必要になります。私は最初にこのタスクにCANを選択しました。ただし、CANコントローラーにはかなりのコストがかかるため、これをソフトウェアで実行できるかどうか興味があります。

CAN物理層

CAN仕様は、OSIネットワーク参照モデルのデータリンク層と物理層を定義しています。NXP TJA1040 / 50Maxim MAX3058 / 59Microchip MCP2551TI SN65HVD1050などの多くの安価な8ピンIC が物理層を実装するために存在します。D / Aコンバーターまたはオペアンプで物理層を実装することは、不可能ではないにしても困難であるため、これらのICは1ドル程度の価値があり、コストがかかります。

CANデータリンク/プロトコルレイヤー

データリンクレイヤーの場合、一部のマイクロコントローラーは、基本的なUART、I2C、およびSPI通信レイヤーにCANプロトコルモジュールを追加します。ただし、これらは基本的なチップよりもかなり高価です。

CANプロトコルモジュールのコストの調査

この主張を実証するために、CANバージョンと非CANバージョンの人気のあるマイクロをいくつか紹介します。

  • ATmega16-ATMEGA16M1(CAN付き):$ 3.87、ATMEGA168A(CANなし):$ 3.23
  • dsPIC-DSPIC33FJ64MC802(CAN付き):6.14ドル、DSPIC33FJ64GP202(CANなし):$ 5.48
  • PIC18-PIC18F2480(CAN付き):6.80ドル、PIC18F24J10(CANなし):2.10ドル
  • Cortex-M3-STM32F103C4T6A(CAN付き):$ 6.50、STM32F100C4T6B(CANなし):$ 2.73

公平を期すために、同等のメモリサイズのマイクロコントローラのみを比較しましたが、多くの非CANバージョンは、より少ないメモリサイズでより少ないコストで利用できます。Microchip MCP2515のような外部CANコントローラーはほぼ2ドルなので、オプションがあればCANをマイクロコントローラーに統合する方が明らかに費用対効果が高くなります。

興味深いことに、ATmegaパーツは、Digikeyの在庫の中で最も安いCAN装備パーツです。

CANプロトコル層の機能

dsPICマイクロコントローラーにあるCANモジュールは次のことを行います。

CANバスモジュールは、プロトコルエンジンとメッセージのバッファリング/制御で構成されています。CANプロトコルエンジンは、CANバスでメッセージを送受信するためのすべての機能を処理します。メッセージは、最初に適切なデータレジスタをロードすることにより送信されます。ステータスとエラーは、適切なレジスタを読み取ることで確認できます。CANバスで検出されたメッセージはエラーがチェックされ、フィルターと照合されて受信レジスタの1つに受信および保存されるかどうかが確認されます。

これはソフトウェアでかなり実行可能と思われます。

質問

ソフトウェアプロトコルレイヤーを使用して、安価なUARTを備えたマイクロコントローラーとCANトランシーバーのみでCAN仕様を実装できますか?もしそうなら、オープンソースの実装は存在しますか?

または、CANトランシーバーをUARTで使用してカスタムプロトコルを実装できますか?シングルマスタートポロジでも構いません。カスタムプロトコルでは、調停を正しく行うことが難しいことを理解しています。


CANは自動車用に開発されたため、12vもあります。
ケニー

@Kenny-上記のトランシーバーで使用される電圧レベルは5Vです。
ケビンフェルメール

STM32Fシリーズを検討する場合、このNXPパーツもお勧めしますか?Cortex-M0コアです。search.digikey.com/scripts/DkSearch/...
ジョン・L

@Jon-これらは必ずしも考慮されていなかったため、M0はこのユースケースに理想的です-ただし、Nuvonton M052LANの部品もCortex-M0であり、数量の約半分($ 1.21対$ 2.35)ですが、 CANモジュールはありません。そのような価格差が私の動機です。
ケビンフェルメール

運用上の評価も検討してください。CANをサポートするほとんどの部品は、非CANバリアントでは産業用または自動車用と商用用になります。
マーク

回答:


11

CANプロトコルをファームウェアに実装することは困難であり、正しくなるまで時間がかかると思います。良い考えではありません。

ただし、価格は高いです。私が調べたところ、QFNパッケージのdsPIC 33FJ64GP802は、1000個のマイクロチップダイレクトで3.68米ドルで販売されています。実際の生産量では価格は低くなります。

ハードウェアCAN周辺機器はあなたのためにいくつかの本当のことをします、そしてそれのための価格の増加はあなたが主張しているもののどこにもありません。

追加:

ファームウェアのルートを試してみようと決心しているように見えるので、ここに浮かぶ明らかな問題をいくつか紹介します。私にはまだ発生していない他の問題が発生する可能性が高いでしょう。

20 kbit / sでCANを実行したい場合。これはCANにとって非常に遅い速度で、少なくとも数十メートルで1Mbit / sに達します。1つのデータポイントを提供するために、NMEA 2000の船上信号規格は200 kbit / sでCANに階層化されており、これは大型船の一方の端からもう一方の端に移動することを意図しています。

必要なのはビットごとに1つの割り込みだけで、その割り込みで必要なことはすべて行えると考えるかもしれません。各CANビットタイムでいくつかのことが行われているため、これは機能しません。特に2つのことをサブビットレベルで行う必要があります。1つ目は衝突の検出で、2つ目はビットレートのオンザフライ調整です。

CANバスには、劣性と支配的な2つの信号状態があります。劣性は、何もバスを運転していないときに起こることです。両方のラインは、合計で60Ω引き寄せられます。MCP2551のような一般的なチップによって実装される通常のCANバスには、両端に120Ωのターミネーターが必要です。したがって、合計60Ωが2つの差動ラインを受動的に引き合わせます。支配的な状態は、両方のラインがアクティブに引き離されたときです。私が正しく覚えていれば、リセッシブ状態から約900mVです。基本的に、これはオープンコレクターバスに似ていますが、差動ペアで実装されている点が異なります。CANH-CANL <900mVの場合、バスはリセッシブ状態にあり、CANH-CANL> 900mVの場合、バスは支配的です。ドミナント状態は0、リセッシブ状態は1です。

ノードがバスに1を「書き込む」たびに(他のノードに送信する)、他のノードが0を書き込むかどうかを確認します。現在送信しているビットは1であり、他の誰かも送信していることを意味します。衝突は2人の送信者が同意しない場合にのみ重要であり、ルールは劣性状態を送信する送信者がメッセージを中止して中止することです。ドミナント状態を送信するノードは、これが発生したことすら知りません。これがCANバスでの調停の仕組みです。

CANバスの仲裁規則は、他の誰かが0を送信していないことを確認するために、1として送信しているすべてのビットを介してバスを途中で監視する必要があることを意味します。 、およびCANバス長の基本的な制限です。ビットレートが遅いほど、バスの一方の端からもう一方の端への最悪の場合の伝搬時間が長くなるため、バスを長くすることができます。このチェックは、バスを所有し、1ビットを送信していると思われる箇所ごとに実行する必要があります。

もう1つの問題は、ビットレートの調整です。バス上のすべてのノードは、ビットレートについて、RS-232よりも厳密に同意する必要があります。小さなクロック差が重大なエラーに蓄積するのを防ぐために、各ノードは公称より少し長いか短いビットを実行できる必要があります。ハードウェアでは、ビットレートの約9倍から20倍の速度でクロックを実行することでこれを実装します。この高速クロックのサイクルは、時間クォンタムと呼ばれます。新しいビットの始まりが、あなたが彼らがいるべきだと思う場所に関してさまようことを検出する方法があります。その後、ハードウェア実装は、再同期するために1つの時間のクォンタムを少し追加またはスキップします。期待されるビット時間と実際に測定されたビット時間の間の位相のわずかな差に調整できる限り、これを実装できる他の方法があります。

いずれにせよ、これらのメカニズムでは、さまざまな時間にさまざまなことを少し以内に行う必要があります。この種のタイミングは、ファームウェアで非常に扱いにくくなるか、バスの実行が非常に遅くなる必要があります。20 kbit / sのファームウェアで時間量子システムを実装するとします。ビットあたり最低9個のタイムクォンタムでは、180 kHzの割り込みが必要です。それは確かにdsPIC 33Fのようなもので可能ですが、プロセッサのかなりの部分を使い果たします。40 MHzの最大命令レートでは、割り込みごとに222命令サイクルが得られます。すべてのチェックを行うのにそれほど時間はかかりませんが、おそらく50〜100サイクル、つまりプロセッサの25〜50%がCANに使用され、実行中の他のすべてを先取りする必要があることを意味します。これにより、これらのプロセッサが頻繁に実行する多くのアプリケーションが妨げられ、スイッチング電源またはモータードライバーのパルスごとの制御のように。1つおきの割り込みでの50〜100サイクルのレイテンシは、このようなチップで行った多くのことの完全なショーストッパーになります。

だからあなたは何とかCANをするためにお金を使うつもりです。そのための専用のハードウェア周辺機器ではない場合、より大きなプロセッサを使用してかなりのファームウェアオーバーヘッドを処理し、他のすべての予測不能で起こりうる大きな割り込みレイテンシを処理します。

次に、事前のエンジニアリングがあります。CAN周辺機器は機能します。あなたのコメントから、この周辺機器の追加費用は0.56ドルであるようです。それは私にとってお買い得のようです。非常に大量の製品を入手していない限り、CANをファームウェアのみに実装するのにかかるかなりの時間と費用を取り戻すことはできません。ボリュームがこれほど高い場合、これまで述べてきた価格はとにかく現実的ではなく、CANハードウェアを追加するための差はより低くなります。

私はこれが意味をなさないと本当に思っています。


私はあなたの意見を大切にしていますが、なぜ誰もこの問題を回避しようとしていないのか興味があります-すべてのプロジェクトにそれらの問題があります!私はそれを試してしまった場合にどうなるかをお知らせします。
ケビンフェルメール

1000個の量で、microchipdirectのdsPIC33FJ64GP202の価格は3.12ドルです-合計値の差は560ドルです!少なくとも試してみる価値はあります。など、製糸標準パッケージの量を気にすることなく、個々の作品のための番号を取得する方が簡単だったので、私は、各単にあたりの価格を引用した
ケビン・フェルメール

2
@Kevin、低価格は必ずしも高価格に比例するとは限りません。どれだけ多くのことを計画しているのかはわかりませんが、ファームウェアでCANを実行するためのエンジニアリングに560ドルはかかりません。あなたが遭遇する困難のいくつかを説明するために答えるかもしれません。
オリンラスロップ

WTF !? 答えにいくつか追加したところ、段落区切りのほとんどがなくなりました。私が入力した編集ウィンドウ内の空白行は間違いがありました。
オーリンラスロップ

1
答えは「はい」ですが、私はここでOlinに完全に同意します。私は実際にこの分野でフルタイムで働いています。dsPIC33FJ256チップを使用します。物事をビットバン手法で書くのに費やした時間は、ハードウェアがあなたのためにそれをし、あなたが車輪を再発明することのコスト上の利点を取り除きます。言うまでもなく、ハードウェアで他にやっていることは、物事の上に注意深く計画する必要があるでしょう。また、ISO14229やOSEK / Autosar NetworkManagementのニーズなど、他の高レベルのプロトコルを検討しているのでしょうか?
エリックM

2

PIC18F25K80を使用します。DSPを搭載していませんが、量は約2ドルです。これは、あなたが言及したPIC18F2480のほぼ直接の代替品です。おそらくMicrochipから移植されたCCSコンパイラとCAN用のソフトウェアスタックを使用します。それは私が必要とし、試したすべてのものにうまく機能します。


ECANを検索しませんでした。愚かなマイクロチップの名前ですが、次回はもっと詳しく読む必要があります!私が言ったように、私の信号処理のニーズは低いので、実際のDSPは必要ないと思います。
ケビンフェルメール

2

私がこれを読んでいるのなら、UARTといくつかの賢いファームウェアだけを使用してCAN機能をビットバッシュしたいようです。私を信じてください、これは決して機能しません-CANまたはCANopenの複雑さに関する良いテキストを読むことをお勧めします。このルートを下ることで、探しているコストの節約を根絶できます。

CANモジュールを備えたマイクロコントローラーを使用して余分な2ドルを渡すか、Modbus over RS-485などのUARTと互換性のある別のプロトコルについて考えましたか?


あなたはそれを正しく読んでいます。CANのベクタートレーニングブックレットを徹底的に読みました。すべてのメッセージがCRCの前処理を必要とするように見えますが、パケットの残りは同じである必要があり、受信ラインの競合をチェックし続ける必要があります。人々が考えているほど難しくはないように思えますが、あなたのアドバイスを考慮に入れます。
ケビンフェルメール

しかし、私はModbus over RS485のアイデアが好きです。これらのトランシーバーのほとんどは5V電源でもあるようです。RS232のような+/-入力電圧が必要だという印象を受けました。それを調べる必要があります。
ケビンフェルメール

ビットバンギングはほとんど確実に機能します!上記のOlinが言及しているように簡単ではありませんが、実行できます。私はPIC18FシリーズとdsPIC33シリーズマイクロの両方で個人的にそれを実現しました。PIC18Fソースを本当に見たい場合はアップロードできます。しかし、私が取り組んでいる商用プロジェクトの一部であるため、dsPICソースを提供することはできません。どちらの場合もMCP2551を使用し、LINコードも持っています。LINは...プロトコル層で少し簡単ですが、LINスケジュールを実装するのは少し難しいです
エリック・M

1
@EricM-ビットレートはどのくらいでしたか?また、ソフトウェアで完全なCAN仕様を実装できましたか?このためのPIC18Fコードが見たいです
Rocketmagnet

はい、多くの側面を処理するdsPICでECANモジュールを複製しないように、完全なCAN仕様を実装しました。PIC18の実装では、バスを完全な仕様以降にビットバンギングしました。このコードは、GPIOラインを使用するdsPICで動作します。数日後にコードへのリンクを更新します。
エリックM

0

また、PIC µCでCAN-Protocolをビットバンギングすることも考えています。EricMにご連絡ください。PIC18FまたはDSPicのコア周波数でどのビットレートが得られたか、少なくとも返信してください。THX!

一般的に:RS 485は主な問題の解決策ですが、そのプロトコルのすべてとして非全二重UART通信(ポイント2ポイント)でCAN(またはFlexRay)トランシーバーを使用することも可能です。 NRZコーディングを使用します。

しかし、UART / V24 / RS232では、全二重はほとんど詳細に考えずに使用されるため、アプリケーションのスーパーループまたはステートマシンに頭脳を置く必要があるかもしれません...

しかし、CANビットバンギングに戻ります:私は長年CANで働いていて、ビットバンギングの実装を見たことはありませんが、DSPicやARMなどの最新のµCで100kBitまでのビットタイミングで動作するはずです。 (80MHz以上のコアを持っている...)

少なくともリードバックのみが考慮される場合...送信は、100%のバス負荷に到達できないようにビット構造を準備する際のオーバーヘッドを意味しますが、CANでは65%を超えることはほとんどありません...


2
Electrical Engineering StackExchangeへようこそ。あなたの答えの最初の部分は実際にはまったく答えではないので、それがあなたが望むものであるならば、あなたは新しい質問をします。OPはCANプロトコルのソフトウェア実装について具体的に質問しましたが、その質問に答えずにあなたの答えはさまようようです。質問のトピックに留まるようにしてください。
ジョーハス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.