[Armadillo:09179] CAN通信(Armadillo440)の設定について

星野 博 email@hidden
2013年 9月 9日 (月) 16:12:34 JST


星野です。

Armadillo-440でのCAN通信についてお問合せをさせて頂きます。
(長文となります、申し訳ありません)

現在、マニュアル等の記載を参照し、
CAN通信の動作確認を実施しようと試みておりますが通信が出来ていない状況です。
(現時点で、コンフィグ設定、ドライバ、ハードのどこに問題があるのかが特定できていない状態です。)


下記に現在までに実行した内容を記載しました。
使用方法、手順、設定内容の漏れ等がありましたら
ご教示頂けないでしょうか。

また、確認すべき事項が他にもありましたら、
ご指摘頂ければ幸いです。


・確認環境
 Linuxカーネル:linux-2.6.26-at16
 ユーザーランド:atmark-dist-20130329
 トランシーバ:PC-CAN-02(3.3V)[SN65HVD230D(TI)]
 CAN PCモニタ側:CANUSB


1.make menuconfig
実践開発ガイド第3部の記載内容に従い、以下の設定変更。
 ⇒気になる点としては、ソフトウェアマニュアルで記載されている
  カーネルコンフィグレーション”CAN_BCM”が、
  ”Broadcast Manager CAN Protocol”と同義なのか、です。
  (略称とあっていないような気がした為)

  - Armadillo-400 Board options
   [ ] Enable I2C2 at CON14    ([ ] へ変更)
   [*] Enable CAN2 at CON14  ([*] へ変更)

  - CAN bus subsystem support
   <*>   Raw CAN Protocol (raw access with CAN-ID filtering)  (<*> へ変更)
   <*>   Broadcast Manager CAN Protocol (with content filtering)  (<*> へ変更)
           CAN Device Drivers  --->

  - CAN Device Drivers
   < > Virtual Local CAN Interface (vcan)
   [*] CAN devices debugging messages  ([*] へ変更)
   <*> Freescale FlexCAN  (<*> へ変更)


2.make
"linux-2.6.26-at16"フォルダで以下のコマンドによりmake実施。
(エラーなし)

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- && gzip -c arch/arm/boot/Image > linux.bin.gz


3.linux更新
上記makeで作成したlinux.bin.gzを、Armadillo-440に書きこみ。(tftpdlで書きこみ実施)


4.Armadillo再起動
立ち上げ時に以下の内容が表示される事を確認。
※"CAN"(または"can")で検索した結果、Hitしたもののみを記載しています。
 表示されるべきものが記載されていない、
 もしくは逆に、これが表示されていたらおかしい、というものがありましたら、
 ご指摘頂けると幸いです。

Freescale FlexCAN Driver
can: controller area network core (rev 20071116 abi 8)
can: raw protocol (rev 20071116)
can: broadcast manager protocol (rev 20080415)


5.CAN通信設定実施
ログイン後、以下の内容で設定を実施。
 ⇒設定後、bitrate:500000 となっている事を確認。

br_clksrc  :osc
br_presdiv :3
br_propseg :7
br_pseg1   :5
br_pseg2   :3
br_rjw     :3
std_msg    :1
ext_msg    :0
maxmb      :64
rx_maxmb   :32
boff_rec   :0
listen     :0
loopback   :0
smp        :1
srx_dis    :1
wakeup     :0
wak_src    :0


6.ifconfig can0 up の実行
can0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          UP RUNNING NOARP  MTU:16  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:64
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

※ # /sys/devices/platform/FlexCAN.1/state の内容は ”Start::normal” となることを確認。
※ifconfig can0 up実施前の状態は以下。

can0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          NOARP  MTU:16  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:64
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


6."cansend"でデータフレームを送信
"cansend can0 123#5A6978A5"でフレームを送信。
 ⇒期待する波形が出力されない。(CAN TxDを測定)
 ⇒データフレームであれば、アービトレーションフィールドで
  High/Lowがいくつか変化するはずだが、変化しない。
   ⇒出力される波形は、"Low=6us,High=16us,Low=12us,High=24us"。
   ⇒前述の出力を10数回繰り返し後、"Low=6us,High=54us"を出力し続ける。
   ⇒この後、ifconfig can0を実施すると、TX packets:1のみ変わっている。

※/sys/devices/platform/FlexCAN.1/state の内容は ”Start::error passive”。


7.loopback,srx_disの設定を変更して確認
受信データを監視する、candump内で、データ送信を行なう処理を追加し、
自送信データを折り返して受信できるかを確認。

・loopback:"1"でループバック有効、"0"でループバック無効。
・srx_dis:"0"で自身が送信したフレームを受信、"1"で受信しない。

パターン1.loopback=1(有効),srx_dis=1(無効)
 ⇒"write"後の"select"で待ち状態、CAN TxD変化せず(CAN_H、CAN_Lも同様)

パターン2.loopback=0(無効),srx_dis=0(有効)
 ⇒"write"後の"select"関数で待ち状態、CAN TxD変化有り(CAN_H、CAN_Lも同様)

パターン3.loopback=1(有効),srx_dis=0(有効)
 ⇒"write"したフレームを"recvmsg"で受信、CAN TxD変化せず(CAN_H、CAN_Lも同様)

パターン4.loopback=0(無効),srx_dis=1(無効)
 ⇒"write"後の"select"関数で待ち状態、CAN TxD変化有り(CAN_H、CAN_Lも同様)


8.CAN TxDとCAN_H、CAN_Lについて
CAN TxDに同期して、CAN_H、CAN_Lが変化している事を確認。(電圧値は以下)

 CAN TxD=1の時:CAN_H=約2.3V、CAN_L=約2.3V
 CAN TxD=0の時:CAN_H=約3.3V、CAN_L=約0.3V


9.エラーフレーム受信の確認
受信データを監視する、candump内で、データ送信を行なう処理を追加、
かつ以下の処理をフレーム送信前に実施し、エラーフレームを受信できるように設定。
※出力している波形がエラーフレームと想定した確認。
 (7番目の確認のパターン2(loopback=0(無効),srx_dis=0(有効))で実施)
 ⇒受信せず。("select"関数で待ち状態)
  (設定の仕方が間違っている?)

err_mask = 0xFF;
setsockopt(s[0], SOL_CAN_RAW, CAN_RAW_ERR_FILTER,&err_mask, sizeof(err_mask));


以上です。




armadillo メーリングリストの案内