Raspberry Pi CAN通信 (MCP2515 TJA1050 CAN Bus Module)

以下で確認しました。
- Raspberry Pi 1 Model B (Raspbian Wheezy  2015-05-05 からアップデート)
- Raspberry Pi 2 Model B (Raspbian Jessie 2015-09-24 からアップデート) 

## 動機
- MCP2515 TJA1050 CAN Bus Moduleというのが、<font color="red">**$5**+送料</font>くらいで買える。(安いけど、おくられてくまで時間がかかる)
- 最近のRaspbianでは、MCP2515を使うことは**<font color="red">ラク</font>**らしい。(config.txtを編集すればよく、Kernelのビルドの必要がない) 

## 注意点
- らずぱいのGPIOの入出力電圧は<font color="red">3.3V</font>
- 安いMCP2515 TJA1050 CAN Bus Moduleは、arduino向けっぽいのか、**<font color="blue">5V仕様</font>**
 - TJA1050の電源 (supply voltage 4.75 < V_CC < 5.25 V) => 5V仕様
 - MCP2515電源電圧 (2.7 < V_DD < 5.5 V) 3.3V/5V 可能で、5Vが使われている。
 - MCP2515出力は V_DD - 0.7V ... そのまま使うと、4.3Vくらいになってしまう??

=> MCP2515の電源ピンを浮かせて、3.3Vを送り込む。(下図参照)
(確認してないけど、だいじょぶだろう...ぉぃ)

- ブレッドボードにて MCP2515のVDDピンを浮かせて、紫色のワイヤーではしっこのほうにだして、3.3Vをつないでます。右のほうにあるのはUART-USB.<br/>
![Raspberry Pi + MCP2515 CAN通信](https://qiita-image-store.s3.amazonaws.com/0/75594/7dda37c2-d090-9722-b0a4-a5480526ab88.png)


## 手順
- 1. 配線
 - 8本、間違えないように。

```text
P1-01 3V3          -> MCP2515の浮かせたピン3.3V電源
P1-02 5V           -> VCC 5V電源
P1-06 GND          -> GND
P1-24 GPIO8(CE0)   -> CS
P1-19 GPIO10(MOSI) -> MOSI
P1-21 GPIO9 (MISO) <- MISO
P1-23 GPIO11(SCLK) -> SCK
P1-22 GPIO25       -> INT
```

- 2. Raspbian
 - SDにイメージを焼く
 - ソフトの更新など(sudo apt-get update / upgrade/ rpi-update)

```shell-session
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
#再起動
sudo reboot
　
# ファームアップデート
sudo rpi-update
#再起動
sudo reboot
　
# 設定など
sudo raspi-config
```

- 3. **CAN Moduleを使えるようにする**
 - config.txt の編集-  最後のほうに追加 (`% sudo vi /boot/config.txt` とか `% sudo nano /boot/config`)
 - oscillator=8000000 はついてるオシレータにあわせる。(これは、8MHz)。16MHzだったり、いろいろあるらしい
 - 編集後、再起動。

```text:/boot/config.txt
# Added for SPI-mcp2515
dtparam=spi=on
dtoverlay=spi-bcm2835-overlay
dtoverlay=mcp2515-can0-overlay,oscillator=8000000,interrupt=25
```
 
- 4. 確認 (`% dmesg | grep spi`)
 - こんなのがでるとCAN Moduleが認識されている。でなかったら、配線を確認。

```shell-session
pi@raspberrypi:~$ dmesg | grep spi
[    5.383449] spi spi0.0: setting up native-CS0 as GPIO 8
[    5.409457] spi spi0.1: setting up native-CS1 as GPIO 7
[   20.347837] mcp251x spi0.0 can0: bit-timing not yet defined
[   20.347879] mcp251x spi0.0: unable to set initial baudrate!
...
```
- 5. 接続 
 - SocketCAN

```shell-session:500kbpsで接続
pi@raspberrypi:~$  sudo ip link set can0 type can bitrate 500000
pi@raspberrypi:~$ ifconfig can0
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:10
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 
pi@raspberrypi:~$
```

- 6. ツールの準備
 - can-utils

```
git clone https://github.com/linux-can/can-utils.git
cd can-utils
make
```
- 7. ダンプしてみる
 - なんかしらCANデバイスにつなぐ。HとLに注意。

```text:msg_idは、xxxxxxxxにしてます...
pi@raspberrypi:~/can-utils$ ./candump -cae -t z can0,0:0,#FFFFFFFF
 (000.000000)  can0  xxxxxxxx   [8]  01 20 34 F3 34 F3 34 F3   '. 4.4.4.'
 (000.000464)  can0  xxxxxxxx   [6]  01 43 34 F3 34 F3         '.C4.4.'
 (000.001028)  can0  xxxxxxxx   [8]  08 20 34 F3 34 F3 00 00   '. 4.4...'
 (000.001603)  can0  xxxxxxxx   [8]  08 00 00 00 00 00 00 00   '........'
...
```





## メモ

```text
SCLK - Serial CLocK
CE   - Chip Enable (CSと同じ)
CS   - Chip Select (CEと同じ)
MOSI - Master Out Slave In
MISO - Master In Slave Out
```

 - wireshark/tsharkでも見れるよ
```
sudo apt-get install wireshark tshark
```

<!-- リンク
http://ganchi.doorblog.jp/archives/8691321.html 
-->