SyntaxHighlighter

2016年1月2日土曜日

fa.spiでINT端子を出力として使いたい

こちらにて、こんな話があった。
また、本当はFlashAirのSPI用のLuaスクリプト関数であるfa.spi関数を使って制御したかったのですが、うまくいかず、とりあえず今回はfa.pio関数を使って制御しています。
そこからこう考えた。

理由は単純で、過去にソフトSPIを実装した時にも、既存のピンの状態を保存するより、
棄てたほうが遥かに早くI/O操作が行えたからだ。
速度を追求する上では極々当たり前だと考えられる。


そこから、FlashAirとArduino繋いで検証してみた結果。
1.fa.spi("init",n)の操作で、入出力レジスタが設定される。
2.fa.spi("write")およびreadで、出力状態レジスタが設定される。
という様子がわかった。

つまり、fa.spi("init",n)の前にいくら入出力操作をしても、そこで初期化される。

fa.spi("write")およびfa.spi("read")の前に入出力操作をした場合、
入出力方向の操作(と、CSの操作)は保持され、INTはゼロにされる。

よって、INTの操作をしたいなら、INTをプルアップで釣り上げた上で、
出力にすればLow、入力にすればHighといった感じで操作可能かもしれない。

かもしれない、というのは、この操作を行った後SPI機能が正常に動く保証はないためだ。
いわば抜け穴をついてる状態に等しい。


一応、AE-FAIOでの動作(CSのみ操作)は確認した。
注意として、接続するSPI機器の使用を確認しないと、相手方及びFlashAirを破損する。

秋月FlashAir DIP IOボードキットでの使用および、
AirioRP(SW=1-2)でのINT操作は厳禁である。(変換ICの出力が接続されているため)


--コード--

function spi_cs_int(cs,int,sck)
 --csは望み通りに、sckはmode=0,1なら0 / 2,3なら1である。
 --余談だが、この関数を使う場合はCS後の空読みは不要。
 local bit = bit32.bor(bit32.lshift(cs,2),bit32.lshift(sck,1));

 --CS,SCKは設定通りに再設定される
 if(int == 1)then
  fa.pio(0x07,bit); --int=5をINPUT=High
 else
  fa.pio(0x17,bit); --int=5をOUTPUT=Low
 end
end

fa.spi("init",1000000)
fa.spi("mode",3)

spi_cs_int(1,1,1);
fa.spi("read");
sleep(1000)
spi_cs_int(1,0,1);
fa.spi("read");
sleep(1000)
spi_cs_int(0,1,1);
fa.spi("read");
sleep(1000)
spi_cs_int(0,0,1);
fa.spi("read");
sleep(1000)

0 件のコメント:

コメントを投稿