Arduino DueでSPI通信

Arduino DueでSPI

Arduino DueではSPI通信をしたことがなくてWebで調べながらプログラミングを書き出してDueオンリーな記述でsetClockDivider(… , …)でクロック周波数を変えようとしましたが設定値を変えても2MHzのままでまったく変化がありませんでした。で、またいろいろ調べたしてArduino Dueで期待するSPI通信のデータ出力ができるようになったので備忘録として投稿しておくことにしました。

測定時の接続図は以下のような感じです。

Arduino Due でSPI 測定

Arduino Dueの場合、<spi.h>を使ったときの通信ではSPI用のピンのうちCS(Chip Select)として使えるピンは、外周のデジタルピンが使えますがMOSIMISO, SCKはSPIコネクタからしか出力できないようです。ICSPコネクタからの使い方はここでは調べていません。まぁ<SPI.h>を使わずにオリジナルで関数を書けば外周のコネクタだけでSPI通信は可能ですが特にここに手間をかけることもないかとは思います。

上図のピン接続は下表のようになります。

信号名Arduino Due
ピンアサイン
オシロスコープ
Channel
CSD101CH
MOSISPI : 4pin2CH
MISOSPI : 1pin
SCKSPI : 3pin3CH

Arduino Dueに以下のようなプログラムを書き込みます。

#include <SPI.h>

#define SS0PIN (10)

SPISettings spiA(2000000, MSBFIRST, SPI_MODE0); 
SPISettings spiB(1000000, MSBFIRST, SPI_MODE0); 

void setup() {
  byte dat[] = {0xAA, 0xBB};
  pinMode(SS0PIN, OUTPUT);
  digitalWrite(SS0PIN, HIGH);
  SPI.begin();
  ////
  digitalWrite(SS0PIN, HIGH);
  SPI.beginTransaction(spiA);
  digitalWrite(SS0PIN, LOW);
  SPI.transfer(0xAA);
  SPI.transfer(0xBB);
  digitalWrite(SS0PIN, HIGH);
  SPI.endTransaction();
  ////
  digitalWrite(SS0PIN, HIGH);
  SPI.beginTransaction(spiB);
  digitalWrite(SS0PIN, LOW);
  SPI.transfer(dat, 2);
  digitalWrite(SS0PIN, HIGH);
  SPI.endTransaction();
    
}

void loop() {
}

このプログラムでは、SPISettings(…)を使って2種類のSPIモードを定義しています。1つは、クロック周波数:20MHz、データの送信bit:MSBから送出、SPIのモード:MODE0。もう1つは、クロック周波数:10MHz、データの送信bit:MSBから送出、SPIのモード:MODE0。を定義しました。

CSの制御は、SPI.beginTransaction(…)後にdigitalWrite(…)を使ってCSをLowにしSPI.transfer(…)でデータの送受信後またdigitalWrite(…)でHighにします。

これからするとCSピンは特に規定がなくどのピンでもいいような感じなので通信するデバイスの数は空いているピンの数だけ使うことができるってことですね。

で、通信信号をオシロでモニタした結果は以下のようになります。

Arduino Due deでSPI オシロ波形

上から1CH(CS)、2CH(MOSI)、3CH(SCK)になります。期待した通り動いているようです。

中川電子技研

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL