Can Shieldを使ってみました。

# はじめに
STM32でCANを使用することになったので、その準備のためにCAN-BUS Shieldを使用してCAN通信を行うための環境を整えました。自分自身の忘備のためにやったことをまとめました。
確認不足だったのですがCAN-BUS ShieldとはSPI通信でデータの受け渡しをするものでした。

# 使用機器
下表の機器を使用しました。
| メーカ | 型格 |
|:-:|:-:|
|STマイクロエレクトロニクス|NUCLEO-L476RG|
|STマイクロエレクトロニクス|STM32CubeIDE|
|SeeedStudio|CAN-BUSシールドV2|

# 接続
NUCLEO-L476RGとCAN-BUS ShieldはSPI通信でデータのやり取りをします。
STM32L476RGはSPI通信のために下表の端子を使用します。
|ピン番号|端子名|Arduino|機能|備考|
|:-:|:-:|:-:|:-:|:-:|
|21|PA5|D13|SPI1_SCK|-|
|22|PA6|D12|SPI1_MISO|-|
|23|PA7|D11|SPI1_MOSI|-|
|38|PC7|D9|CS|チップセレクト（アクティブLOW）|
|43|PA10|D2|INT|外部割り込み信号（falling edge）|

CAN-BUS ShieldのSPI信号はデフォルトでISCPに接続されています。
そのためNUCLEO-L476RGとSPI通信するためには接続を変更する必要があります。
接続の変更は下図のようにジャンパで接続するのが簡単です。
![ジャンパを使用する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/06cdbffe-3068-5cd7-47f5-83c694973276.png)
下図のようにCAN-BUS Shieldの裏面にあるランドの赤線部分のパターンをカットして、灰色線のようにハンダ付けすることによっても動作すると思わます。ジャンパを使用したためこちらの方法は試していません。動作未確認となります。
![基板を改修する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/c37d2371-1272-56c6-c8f0-6acd6ebaf81a.png)
またDub9ピンの信号を出力を変更しました。
基板の改修をしましたがTerminalからCANHとCANLが出力されているので、このコネクタを使用してDsub9ピンに接続すれば良かったと思います。
|信号|デフォルト|変更後|
|:-:|:-:|:-:|
|CANH|3|7|
|CANL|5|2|
|GND|2|3|

Dsub9ピンの出力ピンを変更するには、下図のようにCAN-BUS Shieldの裏面にあるランドの赤線部分のパターンをカットして、灰色線のようにハンダ付けすることによって出力先を変更しています。

![DSUB9_solid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/0258ea8c-6fa0-dd79-18d6-3ae51d70688e.png)


# SPIの設定
通信速度：10MHz
MSBファースト
Full-Duplex Master（全二重マスター）

# 起動処理
CAN-BUS Shieldの初期化処理のフローになります。
![初期化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148400/09ef1689-55ca-f036-8c4f-42a918e216c2.png)

# コマンドの送信
CAN-BUS ShieldではMCP2515というCANコントローラを使用しています。CANコントローラとはMCP2515で決められたコマンドを使用してデータをやり取りします。
+ コマンドを送信する前にチップセレクト（CS）をLOWとする必要があります。
+ コマンドの送信が完了したらチップセレクト（CS）をHIGHにします。
+ データはシーケンシャル（オートインクリメント）に送信することができます。
+ Bit Modifyコマンドは許可されたレジスタに対してのみ使用できます。
##### CANコントローラをリセットする
|コマンド|
|:-:|
|0xC0|
##### CAN通信のボーレートを設定する（250kbpsの場合）
|コマンド|レジスタ|CNF3|CNF2|CNF1|
|:-:|:-:|:-:|:-:|:-:|
|0x02|0x28|0x85|0xF1|0x41|
##### 送信バッファを初期化する
送信バッファとしてTX0からTX2の計3個を所持しています。それら全てを初期化します。
|コマンド|レジスタ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|0x02|0x30|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|

|コマンド|レジスタ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|0x02|0x40|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|

|コマンド|レジスタ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|0x02|0x50|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|

##### 受信バッファを初期化する
受信バッファとしてRX0とRX1の計2個を所持しています。それら全てを初期化します。
|コマンド|レジスタ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|0x02|0x60|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|

|コマンド|レジスタ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|データ|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|0x02|0x70|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|0x00|

##### 受信ルールを設定する
受信ルールを設定します。CANIDのフィルタを使用せず、全てのデータを受信するように設定しています。

RX0
|コマンド|レジスタ|データ|データ|
|:-:|:-:|:-:|:-:|
|0x05|0x60|0x64|0x64|

RX1
|コマンド|レジスタ|マスク|データ|
|:-:|:-:|:-:|:-:|
|0x05|0x70|0x60|0x60|

##### 割り込みを設定する
データを受信したときに割り込みを発生させるように設定しています。
|コマンド|レジスタ|データ|
|:-:|:-:|:-:|
|0x02|0x2B|0x03|

##### Normalモードに設定する
|コマンド|レジスタ|マスク|データ|
|:-:|:-:|:-:|:-:|
|0x05|0x0F|0xE0|0x00|

# 今後の対応
今後はRaspberry Piを使用してCAN通信を行います。
# 参考サイト
[CAN-BUS Shield V2.0](https://wiki.seeedstudio.com/CAN-BUS_Shield_V2.0/)