Qiita Advent calendar2021の記事です。
Spresenseの関係会社に勤務していますが、業務外の個人活動の紹介です。
当記事は会社と関係ありません。
誤った基板上のピン接続により故障する可能性があります。
自己責任でお願いします。
SSD1351ドライバを使っているOLEDモニタをsoftwareSPIとHardwareSPIで比較してみました。
####OLEDとSpresenseの接続
OLED | Spresense |
---|---|
GND | 3.3v |
SCL | D13 spi csk |
SDA | D11 spi mosi |
DC | D8 |
CS | D10 spi cs |
RES | D9 |
####スケッチ
SSD1351のサンプルスケッチtestSSD1351を用いました。
時間を比較するため、すべてのdelayをコメントアウトしました。
testSSD1351の選択場所
// SoftwareSPIのときこっちを使う
// Option 1: use any pins but a little slower
//Adafruit_SSD1351 tft = Adafruit_SSD1351(SCREEN_WIDTH, SCREEN_HEIGHT, CS_PIN, DC_PIN, MOSI_PIN, SCLK_PIN, RST_PIN);
// HardwareSPIのときこっちを使う
// Option 2: must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
Adafruit_SSD1351 tft = Adafruit_SSD1351(SCREEN_WIDTH, SCREEN_HEIGHT, &SPI, CS_PIN, DC_PIN, RST_PIN);
####ライブラリ
そのままではHardwareSPIは動きませんでした。
試行錯誤した結果、ここを修正すると動きました。
SPI.hの修正場所
class SPISettings {
public:
...
// clockを12000000に変更 14000000までは動くようだ
SPISettings()
: clock_(12000000), bit_order_(MSBFIRST), data_mode_(SPI_MODE0) { }
Adafruit_SSD1351.cppの修正場所
// elseの周波数を12000000に変更 14000000までは動くようだ
// TODO: this will be moved to SPITFT, but for now:
#if defined(ARDUINO_ARCH_ARC32)
...
#else
#define SPI_DEFAULT_FREQ 12000000 // 24000000 ///< SPI default frequency
#endif
####実行の様子
HardwareSPIはSoftwareSPIより約8倍くらい早いようです。