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

星野 博 email@hidden
2013年 9月 11日 (水) 17:27:42 JST


笹山様

星野です。

先に結論を書かせて頂きます。
(個々の結果については引用文中に記載しています)

通信レートを500kbps→250kbpsにした結果、
送信、受信共に実現する事が出来ました。
丁寧に助言頂いたおかげで、ここまで到達できました。
ありがとうございました。


また、重ねての質問で大変申し訳ないのですが、
エラーフレームを受信しようとした場合、
recvmsgを実施する前に以下の処理を追加すればよい、
という認識でよろしいでしょうか。
("candump.c"を例とすると、"select"の直前に実施すればよい?)

err_mask = 0x000001FFU; /* ※1 */
setsockopt(s[0], SOL_CAN_RAW, CAN_RAW_ERR_FILTER,&err_mask, sizeof(err_mask));

※1:"linux/can/error.h"に定義されている
  "error class (mask) in can_id"が"0x00000001U〜0x00000100U"である為、
  全てを選択する意味で、該当ビットを全て"1"としています。


> ハードに問題がある場合は、
> loopback=0、srx_dis=0のパターンは、
> データを受信できない可能性があります。
> 
> このモードではCON14_3(CAN2_TX)から出力された信号が、
> CON14_4(CAN2_RX)にループバックしてくることで、
> 自身の送信するデータを受信するのですが、
> CAN2_RXは、CAN2_TXと同じ信号が確認できていますでしょうか?
> 
データ送信時、CAN2_TXとCAN2_RXを比較したところ、
CAN2_TXの立ち上がりから約2.4us遅れて
CAN2_RXの立ち上がりとなっておりました。

合わせて、トランシーバの出力である
CANH、CANLについても波形を確認した結果、
上記遅れている箇所で波形がなまっている状態となっておりました。
(CANHは緩やかに3.3V→2.3Vに下降、CANLは緩やかに0.5V→2.3Vに上昇)


> 1.下記スクリプトをsetCANbps.shとして保存し、
>    Armadillioに格納します。
> ========================================================
> #!/bin/sh
> 
> CAN_DEVICE_NAME=can0
> SYS_FS_CAN_PATH=/sys/devices/platform/FlexCAN.1
> 
> #=================================
> # setbps 500Kbps (500000 bps)
> #=================================
> ifconfig $CAN_DEVICE_NAME down
> 
> echo "CAN bps set 500Kbps"
> echo "osc" > $SYS_FS_CAN_PATH/br_clksrc
> echo "3" > $SYS_FS_CAN_PATH/br_presdiv
> echo "7" > $SYS_FS_CAN_PATH/br_propseg
> echo "5" > $SYS_FS_CAN_PATH/br_pseg1
> echo "3" > $SYS_FS_CAN_PATH/br_pseg2
> echo "3" > $SYS_FS_CAN_PATH/br_rjw
> echo "1" > $SYS_FS_CAN_PATH/std_msg
> echo "0" > $SYS_FS_CAN_PATH/ext_msg
> echo "64" > $SYS_FS_CAN_PATH/maxmb
> echo "32" > $SYS_FS_CAN_PATH/rx_maxmb
> echo "0" > $SYS_FS_CAN_PATH/boff_rec
> echo "0" > $SYS_FS_CAN_PATH/listen
> echo "0" > $SYS_FS_CAN_PATH/loopback
> echo "1" > $SYS_FS_CAN_PATH/smp
> echo "1" > $SYS_FS_CAN_PATH/srx_dis
> echo "0" > $SYS_FS_CAN_PATH/wakeup
> echo "0" > $SYS_FS_CAN_PATH/wak_src
> 
> ifconfig $CAN_DEVICE_NAME up
> echo "Setting Bitrate"
> cat $SYS_FS_CAN_PATH/bitrate
> ========================================================
> 
> 2.Armadilloログイン後、setCANbps.shが
>    格納されているディレクトリへ移動後、
>    下記の手順でコマンドを実行します。
> 
> # chmod +x setCANbps.sh 	//実行権限を付与
> # ./setCANbps.sh        	//ビットレートを設定
> CAN bps set 500Kbps
> Setting Bitrate
> 500000
> 
> # candump can0 &		//candumpをバックグラウンドで実行
> # cansend can0 123#5A6978A5	//メッセージを送信
>    can0  123  [4] 5A 69 78 A5	//candumpの仕様上メッセージを受信
> 
> # ifconfig can0 down		//設定変更の為に一旦CANを無効
> read: Network is down
> [1] + Done(1)                    candump can0
> 
> # echo "0" > /sys/devices/platform/FlexCAN.1/srx_dis //srx_dis=0に設定
> # ifconfig can0 up		//CANを有効
> # candump can0 &		//candumpをバックグラウンドで実行
> # cansend can0 123#5A6978A5	//メッセージを送信
>    can0  123  [4] 5A 69 78 A5	//candumpの仕様上メッセージを受信
>    can0  123  [4] 5A 69 78 A5	//srx_dis=0の為、もう1つメッセージを受信
> ------------------------------------------------------------------------
> 
記載頂いた500kbpsの内容では期待する結果となりませんでしたが、
250kbpsに変更(br_presdiv:3→6)した結果、
candumpで期待通りの結果を得る事が出来ました。


> 500kbps設定にて、High=16usが観測されるのは、
> ビットスタッフィングルールによりありえませんので、
> ビットレートの設定が正しく行われていないと考えられます。
>
前述の通り、"1"を送信しようとする際、
立ち上がり/立ち下がりが遅れてしまっている為、
IDの"1"の部分が正しいレベルで送信できておりません。

本事象発生時、
送信側ではID送信中である為、ビットエラーは検知しないですが、
受信側の処理として本箇所でビットエラーを検知し、
ID送信途中でエラーフレームに変わっているのではないかと推測しています。


以上、宜しくお願いします。




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