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に搭載されているマイクを使うライブラリも無いです。)
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 ライブラリ というものがあるようなので、こちらを試されてみてはいかがでしょうか。
> この記述はどこで使われているのでしょうか?
Arduino/hardware/arduino/avr/libraries/Wire/src/utility/twi.c の
void twi_init(void) { // initialize state twi_state = TWI_READY; twi_sendStop = true; // default value twi_inRepStart = false; // activate internal pullups for twi. digitalWrite(SDA, 1); digitalWrite(SCL, 1); // initialize twi prescaler and bit rate cbi(TWSR, TWPS0); cbi(TWSR, TWPS1); TWBR = ((F_CPU / TWI_FREQ) - 16) / 2; /* twi bit rate formula from atmega128 manual pg 204 SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR)) note: TWBR should be 10 or higher for master mode It is 72 for a 16mhz Wiring board with 100kHz TWI */ // enable twi module, acks, and twi interrupt TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA); }
と
void twi_disable(void) { // disable twi module, acks, and twi interrupt TWCR &= ~(_BV(TWEN) | _BV(TWIE) | _BV(TWEA)); // deactivate internal pullups for twi. digitalWrite(SDA, 0); digitalWrite(SCL, 0); }
で使用されています。
> このままでどのような影響があるのでしょうか?
ビルド時に pins_arduino.h がインクルードされるソースファイル中で SDA と SCL が他の用途に使えないこと以外影響はありません。