− 綾瀬ヒロ (@ayasehiro) 2016, 1月 1
こちらにて、こんな話があった。また、本当はFlashAirのSPI用のLuaスクリプト関数であるfa.spi関数を使って制御したかったのですが、うまくいかず、とりあえず今回はfa.pio関数を使って制御しています。そこからこう考えた。
MCP4922がFlashAirのfa.spiから正常に制御出来ない(fa.pioでは制御できた)というのを聞いたが、 もしかして、LusSPIでINTになってる端子、fa.spiで強制的に入力に設定されるのではないか、と仮設を立ててみる。− Segmentation Fault (@Seg_Faul) 2016, 1月 2
そこから、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といった感じで操作可能かもしれない。
つまり、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)