FPGAからのデータをESP32で読み取るためのインタフェースとして、SPIを使おうと考えています。理由は、配線数が少なくて済み、かつFPGAでのインプリメンテーションが簡単そうだからです。SPIというのはSerial Periphral Interfaceの略で、Motorolaが規格を制定したとのことですが、様々なインプリメンテーションがあり、縛りの緩い規格のようです。昨日試したNokia 5110もSPIでインタフェースしています。
色々調べたところ、ESP32用ArduinoのSPIライブラリで標準的にサポートされるピンは、18(SCK)、19(MISO)、23(MOSI)、5(SS)のようなので、Nokia 5110と共存できるようです。
周波数カウンターのデータは32ビットで一度に読み込みたいので、それが可能かどうかも実験してみました。Arduino UNOなどのAVRマイコン用のSPIライブラリにはSPI.transerおよびSPI.transfer16というメソッドがあり、8ビットおよび16ビットでデータをリード・ライトできます。ESP32はその名の通り32ビットCPUなので、SPI.transfer32というのが使えるんじゃないかと思って試したところ上手くいきました。
テストプログラムを以下に示します。
#include <SPI.h>
void setup() {
SPI.begin(18, 19, 23, 5);
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE3));
Serial.begin(9600);
}
unsigned long outData = 0x55aa55aa;
void loop() {
unsigned long inData;
Serial.print("write to SPI ");
Serial.println(outData, HEX);
digitalWrite(SS, LOW);
inData = SPI.transfer32(outData);
digitalWrite(SS, HIGH);
Serial.print("read from SPI ");
Serial.println(inData, HEX);
delay(2000);
outData++;
}
void setup() {
SPI.begin(18, 19, 23, 5);
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE3));
Serial.begin(9600);
}
unsigned long outData = 0x55aa55aa;
void loop() {
unsigned long inData;
Serial.print("write to SPI ");
Serial.println(outData, HEX);
digitalWrite(SS, LOW);
inData = SPI.transfer32(outData);
digitalWrite(SS, HIGH);
Serial.print("read from SPI ");
Serial.println(inData, HEX);
delay(2000);
outData++;
}
クロック(SCK)は、1MHzにしました。MOSI信号(出力)をMISO信号(入力)に接続することで、自分の出力した信号をリードバックできる筈です。期待した通り、シリアルモニタには次のように表示されました。
write to SPI 55AA5721
read from SPI 55AA5721
read from SPI 55AA5721
MOSI-MISO間の配線を外すと、 read from SPI 00000000と表示され、リードバックされているデータであることが確認できました。
オシロスコープで、SCK(黄色)とMOSI(水色)の波形を観測しました。MODE3に指定しているので、クロックはノーマルハイ、立下りエッジの後でMOSI信号が変化しています。データは正論理でMSBファーストで送信されていることが分かります。

※コメント投稿者のブログIDはブログ作成者のみに通知されます