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関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
以下ご教示お願い致します。
SNShield(SNS)のSDカードインターフェースに関する質問です。
1. SNSの接続図をみていると、SDカードインターフェースの信号(SA_SCLK、SA_SDO、SA_SDI)がSmart-analogICの信号と共通なのですが、どのように使い分けているのですか? たとえば、SA_CSをOFFにしてSmart-analogICを殺して、SDカードインターフェースを使うようなイメージなのでしょうか? しかしながら、SA_CSがONの時に、上記3本の信号は、Smart-analogICを制御するのと同時に、SDカードにも伝わってしまってまずいような気がするのですが、どこに勘違いがあるのでしょうか?
2. SDカードを使用するには、何をすれば良いでしょうか?マニュアルの類はありますか?
宜しくお願いいたします。
1. SPI は同一バスに接続した複数デバイスを SS(Slave Select) 信号にて選択し、非選択のデバイスにはクロックやデータの信号は伝わっても無視されます。
2. SNSheld を接続し使用するマイコンボードのメモリカードや SD カード用のファイル操作を行うライブラリがあると思うので其方を参照してください。
藤田様、実はそれが見当たらないのです。SNShieldでは SD Card I/Fのスルーホールはtomoさんが書かれている3つ分しかなくてSSが無いのです。ただ、いかにも何か思惑がありそうなSA_RSTという信号のスルーホールが並んでいるのですが、意図を計りかねるのです。また、ライブラリも無いのです。 ←Arduino Pro Miniのライブラリのことでしたかも。(ライブラリが無いという点ではSNShieldに搭載されているマイクを使うライブラリも無いです。)
SNSheld(www.tessera.co.jp/tsa-sns500.html)はスマートアナログのSSはGR-KURUMIのD4がSA_CSに使用されていて、SDカードのソケット等はオンボードの実装がないので使用したい場合はSSも含めて外付けになるのでは?
「SD Card I/Fのスルーホール」なんてものは無いように見えますが。。あるのは汎用のSPIのTHと、汎用IOのTHでしょうかね。
Arduino世界のSDCはSPIとSS(汎用IO)で動かすだけです。汎用IOの何番を使えばいいかは、ユーザーが勝手に決めてソースで書くだけです。ide標準サンプル「CardInfo」なら34行目のChipSelectの記載がそれで、サンプルでは4番を使ってます。CSやSSは固有割り振りが必要なのでSmartAnalogで4番が使われてる以上、他のピン(空いてるとこ)に繋いで、併せてソースも直せばSDカードは使えます、という事です。
まぁ、SDカードのマニュアルというよりは、「SPI通信」の超基礎的な図解説明ページの参照をオススメします。
SDカード用のSSがないと思っていたら、NoMay様のご指摘のSA_RSTが、SDカードのSSとして使えそうな気がしてきました。これ以外ArduinoといいますかKURUMIで使用できるpinがなさそうですし。 この信号は、Smart-analogICのリセットにはいっていますが、Smart-analogICをディスエーブル(CS=high)にした状態だと、このリセットはSmart-analogICに対しては無効になりますよね(希望的観測)。すると、SA_RSTは他の目的に使えることになりますが、どうでしょうか。
Smart-analogICのリセットは、CSとは無関係にICに対してリセットがかかるようですね。 でもいずれにしても、Smart-analogICとSDカードを排他的に使うことになるから、SA_RSTは、SDカードのSSに使っても実害がなさそうに改めて思います。
tomoさん
fulxさんの「SPI通信」の超基礎的な図解説明ページですが、
SAIC500 UM Pg.80 図11-1 SPIの構成例
www.renesas.com/.../r02ds0008jj0120_saic.pdf
上図が非常にわかりやすいです。スレーブが増えればマスタ側のCS信号を増やしていく必要が
あります。
SA_RSTはSmartAnalog IC500(SNShield搭載のSAIC)のリセット信号です。
SAICは、リセット期間中は、CS/SCLK/SDI/SDOのSPI関連端子がHi-Z状態になります。
SAIC500 UM Pg.85 表12-3
SAICをリセット状態になっていればSDカードの出力信号と信号衝突が発生することは無いと思います。
再度、SAICを動作させる場合は、リセットを解除し、SAICのレジスタ設定する必要があります。
KM
すでにfujitaさんがWikiのページを提示されてましたね。
前の投稿だとSAICがCS端子を持っているのでCS信号とかきましたが、SS信号(Slave Select)
と同じです。
Kimiyoshi 様 ありがとうございました。 SAICが、リセット期間中は、CS/SCLK/SDI/SDOのSPI関連端子がHi-Z状態なる件、気づきませんでした。マニュアルに書いてあるのですね。
これで心おきなくSDインターフェースを使えます。
別のセンサのリセットを別の素子のCSに使う、リセットされる側は毎回初期設定をぶち込む…
そんな使い方は思いつきませんでした。頭が固いと自覚させられました。。さておき、それでもやはり一般的ではない使い方ですので、何かしら想定されないようなトラップにひっかからないといいな、とは思います。
回路図を見るに、D0/D1は空いてるのではないでしょうか?CN1の2/1pinで、未接続のように見えます。CSは出力なので、1pinのD1を使うのが気持ちスッキリかなぁと思います。
それとNoMaYさん失礼しました、SDCardI/Fの記載は、回路図にあるんですね。。でもってCSが無いと。なんじゃこりゃ。。意図を測りかねるってのも全く同意見です。
D0/D1はHWシリアルで使っているので空いていないです。私もあいているピンを探したのですがモータコントロールの2ピンが、モータを使わなければ使用可能ですが、これも取っておいたほうが良いので、結局SAICに接続されたピンをリセットでHi-Zにして使う以外に、ないように思います。
SNSheild の回路図を見ると KURUMI I/F で使用しているのは両端の 24ピンだけであり、GR-KURUMI の A4~A7 は全部空いてるようです。
fujita様、おっしゃる通りです。 感服。
Arduino Pro Mini(https://www.arduino.cc/en/Main/ArduinoBoardProMini)は回路図を見ると A6, A7 は ATMEGA328 のADC6, ADC7 に接続されており、ATMEGA328 のデータシートを見ると 同ピンはそれぞれ ADC 以外の機能が割り当てられていないのでデジタル入出力に設定することは不可能と思います。
Arduino の I2C(Wire)ライブラリはマイコンに搭載された I2C 機能等を使用しておらず、単に GPIO をソフト的に操作して実現しており、割り当てるピンの番号を
pins_arduino.h:
static const uint8_t SDA = 18; static const uint8_t SCL = 19;
のように定義しています。
これを変更すると GR-KURUMI と同様の D7 と D8 に割り当てることも可能な筈なので、試されては如何でしょうか。それが上手くいけば A4, A5 が空くことになります。
↑誤りなので削除
SNShield::begin() の中で呼んでいる R_SAIC_Create() の中で呼んでいる R_SAIC_Write(smartanalog_t*) の中で SPI の初期化を行っており
// SPI初期化 SPI.begin();
Arduino の SPI ライブラリではマイコンの機能として搭載されている SPI 機能をレジスタを操作して有効にしており、
hardware/arduino/avr/libraries/SPI/SPI.cpp:
SPCR |= _BV(MSTR); SPCR |= _BV(SPE);
pinMode() だけを使用しても SPI 機能が無効化されず digitalWrite() で操作できないのだと思います。
SPIClass::end() でこのレジスタを元に戻す操作があるので、 SPI.end() と pinMode() の両方を実行されてはどんなもんでしょうか。
pins_arduino.h を変更されてるでしょうか? スケッチ中で
static const uint8_t SDA = 8; static const uint8_t SCL = 7;
とされてもライブラリの動作に影響することはありません。
pins_arduino.h も Arduino IDE に含まれるもので
Arduino/hardware/arduino/avr/variants/eightanaloginputs/pins_arduino.h Arduino/hardware/arduino/avr/variants/ethernet/pins_arduino.h Arduino/hardware/arduino/avr/variants/gemma/pins_arduino.h Arduino/hardware/arduino/avr/variants/leonardo/pins_arduino.h Arduino/hardware/arduino/avr/variants/mega/pins_arduino.h Arduino/hardware/arduino/avr/variants/micro/pins_arduino.h Arduino/hardware/arduino/avr/variants/robot_control/pins_arduino.h Arduino/hardware/arduino/avr/variants/robot_motor/pins_arduino.h Arduino/hardware/arduino/avr/variants/standard/pins_arduino.h Arduino/hardware/arduino/avr/variants/yun/pins_arduino.h
様々あるので、選択しているマイコンボード用の pins_arduino.h を変更する必要があります。
改めて Arduino の I2C(Wire)ライブラリを確認したところ、変数 SDA と SCL はピンのモード設定の際に使用しているのみで、I2C の機能自体はマイコンをそれを使用していました。
先の
Arduino の I2C(Wire)ライブラリはマイコンに搭載された I2C 機能等を使用しておらず、単に GPIO をソフト的に操作して実現しており
(以下略)
というのは情報として誤りでした。すいません。
I2C(Wire)ライブラリの代わりとして、Arduino には Software I2C ライブラリ というものがあるようなので、こちらを試されてみてはいかがでしょうか。