2012/04/25

[arm]SPIにもてこずりつつも、実はポーリングタイマのせい

土日と、ARM LPC-2388を使った通信に苦労していた。
UARTはまだしも、SPIはそんなに設定も多くないので軽く考えていた。
そして動かずに困った、という話である。

 

途中を省略すると、ポーリングタイマのせいだった。
タイマというと、割り込みで動作させるものの代表格、という扱いになっていることも多い。
しかし、ほんの短い時間だけだったり、割り込み要因発生から処理が呼び出されるまでの時間差が無視できない環境では、タイマをポーリングして使うことも多い。

今回も「1.1us以上待つ」のような制約がいくつかあるので、ポーリングタイマを作っていた。
なにせ、LPC-2388は最高で72MHz動作が可能だ。
1clk=14nsくらいだから、100くらい待てばいいのか・・・。

かもしれないが、動作クロックはあとで変更するかもしれないのでループによるタイマはやめておきたい。
やはり、タイマ機能を使ってポーリングタイマを作りたいものだ。

 

と力強く書いてみたが、最初はうまく行かなかった。
SPIがうまくいかないいかないと長い時間悩んでいたのだが、その前に置いていたポーリングタイマがタイムアウトしてくれず、SPI処理まで進まずに動いていなかっただけだった。

最終的には、こんなタイマになった。

void Tmr_Init(void)
{
    /* TMR0 */
    T0PR  = 18 - 1;            /* 18MHz/18 --> 1MHz */
    T0MCR = 0x00000006;        /* Match時に停止 */
    T0TCR = 0x00000000;
}
 
void Tmr0_Wait(uint32_t waitus)
{
    T0MR0 = waitus;
    T0TCR = 0x00000001;
    while(T0TCR & 0x00000001) {
        ;
    }
}

 

シンプルだ。
動かなかった理由は・・・最初に呼び出していると思い込んでいたTmr_Init()を呼び出していなかったので、タイムアウトしてもT0TCRの最下位ビットがクリアされていなかった、というだけのことだった。

あー、職場でやってなくて良かった。


ここ最近はNFCのことを書いていないので、そろそろ普通の人扱いになってきたんじゃなかろうか。
この調子でがんばりたい。

最近、ホームページの設定で「検索に引っかからないようにする」というのも見つけた。
ふふふ、これでいつでも痕跡を消せるぞ。

0 件のコメント:

コメントを投稿

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

注: コメントを投稿できるのは、このブログのメンバーだけです。