GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
これまでGR-SAKURAでSPIを使っていなかったので気がつかなかったのですが、ArduinoのSPIと動作の互換性が無いため、Arduino用のライブラリがそのままでは使えませんでした。
今更Arduino互換の動作とするのか?このまま行くのか?という判断があるのかもしれませんが、Arduino互換とした方が良いのかなという気がするので修正しては如何でしょうか。
既存のコードにも影響があるため、判断はお任せします。※先方のライブラリを修正すればいいんじゃないの?って事であれば向こうにプルリク投げます。
1. bitOrder
ソースを見ると、GR-SAKURAのデフォルトではLSBFIRSTとしていますが、Arduino(というかAVR)のデフォルトはMSBFIRSTです。
2. clockDevider ArduinoもGR-SAKURAもSPIライブラリのデフォルトは1/4です。 しかしながら、周波数としてはArduino:4MHz, GR-SAKURA:12MHzです。 低速なデバイスだった場合は動作しません。 Arduinoと同等とするのであれば、1/12(0x05)に設定しておいた方が良いのかもしれません。 ※しかしながら、今回使用した通信モジュールでは、1/12(4MHz)では動作せず、1/16(3MHz)で動作しました。Arduinoで動作する理由は不明です。
3. SSの制御 これはちょっと悩ましいところですが、SSをD10とする場合にハマリます。 ArduinoのSSはdigitalWriteで自前制御します。8bit単位ですが、任意のバイト数転送できます。 GR-SAKURA(RX63)の場合はRSPIが転送サイズ毎にSSL0を自動で制御してしまいます。ライブラリで8bitと指定しているので事実上8bit転送しかできません。 Arduino的な動作をさせるには、 PORTC.PMR.BIT.B4 = 0; とし、SS(D10)をGPIOとして設定する必要があると思います。 ※もちろん、D9等別のPinをSSとして使えば回避できますし、デバイス側のSSをGNDに固定しても動きます。が、Arduinoでは、SSをD10とすることが多いと思います。
参考までに、今回使いたかった「さくらのIoT Platformβ 通信モジュール」では提供されたライブラリを以下の様に修正して動作させることができています。(#ifdef GRSAKURA ~ #endif の部分を追加)