SPIライブラリのDueでの利用のための拡張

これらの関数は新しいプロジェクトでは利用されるべきではない。SPISettingsSPI.beginTransaction()をSPIパラメータの設定に利用する。

Arduino DueのSAM3XはSPIの拡張機能を持っている。これらの拡張機能をAVRベースのボードでも利用することができる。

拡張APIは4番ピンと10番ピンと52番ピンをCSとして利用することができる。

利用

SPIデバイスのCSピンとして利用するためには、ピンを指定しなければならない。

Dueは、SPIバスを共有する複数のデバイス間でCSを自動で取り扱うことができる。それぞれのデバイスはスピードやデータモードなど異なる属性を持つことができる。

複数のデバイスを異なるCSピンで利用するには、これらのピンをsetup()で宣言しなければならない。以下の例では、SPI MISOとMOSI、SCKピンを共有する2つのデバイスを利用する。一つのデバイスのCSは4番ピンに接続されており、もう一方は10番ピンに接続されている。

1
2
3
4
5
6
void setup(){
  // initialize the bus for a device on pin 4
  SPI.begin(4);
  // initialize the bus for a device on pin 10
  SPI.begin(10);
}

一度ピンがCSピンであると宣言されると、デフォルトの動作も変更することができる。例えば、デバイスが異なるクロックスピードで動作する場合は、setup()は以下のようになる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
void setup(){
  // initialize the bus for the device on pin 4
  SPI.begin(4);
  // Set clock divider on pin 4 to 21
  SPI.setClockDivider(4, 21);
  // initialize the bus for the device on pin 10
  SPI.begin(10);
  // Set clock divider on pin 10 to 84
  SPI.setClockDivider(10, 84);
}

4番ピンに接続されたデバイスに1バイトのデータを転送する例を以下に示す。

1
2
3
void loop(){
  byte response = SPI.transfer(4, 0xFF);
}

上記の例では、4番ピンのSPIデバイスに"0xFF"が送信され、MISOから受信したデータが、変数responseに格納される。チップ選択はSPIコントローラによって自動的に取り扱われ、転送コマンドは以下のことを意味する。

  • 4番ピンをLOWにすることでデバイスを選択する。
  • SPIバスに0xFFを送信し、受信したデータを返す。
  • 4番ピンをHIGHにすることでデバイスを開放する。

データ転送後にSPIデバイスを開放しないように転送命令に指示することで1回のトランザクションで1バイト以上のデータを転送することもできる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
void loop(){
//transfer 0x0F to the device on pin 10, keep the chip selected
SPI.transfer(10, 0xF0, SPI_CONTINUE);
//transfer 0x00 to the device on pin 10, keep the chip selected
SPI.transfer(10, 0x00, SPI_CONTINUE);
//transfer 0x00 to the device on pin 10, store byte received in response1, keep the chip selected
byte response1 = SPI.transfer(10, 0x00, SPI_CONTINUE);
//transfer 0x00 to the device on pin 10, store byte received in response2, deselect the chip
byte response2 = SPI.transfer(10, 0x00);
}

SPI_CONTINUEというパラメータにより、複数の転送の間にチップ選択が継続することを保証する。最後の転送では、SPI_CONTINUEは指定しない。

拡張機能を利用するための正しい文法は、SPI.setClockDivider()SPI.setDataMode()SPI.transfer()SPI.setBitOrder()のリファレンスを参照すること。

一度SPI.begin()が呼ばれると、宣言されたピンはGPIOとしては利用できなくなる。

参照

オリジナルのページ

https://www.arduino.cc/en/Reference/DueExtendedSPI

最終更新日

January 4, 2024

inserted by FC2 system