Armadilloフォーラム

MPC2515

ce_fono

2014年3月12日 20時40分

本田と申します。

Armadillo-840のSPI1にMPC2515を接続してCAN通信を行おうとしています。
以下のコンポーネントをbuilt-inで組み込んでいます(抜粋です)。

  System Type  --->
[*] R-Mobile A1 (R8A77400)
[*] Armadillo-840 board
    Armadillo-840 System Configuration  --->
  [*] use MSIOF1
  [*]   SPI: User mode SPI device [CS:PORT73]
 
  Device Drivers  --->
[*] SPI support  --->
[*]   Debug support for SPI drivers 
-*-   Utilities for Bitbanging SPI masters
<*>   SuperH MSIOF SPI controller
<*>   User mode SPI device driver support
 
[*] Networking support  --->
<*>   CAN bus subsystem support  ---> 
  <*>   Raw CAN Protocol (raw access with CAN-ID filtering)
  <*>   Broadcast Manager CAN Protocol (with content filtering)
        CAN Device Drivers  --->
      <*> Virtual Local CAN Interface (vcan)
      <*> Platform CAN drivers with Netlink support
      [*]   CAN bit-timing calculation
      <*>   Microchip MCP251x SPI CAN controllers
      [*] CAN devices debugging messages 

カーネルをビルドし、起動してみるとMPC2515を検出してくれません。
ブートログを見ると

  spi_sh_msiof spi_sh_msiof.1: master is unqueued, this is deprecated
  spi spi1.0: spi_bitbang_setup, 1000 nsec/bit
  spi spi1.0: setup mode 0, 8 bits/w, 1000000 Hz max --> 0
  spi_sh_msiof spi_sh_msiof.1: registered child spi1.0

と表示されているのが気になります。
Armadillo-840とMPC2515の組み合わせでCAN通信を実現されている方がいらっしゃいましたら助言をお願い致します。

ファイル ファイルの説明
config.txt コンフィグレーションファイル
Armadillo_840_bootup.log ブートログ
コメント

at_yashi

2014年3月13日 15時14分

MPC251xのドライバを見てみたのですが、platform data が必要なようです。
MPC251x用の platform data は作成した状態ですか? もしまだであれば、
linux-3.4-at/arch/arm/mach-shmobile/board-armadillo840.c
を参考に作成してみてください。

> カーネルをビルドし、起動してみるとMPC2515を検出してくれません。
> ブートログを見ると
> spi_sh_msiof spi_sh_msiof.1: master is unqueued, this is deprecated
> spi spi1.0: spi_bitbang_setup, 1000 nsec/bit
> spi spi1.0: setup mode 0, 8 bits/w, 1000000 Hz max --> 0
> spi_sh_msiof spi_sh_msiof.1: registered child spi1.0
> と表示されているのが気になります。

どの部分が気になるか教えてもらえますか?

あと、質問の中で表示フォーマットだけ少し修正させて頂きたいのですが、良
いでしょうか?

ce_fono

2014年3月13日 16時45分

本田です。
コメントありがとうございます。

> MPC251xのドライバを見てみたのですが、platform data が必要なようです。
> MPC251x用の platform data は作成した状態ですか? もしまだであれば、
> linux-3.4-at/arch/arm/mach-shmobile/board-armadillo840.c
> を参考に作成してみてください。
未作成でした。作成してみます。

> > カーネルをビルドし、起動してみるとMPC2515を検出してくれません。
> > ブートログを見ると
> > spi_sh_msiof spi_sh_msiof.1: master is unqueued, this is deprecated
> > spi spi1.0: spi_bitbang_setup, 1000 nsec/bit
> > spi spi1.0: setup mode 0, 8 bits/w, 1000000 Hz max --> 0
> > spi_sh_msiof spi_sh_msiof.1: registered child spi1.0
> > と表示されているのが気になります。
>
> どの部分が気になるか教えてもらえますか?
'master is unqueued, this is deprecated'の箇所です。
これを見てspi_sh_msiofモジュールが組み込まれていないのかと思いました。
気にしなくても良いのでしょうか。

> あと、質問の中で表示フォーマットだけ少し修正させて頂きたいのですが、良
> いでしょうか?
はい、かまいません。

at_yashi

2014年3月14日 14時58分

> 'master is unqueued, this is deprecated'の箇所です。

このメッセージは、spi.c::spi_register_master() で出してい
ます。

最近までは master->transfer に転送用の関数を入れて、その関
数を使ってデーター転送をしていました。しかし、この方法は message queue
の方法に少しづつ変更されていっているようです。

http://git.kernel.org/linus/ffbbdd2

MSIOFでは spi-bitbang.c を使うようですが、bitbangがまだ transfer の方法
で実装されているようです。「deprecated」は「使えない」という意味ではな
く、多くの場合「古くなったので、そのうち使えなくなります。なので新しい
方法に修正して」という意味です。なので、メッセージは出ていても問題なく
使えます。

drivers/net/can/mcp251x.cの最初のコメント部分に、platform
device の作成方法が書いてあるので、こちらも参考になるかもです。

at_takashi.sasayama

2014年3月18日 12時01分

笹山と申します。

Armadillo-840液晶開発モデルでmcp2515を使用する方法について下記に記します。

1. mcp2515をプラットフォームデバイスへ追加

linux-3.x/arch/arm/mach-shmobile/board-armadillo840.c へ
添付ファイルのarmadillo-840-mcp2515.patchを適用します。
本パッチではmcp2515をプラットフォームデバイスへ追加します。

2. カーネルコンフィギュレーション

Linux/arm 3.4-at6 Kernel Configuration
System Type --->
     *** Armadillo System Configuration ***
     Armadillo-840 System Configuration --->
            CON7 extension board (Custom)  --->
             ( ) LCD
             (X) Custom                                   ★チェック
         *** Interface and Device select ***
        [*] use MSIOF1                                    ★チェック
        [*]   SPI: User mode SPI device [CS:PORT73]       ★チェック
                <CONFIG_ARMADILLO840_MSIOF1_DEVICE_SPIDEV_PORT73>
        [ ] use SDHI1    <CONFIG_ARMADILLO840_SDHI1>      ★チェックを外す
 
 Device Drivers --->
     [*] SPI support ---> <CONFIG_SPI>                    ★チェック
        [*]   Debug support for SPI drivers               ★デバッグメッセージを出力させたい場合はチェック
        *** SPI Master Controller Drivers ***
        <*> Utilities for Bitbanging SPI masters <CONFIG_SPI_GPIO>   ★チェック
        <*> SuperH MSIOF SPI controller <CONFIG_SPI_SH_MSIOF>        ★チェック
        *** SPI Protocol Masters ***
        <*> User mode SPI device driver support <CONFIG_SPI_SPIDEV>  ★チェック
 
 [*] Networking support  --->
    <*>   CAN bus subsystem support  --->            ★チェック
         --- CAN bus subsystem support
        <*>   Raw CAN Protocol (raw access with CAN-ID filtering)       ★チェック
        <*>   Broadcast Manager CAN Protocol (with content filtering)   ★チェック
        <*>   CAN Gateway/Router (with netlink configuration)           ★チェック
        CAN Device Drivers  --->
            <*>   Microchip MCP251x SPI CAN controllers                 ★チェック
            [*] CAN devices debugging messages                          ★デバッグメッセージを出力させたい場合はチェック

3. ユーザーランドコンフィギュレーション

CAN通信を確認する為にcan-utilsを使用できるようにします。

atmark-dist v1.33.0 Configuration
    Network Applications  --->
        [*] can-utils    ★チェック
        [*]   cansend    ★チェック
        [*]   candump    ★チェック
        [*]   cangen     ★チェック

4. Debian GNU/Linux 7に含まれるipコマンドのバイナリ

Armadillo-840起動後にipコマンドでビットレート設定を行いますが、
atmark-distに標準でによるbitrate設定はbusybox版ではできない為、
Debian GNU/Linux 7(wheezy)ユーザーランドに含まれるipで設定を行います。
添付ファイルのip.zipは、Debian GNU/Linux 7(wheezy)ユーザーランド v20130704に含まれているものです。

5. Armadillo-840起動メッセージのチェック

正常にmcp2515が認識されていれば以下のメッセージが確認できます。

[root@armadillo840-0 (ttySC2) ~]# dmesg |grep mcp
Armadillo-840 mcp251x_init:  got IRQ 20 for MCP2515
mcp251x spi1.0: spi_bitbang_setup, 100 nsec/bit
mcp251x spi1.0: setup mode 0, 8 bits/w, 10000000 Hz max --> 0
mcp251x spi1.0: CANSTAT 0x80 CANCTRL 0x07
mcp251x spi1.0: probed

6. /dev/can0 のセットアップ

※本コマンドを実行するディレクトリに添付のipコマンドのバイナリを配置しておいてください。

[root@armadillo840-0 (ttySC2) ~]# ifconfig can0 down
[root@armadillo840-0 (ttySC2) ~]# ./ip link set can0 type can bitrate 500000 loopback off
[root@armadillo840-0 (ttySC2) ~]# ifconfig can0 up
mcp251x spi1.0: CNF: 0x00 0xbf 0x02
[root@armadillo840-0 (ttySC2) ~]# ./ip -s -d link show can0
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 10
    link/can
    can state ERROR-ACTIVE restart-ms 0
    bitrate 500000 sample-point 0.850 ★ビットレートが500Kbpsにセットされていることを確認
    tq 100 prop-seg 8 phase-seg1 8 phase-seg2 3 sjw 1
    mcp251x: tseg1 3..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1
    clock 10000000
    re-started bus-errors arbit-lost error-warn error-pass bus-off
    0          0          0          0          0          0
    RX: bytes  packets  errors  dropped overrun mcast
    0          0        0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    0          0        0       0       0       0

7. 対向機との通信確認

対向機はArmadillo-420 + ATB-A400CAN + candumpを使用しました。
下記では4byteのデータフレームをArmadillo-840から送信し、
エラーが発生していないことを確認しています。

[root@armadillo840-0 (ttySC2) /etc/config]# cansend can0 123#12345678
[root@armadillo840-0 (ttySC2) /etc/config]# ./ip -s -d link show can0
2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT qlen 10
    link/can
    can state ERROR-ACTIVE restart-ms 0
    bitrate 500000 sample-point 0.850
    tq 100 prop-seg 8 phase-seg1 8 phase-seg2 3 sjw 1
    mcp251x: tseg1 3..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1
    clock 10000000
    re-started bus-errors arbit-lost error-warn error-pass bus-off
    0          0          0          0          0          0
    RX: bytes  packets  errors  dropped overrun mcast
    0          0        0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    4          1        0       0       0       0

下記はArmadillo-840でcansendを実行後の対向機の画面表示です。
Armadillo-840から送信したデータフレームの受信が確認できます。

[root@armadillo420-0 (ttymxc1) /etc/config]# candump can0
  can0  123  [4] 12 34 56 78

どうぞよろしくお願いいたします。

ファイル ファイルの説明
armadillo-840-mcp2515.patch mcp2515をプラットフォームデバイスへ追加するパッチ
ip.zip Debian GNU/Linux 7(wheezy)ユーザーランド v20130704に含まれるip

ce_fono

2014年4月3日 9時25分

本田です。

ご教示通りの手順でCAN通信を確認する事が出来ました。
Armadillo-840に接続した外付け回路の不具合対策に時間を取られ返事が遅れてしまいました。申し訳ございません。

ありがとうございました。

ask

2017年1月18日 15時05分

インテグレーションパートナーのASKエンジニアリングの佐藤です。
SPI1をLCD拡張基板を使用した場合にこのドキュメントのみだと動作しなかったので
ご参考まで対処法を追記します。

対処法:
JP3またはJP2をショートする。

現象:
出荷状態のままで使用するとTCLKが添付の様な波形となりboot後プローブに失敗します。

問題の原因:
TSCKは回路図上の信号名A1_SDHICD_1ですが、CON11-9の他にIC4-9に接続されています。
ICはアナログスイッチですので出荷状態(JP2,3オープン)ではIC4-10とショート状態となり
CON9-12途中のC62(0.01uF)がぶら下がる事となりこの容量が原因でクロック整形が積分化されてしまう
回路的になぜ直接C62が入っているかは解せませんが(本来はR66の後)JP3をショートする事でIC4-10は
オープンとなりC62と切り離す事が可能です。
また推奨しませんがJP2をショートした場合は1KΩでプルダウンされる形で動作します。

またMCP2515をご検討されている方に接続PINに関して情報が無かったので
参考までにお知らせします。

MSIOF1 を使用した場合
CON11を使用する
CON11-4 CAN_INT MSIOF1_SS1 (PORT67)
CON11-9 TSCK MSIOF1_TSCK (PORT72)
CON11-10 CS MSIOF1_TSYNC (PORT73)
CON11-11 MISO MSIOF1_TXD (PORT74)
CON11-12 MOSI MSIOF1_RXD (PORT75)
CON11-1 VCC_ 3.3V
CON11-2 DGND

ファイル ファイルの説明
CAN_wrong_tcsk.jpg SPI1 TSCK(CLOCK)問題