SyntaxHighlighter

2015年12月24日木曜日

fa.spiの挙動(秋月 FlashAir DIP IOボードキットでfa.spiが動かない問題)

※FlashAir本体をアップデートすること!
 W3.00.01にしないと、fa.spi関数は正常に動作しません!
 (W3.00.00にも関数が存在はしていますが、動作不良のようです)

秋月DIPボードの挙動が、fa.spiを使った時だけ妙 + mode切り替えをすると動くことがある
という話を聞いたので、mode切り替えだけで出力が切り替わるのかを調査。


初期状態
SCK  = HIGH(Hi-Z)
MOSI = HIGH(Hi-Z)
INT  = HIGH(Hi-Z)
SS   = HIGH(Hi-Z)
MISO = HIGH(Hi-Z)

fa.spi("init")
SCK  = LOW
MOSI = LOW
INT  = HIGH(Hi-Z)
SS   = HIGH
MISO = HIGH(Hi-Z)

→defaultではモード3とリファレンスに書いてあるが、どうみてもmode3ではない。
 ただ、1度空readをするとmode3らしき挙動になる。
 また、モードを切り替えてもinitするとまた戻される。

fa.spi("mode",0)
SCK  = LOW
MOSI = LOW
INT  = HIGH(Hi-Z)
SS   = HIGH
MISO = HIGH(Hi-Z)

fa.spi("mode",1)
SCK  = LOW
MOSI = LOW
INT  = HIGH(Hi-Z)
SS   = HIGH
MISO = HIGH(Hi-Z)

fa.spi("mode",2)
SCK  = HIGH (時折LOWのまま)
MOSI = LOW
INT  = HIGH(Hi-Z)
SS   = HIGH
MISO = HIGH(Hi-Z)

fa.spi("mode",3)
SCK  = HIGH (時折LOWのまま)
MOSI = LOW
INT  = HIGH(Hi-Z)
SS   = HIGH
MISO = HIGH(Hi-Z)

・結論
切り替わった。

ただし、時折切り替わり不良を起こしているらしき状態がある。
(mode3なのにSCKがLなど。cs切り替えでも発生する)

その場合、いくら切り替えても治らない。(極稀に治る。)
ただ、fa.spi("read")とでもして送信処理をさせれば、必ず切り替わる。


ちなみに、このページの情報を元にどんなに頑張っても
AE-FAIO(秋月 FlashAir DIP IOボードキット)は思い通りに動かないと思います。
サンプル通りソフトSPIで使うことを強くおすすめします。

※動きました。
CSの前、もしくは後に空読みを入れると、不安定さが解消するようです。
CSが反映されないことがあるバグ(or仕様)が影響し、
連続したパケットとして認識されていた可能性が高いです。
ソフトSPIで動いていたのは、このバグ(or仕様)がないためだと考えられます

function write_reg(addr,data)
--fa.spi("read"); --こちらでも良い。
fa.spi("cs",0)
fa.spi("write",0x20)
fa.spi("write",addr)
fa.spi("write",data)
fa.spi("cs",1)
fa.spi("read");
end

if(fa.md5 ~= nil) then
print("FlashAirのファームウェアが古すぎます");
error("error() has been called.");
end;

fa.spi("init",300000);
fa.spi("mode",3);
write_reg(0x00,0xaa) -- IOCONFIG

write_reg(0x01,0x00) -- IOSTATE
sleep(100)
write_reg(0x01,0x0F)
sleep(100)
write_reg(0x01,0x00) -- IOSTATE
sleep(100)


この情報を元に、秋月FlashAir DIP IOボード用のライブラリを作りました。

0 件のコメント:

コメントを投稿