Arduino-serial-peripheral-interface
提供:Dev Guides
Arduino-シリアル周辺機器インターフェース
シリアルペリフェラルインターフェイス(SPI)バスは、シリアル通信用のシステムで、最大4本(通常は3本)の導体を使用します。 1つの導体はデータ受信、1つはデータ送信、1つは同期、もう1つは通信するデバイスの選択に使用されます。 これは全二重接続です。つまり、データは同時に送受信されます。 最大ボーレートは、I2C通信システムよりも高くなっています。
ボードSPIピン
SPIは次の4本のワイヤを使用します-
- SCK -これはマスターによって駆動されるシリアルクロックです。
- MOSI -これは、マスターによって駆動されるマスター出力/スレーブ入力です。
- MISO -これは、マスターによって駆動されるマスター入力/スレーブ出力です。
- SS -これはスレーブ選択線です。
以下の機能が使用されます。 SPI.hを含める必要があります。
- * SPI.begin()*-SCK、MOSI、およびSSを出力に設定し、SCKおよびMOSIをLowに、SSをHighに設定することにより、SPIバスを初期化します。
- * SPI.setClockDivider(divider)*-システムクロックに対してSPIクロック分周器を設定します。 AVRベースのボードでは、利用可能な仕切りは2、4、8、16、32、64または128です。 デフォルト設定はSPI_CLOCK_DIV4で、SPIクロックをシステムクロックの4分の1の周波数(20 MHzのボードでは5 Mhz)に設定します。
- 分周器-(SPI_CLOCK_DIV2、SPI_CLOCK_DIV4、SPI_CLOCK_DIV8、SPI_CLOCK_DIV16、SPI_CLOCK_DIV32、SPI_CLOCK_DIV64、SPI_CLOCK_DIV128)の可能性があります。
- * SPI.transfer(val)*-SPI転送は同時送信および受信に基づいています。受信データはreceivedValに返されます。
- * SPI.beginTransaction(SPISettings(speedMaximum、dataOrder、dataMode))*-speedMaximumはクロック、dataOrder(MSBFIRSTまたはLSBFIRST)、dataMode(SPI_MODE0、SPI_MODE1、SPI_MODE2、またはSPI_MODE3)です。
SPIには次の4つの動作モードがあります-
- モード0(デフォルト)-クロックは通常ロー(CPOL = 0)で、データはローからハイへの遷移(リーディングエッジ)でサンプリングされます(CPHA = 0)。
- *モード1 *-クロックは通常ロー(CPOL = 0)で、データはハイからローへの遷移(トレーリングエッジ)でサンプリングされます(CPHA = 1)。
- *モード2 *-クロックは通常High(CPOL = 1)で、データはHighからLowへの遷移(リーディングエッジ)でサンプリングされます(CPHA = 0)。
- *モード3 *-クロックは通常ハイ(CPOL = 1)で、データはローからハイへの遷移(トレーリングエッジ)でサンプリングされます(CPHA = 1)。
- * SPI.attachInterrupt(handler)*-スレーブデバイスがマスターからデータを受信したときに呼び出される関数。
次に、2つのArduino UNOボードを接続します。 1つはマスター、もう1つはスレーブです。
- (SS):ピン10
- (MOSI):ピン11
- (MISO):ピン12 *(SCK):ピン13
グラウンドは一般的です。 以下は、両方のボード間の接続の図表示です-
SPIをマスターとして、SPIをスレーブとして使用する例を見てみましょう。
マスターとしてのSPI
例
#include <SPI.h>
void setup (void) {
Serial.begin(115200);//set baud rate to 115200 for usart
digitalWrite(SS, HIGH);//disable Slave Select
SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}
void loop (void) {
char c;
digitalWrite(SS, LOW);//enable Slave Select
//send test string
for (const char* p = "Hello, world!\r" ; c = *p; p++) {
SPI.transfer (c);
Serial.print(c);
}
digitalWrite(SS, HIGH);//disable Slave Select
delay(2000);
}
スレーブとしてのSPI
例
#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;
void setup (void) {
Serial.begin (115200);
pinMode(MISO, OUTPUT);//have to send on master in so it set as output
SPCR |= _BV(SPE);//turn on SPI in slave mode
indx = 0;//buffer empty
process = false;
SPI.attachInterrupt();//turn on interrupt
}
ISR (SPI_STC_vect)//SPI interrupt routine {
byte c = SPDR;//read byte from SPI Data Register
if (indx < sizeof buff) {
buff [indx++] = c;//save data in the next index in the array buff
if (c == '\r')//check for the end of the word
process = true;
}
}
void loop (void) {
if (process) {
process = false;//reset the process
Serial.println (buff);//print the array on serial monitor
indx= 0;//reset button to zero
}
}