Arduino DueでSPI通信
Arduino DueではSPI通信をしたことがなくてWebで調べながらプログラミングを書き出してDueオンリーな記述でsetClockDivider(… , …)でクロック周波数を変えようとしましたが設定値を変えても2MHzのままでまったく変化がありませんでした。で、またいろいろ調べたしてArduino Dueで期待するSPI通信のデータ出力ができるようになったので備忘録として投稿しておくことにしました。
測定時の接続図は以下のような感じです。
Arduino Dueの場合、<spi.h>を使ったときの通信ではSPI用のピンのうちCS(Chip Select)として使えるピンは、外周のデジタルピンが使えますがMOSI、MISO, SCKは、SPIコネクタからしか出力できないようです。ICSPコネクタからの使い方はここでは調べていません。まぁ<SPI.h>を使わずにオリジナルで関数を書けば外周のコネクタだけでSPI通信は可能ですが特にここに手間をかけることもないかとは思います。
上図のピン接続は下表のようになります。
信号名 | Arduino Due ピンアサイン | オシロスコープ Channel |
CS | D10 | 1CH |
MOSI | SPI : 4pin | 2CH |
MISO | SPI : 1pin | ― |
SCK | SPI : 3pin | 3CH |
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ピンは特に規定がなくどのピンでもいいような感じなので通信するデバイスの数は空いているピンの数だけ使うことができるってことですね。
で、通信信号をオシロでモニタした結果は以下のようになります。
上から1CH(CS)、2CH(MOSI)、3CH(SCK)になります。期待した通り動いているようです。
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント