« ZYNQのLinuxでCAN通信をするには(前編) | トップページ | 遅いDAコンバータから鋭いパルスを出す方法 »

2021.04.21

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

LinuxでCANを使うには、カーネルのビルドで

CONFIG_CAN=y
CONFIG_CAN_RAW=y
CONFIG_CAN_BCM=y
CONFIG_CAN_GW=y
CONFIG_CAN_RCAR=y

を設定するそうですが、上の4つはxilinx_zynq_defconfigの設定ではデフォルトでONになっています。CAN_RCARはReneas R-CARのドライバなので無くても構いません。なくても影響ありません。

CANを認識するにはデバイスツリーにも書かなければなりませんが、hsiを使ってデバイスツリーを作っているのであれば

&can0 {
status = "okay";
};

という記述が追加されているので、自動的にCANが有効になっているデバイスツリーが作られます。

こうして、Linuxが起動するときに、

CAN device driver interface
・・・
NET: Registered protocol family 17
can: controller area network core (rev 20120528 abi 9)
NET: Registered protocol family 29
can: raw protocol (rev 20120528)
can: broadcast manager protocol (rev 20161123 t)
can: netlink gateway (rev 20130117) max_hops=1

という起動メッセージが流れて、CANが使えるようになったことが示されます。

Linuxが起動したら、最初に

apt install can-utils

で、CANユーティリティをインストールします。

ip a

でIPのインタフェースを見てみると、

Can_ip

と、このようにcan0というインタフェースが出現していました。

2: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN group default qlen 10
link/can

たしかにcan0はIPの中にいるのですが、canの上にIPを乗せてTCP/IPで通信できるわけではありません。

canとタイプしてTABを押してみると、can-utilsの中にある

can-calc-bit-timing cangen cansend canbusload cangw cansniffer candump canlogserver canfdtest canplayer

というプログラムが出てきますが、動作確認に使うのはcansendとcandumpです。

まず、

ip link set can0 type can bitrate 10000000

でビットレートを設定します。ビットレートはどこまで上げられるかはわかりませんが、1MbpsではOK。10MbpsではNGでした。

 

ビットレートの設定が終わったら、

ip link set can0 up

もしくは

ifconfig can0 up

でリンクをアップさせます。

そうしたら2台の装置をつないで、片方の装置で、

cansend can0 123#456789

のようにしてデータを送ります。#の前は識別子というCANのノード番号で、#の後ろは最大8バイトの送りたいデータです。データは16進数で書きますが偶数個書かないといけません。

もう一方の装置では

candump -c -c -tA can0

としてCANバスの内容をダンプするようにしておきます。-cがダブっている理由はわかりませんがhelpにそう書いてあるので2回書いています。-tAは絶対時刻で表示するというものです。

その結果を示します。

Candump

このように、片方の装置から送った最大8バイトのデータがもう一方の装置に送られました。

 

最初、通信ができたときには感動したのですが、can-utilsにあるcansendとcandumpはこのくらいのことしかできません。

っていうかCANの標準フレーム自体が8バイトまでのデータしか送ることができません。大きなデータを転送したいときにはどうしたらいいんでしょうね?この上にさらに独自のプロトコルを乗せるのでしょう。

たった8バイトしか送れないって効率悪そうじゃないですか!?

 

いろいろ疑問は尽きないのですが、自分のプログラムの中からCANを使うにはSocketCANというネットワークスタックを使うのが一番簡単なようです。SocketCANを使えばTCP/IPで使うようなsocketやbindといった関数に、新たなプロトコルファミリPF_CANというのが使えるようになって、readとかwriteを使ってフレームを送ることができるようになるようです。

それでも8バイトまでのCANの標準フレームの送受信なので、その上のプロトコルは独自に実装することになるのでしょう。

いや、でも、8バイトって厳しい・・

 

|

« ZYNQのLinuxでCAN通信をするには(前編) | トップページ | 遅いDAコンバータから鋭いパルスを出す方法 »

コメント

コメントを書く



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




« ZYNQのLinuxでCAN通信をするには(前編) | トップページ | 遅いDAコンバータから鋭いパルスを出す方法 »