Arduino UNO R4 WiFiのSPIのテストをします。
前の記事で分からなかったArduino UNO R4のSPIの記載の仕方をWeb上を検索しましたところGitHub1に「Arduino_UNO_R4_SPI_test.ino」という記事を見つけました。記事は、こちら。また、Arduinoリファレンス日本語版にSPIライブラリの説明がありました。記事は、こちら。
GitHubのスケッチを元にSPIのテストをしました。
SPIプロトコルの設定は、次のようSPISettingオブジェクトで行います。
パラメータは、クロック速度、bitOrder(MSBFIRST or LSBFIRST)、SPIMODE(0~3)です。
例 SPISettings spi_setting(1000000, MSBFIRST, SPI_MODE0);
このオブジェクトをSPI.beginTransaction() に渡すことにより設定が有効になります。
例 SPI.beginTransaction(spi_setting);
GitHubのスケッチです。(dataは、0x55,0xAAをそれぞれ1回出力に変更しています。)クロックは、100kHz,bitOrderは、MSBFIRST,SPI_MODE0です。
-----------------------------------------------------
#include <SPI.h>
SPISettings spi_setting(1000000, MSBFIRST, SPI_MODE0);
void setup() {
Serial.begin(9600);
while (!Serial);
SPI.begin();
pinMode(10, OUTPUT); // <- this is required to make `digitalWrite(SS, LOW);` work on Arduino R4 Minima.
}
void loop() {
uint8_t data[] = { 0x55, 0xAA};
SPI.beginTransaction(spi_setting);
digitalWrite(SS, LOW);
SPI.transfer(data, sizeof(data));
digitalWrite(SS, HIGH);
SPI.endTransaction();
}
-----------------------------------------------------
SPISettings spi_setting(1000000, MSBFIRST, SPI_MODE0);
void setup() {
Serial.begin(9600);
while (!Serial);
SPI.begin();
pinMode(10, OUTPUT); // <- this is required to make `digitalWrite(SS, LOW);` work on Arduino R4 Minima.
}
void loop() {
uint8_t data[] = { 0x55, 0xAA};
SPI.beginTransaction(spi_setting);
digitalWrite(SS, LOW);
SPI.transfer(data, sizeof(data));
digitalWrite(SS, HIGH);
SPI.endTransaction();
}
-----------------------------------------------------
このスケッチをArduino UNO R4 に書き込んで、出力されたSPIのCLK(D13)とMOSI(D11)信号です。MOSIデータは、0x55=0b01010101,0xAA=0b10101010の順にMSBFIRSTで送信されます。
SPI_MODE0で、CLK正パルスで、CLKの前縁(立ち上がり)でMOSIデータがラッチされます。
SPI_MODE1の時です。CLK正パルスで、CLKの後縁(立下り)でMOSIデータがラッチされます。
SPI_MODE2の時です。CLKは負パルスで、CLKの前縁(立下り)でMOSIデータがラッチされます。
SPI_MODE3の時です。負クロックで、CLKの後縁(立ち上がり)でMOSIデータがラッチされます。
MAX7219 8X7segLEDには、SPI_MODE0のタイミングが必要です。
前の記事のスケッチでbitOrderやmodeを設定しなくても動作したのは、SPI設定のデフォルトがMSBFIRSTとMODE0になっていたためと思われます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます