« 福島処理水のトリチウム放出と、韓国の月城原発の本当の問題点 | トップページ | ZYNQのLinuxでCAN通信をするには(後編) »

2021.04.20

ZYNQのLinuxでCAN通信をするには(前編)

ZYNQのLinuxでCANを使う方法がわかったので紹介します。

CANを使うにはまず、PSの設定でCANを有効にします。

Can1

MIOからCANのポートが出てくるので、これをCANドライバにつなぎます。

Can2

CANドライバというのはLVCMOSやTTL、LVCMOS18といったFPGAに馴染みのあるロジック信号をCANのレベルに変換してくれるICのことです。私はLinear TechnologyのLTC2875を使いました。

Can3

このドライバは何でもよいのですが、高速CANと低速CANというのがあって、通信したい相手と合わせておきます。(危ないところだった)

15pFのコンデンサはデータシートどおりです。このLTC2875にはRSという端子があって、これをLにしないと動作してくれません。

 

高速CANの波形は下記のWikipediaの画像のように、0をドミナント、1をリセッシブといって、ドミナントのときに差動ドライバが駆動されるようになっています。

Can4

ドミナント(支配)のほうが強いわけですね。I2Cなどとの類似で考えると、Lのときは強くオープンドレインで引いて、Hがプルダウンで弱く開放するようなイメージだと思いますが、それを差動でやっているようです。

CANにはHiとLowの信号線があって、Hiのほうは中心電圧から上に振れます。実際の波形は下の図のとおり。CANのバス側はこのような差動信号となっています。120Ωで終端するとかありますが、細かいので省略します。

Can_bus

一方、CANのFPGA側は普通のロジック信号です。

Can_logic

CANの波形はこの程度の長さの「フレーム」で送るのですが、'1'が5回連続するともう一個'1'を挿入するビットスタッフィングが行われたりしますので、若干伸び縮みします。

また、CANの通信では、送信ノードがフレームを送って、それを別の受信ノードが受け取ってエラーなく受け取れたときに、レシーバが「ACK」ビットを駆動します。上の波形の中のどこか1ビットに「ACK」が入っています。例えるならI2CのACKのように、1つのフレームの中で受信ノードがバスを駆動してきます。(そのため、ACKの前はリセッシブになっている)

だから、「受信できたよというパケットのようなもの」を受信側が返す必要はないし、送信側はACKが戻るまで延々とフレームを繰り返し出し続けます。言われなくても再送するようです。なるほどね。

Wikipediaによると下記のような波形になっているようです。標準フォーマットでは8バイトまでしか送れませんが、拡張フォーマットでは64バイトまで送れるそうです。

CRCがありますね。CRCを計算して正しく受信できていれば誰かがACKを返すのでしょう。

Can_frame

あと、速度を合わせるためのクロックはないので、それぞれが通信速度を合わせておかなければなりません。

CANの物理層に関しては説明はこれくらいです。

次はLinuxでどう扱うのかを説明します。

|

« 福島処理水のトリチウム放出と、韓国の月城原発の本当の問題点 | トップページ | ZYNQのLinuxでCAN通信をするには(後編) »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 福島処理水のトリチウム放出と、韓国の月城原発の本当の問題点 | トップページ | ZYNQのLinuxでCAN通信をするには(後編) »