2012/04/22

[arm]UARTにてこずる

SPIよりも先に、デバッグ環境を整えねばならぬ。
JTAGを買うこともなさそうなので、printfデバッグにしよう。

といっても、本物のprintfは重たいので、単にUARTに掃き出すだけでいい。
そう思ってさっさと終わらせたかったのだが、なかなか動かなかった。


原因の一つは、実装ミス(それしかないけど)。

UARTの通信速度を決めるレジスタがあり、LPC-2388ではNXP提供のExcelファイルで計算したレジスタ値を設定するのがよさそうだった。
その通りに設定した(つもり)だったけど、なんかデータが化ける。
2時間くらいやって、ようやく得られたレジスタ値のdefine名を間違っていただけ、ということに気付いた。

 

もう1つは、実装漏れのようなもの。
UART出力のためにリングバッファを用意していたのだが、なんかでたらめなデータが出力されていたのだ。
ようやく、WriteポインタとReadポインタの初期値が設定されていないことに気付く。
この2つはstatic変数として定義していたので、0初期化されるつもりだったのだ。
しかし、よくよく考えるとResetベクタからスタックを初期化した後、すぐにmain()を呼び出していて、CRT0みたいな処理をまったくやってなかったのだ。

newlibを組み込めばいいみたいだけど、今回はそんなに大きなシステムでもないし、標準ライブラリも使わなくて済むと思うので、初期化関数で初期化するルールにした。

 

最後まで手こずったのが、リングバッファ。
デバッガがあれば簡単なのかもしれないけど、私はこういうのが苦手なのだ。

しかしよく読むと、LPC-2388のUARTには16byteもFIFOが積まれていることがわかった。
なら、リングバッファを用意してやるまでもない。
今回は115200bps/8bit/non-parity/stop bit 1なので、1byteが86usくらいで送信できる。
16byteなら1.4ms程度か。
バッファを持たせるとSPIでの受信データを出力できそうだけど、まあ、それはそのときに考えよう。

 

現状のソースをそろそろgithubで管理しておこう。

https://github.com/hirokuma/felica_plug

0 件のコメント:

コメントを投稿

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