SAM4Lの方ですが、どうにかUSB CDCでPCとつなげられるところまではきました。しかし、時々うまくつながられないことがあります。どうやら CONTROL転送にバグがあるらしく、ZLP (Zero length packet)のINパケットを処理しそこなっているようです。どういう条件でこの問題が発生するのかをちゃんと絞り込めないとバグを取れそうもありません。まだちゃんとSAM4LのUSBCの動作を理解できていないってことですね。
USBの方はじっくりと見直すことにして、簡単にできそうな作業を並行して進めていこうかと思います。まずは試しにRTCを動かしてみることにしました。ところが、SAM4L にはRTCという名前のペリフェラルがありません。AST(Asynchronous Timer)が、RTCの機能をもっているようです。ASTは、SAM3SのRTTとRTCの両方の機能を兼ね備えたものになっており、ASTをカレンダーモードに設定することで、RTCと同じように使えます。ASTではクロック源も選択できるので、これを正しく選択して適切な分周比を設定してやらねばなりません。
今回は内蔵の32KHz RCオシレータを使うことにしましたが、次のような手順での設定が必要でした。
選択できるのはいいけど、設定するのは面倒になりました。
こうしてUSBでPCとつないで、ASTで計時できるようになりました。
今回は内蔵のRCオシレータを使っていますが、もちろん外付けの32KHzクリスタルを使うこともできます。SAM3Sでは、32KHzクリスタル用の端子(XOUT32/XIN32)がPIOと兼用になっていましたが、SAM4Lでは専用のピンが割り当てられています。SAM3SではUSARTのRTS/CTS機能とぶつかっていたので不便に感じていました。これは、ちょっと嬉しい相違点です。
USBの方はじっくりと見直すことにして、簡単にできそうな作業を並行して進めていこうかと思います。まずは試しにRTCを動かしてみることにしました。ところが、SAM4L にはRTCという名前のペリフェラルがありません。AST(Asynchronous Timer)が、RTCの機能をもっているようです。ASTは、SAM3SのRTTとRTCの両方の機能を兼ね備えたものになっており、ASTをカレンダーモードに設定することで、RTCと同じように使えます。ASTではクロック源も選択できるので、これを正しく選択して適切な分周比を設定してやらねばなりません。
今回は内蔵の32KHz RCオシレータを使うことにしましたが、次のような手順での設定が必要でした。
- BSCIFのRC32KCRにて、32KHz RCオシレータをイネーブルする
- BPMのPMCONにて、32KHzクロック源として32KHz RCオシレータを選択する
- ASTのCLOCKレジスタにて、ASTのクロック源として32KHzクロックを選択する
選択できるのはいいけど、設定するのは面倒になりました。
こうしてUSBでPCとつないで、ASTで計時できるようになりました。
今回は内蔵のRCオシレータを使っていますが、もちろん外付けの32KHzクリスタルを使うこともできます。SAM3Sでは、32KHzクリスタル用の端子(XOUT32/XIN32)がPIOと兼用になっていましたが、SAM4Lでは専用のピンが割り当てられています。SAM3SではUSARTのRTS/CTS機能とぶつかっていたので不便に感じていました。これは、ちょっと嬉しい相違点です。