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")とでもして送信処理をさせれば、必ず切り替わる。
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("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ボード用のライブラリを作りました。
