2015年2月22日日曜日

ZYBO 20 ( I2S コントローラの作成 11 )

割り込みの確認も出来た。

Zynqでスタンドアローン(ベアメタル)環境で割り込み使用法について情報が少なくて困った。(探し方が悪いのかも知れないが。) ドキュメントとして唯一見つけられたのは、Xcell Jurnal 87の p38 の How to Use Interrupts on the Zynq SoC という記事だけだった。 この他にXSDKのProject TemplateのPeripheral Testsの中に割り込みを使うプログラム例があるので、これらを参考にしてプログラムを作成した。


割り込み機能の確認は、jukebox プログラムを割り込みを使うように書き換えて行った。
音楽データ用バッファのサイズは2048バイトにした。

I2SコントローラのDAC_THRレジスタをwvの中間番地に、DAC_ENDレジスタをwvの最終番地に設定し、ポインタがそこに通過した時点で割り込みを発生させ、割り込みハンドラでバッファの内容を新しいデータで更新するようにした。

以下は割り込みのセットアップを行う部分である。


割り込みハンドラ(I2SIntrHandler)
各割り込み要因に応じて、それに対応する再生の終わったバッファ領域にSDカードからデータをリードして格納する。 ファイルの終端に達した場合(これはf_eof()で判定する)は、全ての割り込みをマスクし、Circulation modeをクリアする。 すると、DMACのポインタがENDに到達した時点でDMACは動作を完了する。

割り込みハンドラを抜けるところで、xil_DCacheFlush()をコールしてデータキャッシュの内容をDRAMに吐き出させている。 これをやらないとDRAM上のバッファの内容が不完全になりバッファの折り返しの部分で音が異常になった。

メインルーチン
while (1)のループでは、音量増減のボタンや曲ジャンプボタンの判定をしながらDMACが動作完了するのを待っている。 DMACが動作完了になるかあるいは曲ジャンプボタンが押されたらループを抜け、プレイリストの次の曲の再生準備をして再びこのループに入る。


ということで、割り込み及びDMACのCirculation modeの動作確認が出来た。 \(^_^)/


0 件のコメント:

コメントを投稿

自作CPUで遊ぶ 22

今使用しているモータードライバはDM556Dというものだが、このドライバはMicro Stepが 800 [pulse/rev] 〜 40000 [pulse/rev]の範囲で設定できる。 Mi...