2014/07/21

[nrf51]スケジューラを使ってGPIOハンドラからSPI転送するとHardFaultになった

nRF51822で、ボタンが押されたら、SPI転送をするような処理を書こうとしていた。
が、SPI転送の開始APIを呼ぶと、その中でHardFaultが発生していた。

発生しているのは、SPI転送spi_master.cの仲で割込を禁止しようとしているところのようだったが、原因がわからない。
つらつらとnRF51 SDKのHTMLドキュメントを見ていると「GPIOTEのハンドラは、スケジューラを使っていると直接GPIOTEの割り込みハンドラから呼ばれますよ」と書いてある。

割込禁止にしているところは、SVCALL()を呼び出しているところだった。
つまり、割込コンテキストからさらに割り込みを発生させようとしていたのでHardFaultになったということか?

調べてないけど、ありえそうな気がしてきたので、SPI転送をハンドラからメインループに移動させると動くようになった。
すっきりはしてないが、検索する語彙がわからないので、もういいや。


さて、そうしてようやくFeliCa Plugとお話しする環境ができてきたのだが、うまく動いてくれない。
初期パラメータの転送がうまくいってないのか、どこか待つべきタイミングを待ててないのか・・・。
というのも、デバッガで止めたりしているとFeliCaランチャーが反応することがあるからだ。
反応しないと言うことは、初期パラメータがうまく送信できてないのか・・・。
でも、nRF51822に電源を入れた直後だけは成功しているような気がするので、搬送波がOFFになったときの処理を間違っているだけかもしれない。

悩んでいてもしょうが無いからロジアナで波形を取ろうとしたのだが・・・使っていたカメレオンUSBのロジアナに入っているCypressのチップが最近では対応していなさそうで、ドライバが認識してくれなかった。
いろいろと動かせるようにしている人もいたのだが、すまん、私にはその根性が無かった・・・。
ロジアナの買い換えも検討していたところではあったので、これを機に買うことにした。
http://akizukidenshi.com/catalog/g/gM-04426/

来るまでの間に動いてしまうと残念かもしれないが、まあやれるだけはやってみよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。