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 の部分を追加)
Akagawaさん、ありがとうございます!お手数をおかけしてすみませんでした。
SPI.beginのデフォルト値は合わせるべきですね。また、CSもソフトにした方がよいですね。既存のSDライブラリなどの影響を考慮しつつ変更しようと思います。
でも、SakuraIO側ではSDライブラリのようにSPI.beginTransactionで、SPISettings(4000000, MSBFIRST, SPI_MODE0))を適用して欲しいとは思いますね。ちょっと実機が来たら動作確認しつつ、SAKURA、PEACH、KAEDEで動かせるようにプルリクを考えたいと思います。
確かに、SakuraIOは最近開発されたものなのでSPISettings()を使って貰った方が良いかもしれませんね。
岡宮さんがプルリク投げると言うことであればお任せします。
いえいえ。
SakuraIO(1.0.2)の動作確認がてら、SPIを修正してみました。
たぶんこれでArduino互換の動作だと思います。
受信が出来ない件の続報です。手元のロジアナで見るとMISOの信号がおかしいのです。3つのデータがありますが、上から順に
です。
MISOに異常があります。SCKの立ち上がりのタイミングでパルスが出ます。SCKが無いときも400ns前後の間隔で発生します。うちのGR-SAKURAが壊れているのかなと思い、BME280を単独で繋げてみると問題ありません。さくらのArduinoシールドとのハードウェア的な問題なのかなと思ってます。
それはそれとして、 Do not recommend having the external pullup or pulldown resistors. If mandatory, it is recommended the value should be larger than 50 kΩ. • An external pulldown or pullup resistor decreases the output VOH and VOL. Use the below equations to draft estimate the VOH and VOL as a result of an external pulldown and pullup resistor. VOH = VCCx × RPD / (RPD + 4.5 kΩ) VOL = VCCx × 4.5kΩ / (RPU + 4.5 kΩ) って書いてありますね。やれやれ、T.I.も面倒なICを作ったもんだ。
内部の回路図にも、出力に直列に4kΩがちゃっかり入っていますね。誰が採用したんだ(笑)。