DSKではまった…

2005年10月19日
どうも、三上先生が書いていたInterface,2004.FebのDSPの記事のプログラムは、最適化すると音が出ない。で、printf文をはさんでなんとかゴマかしてきたのだが、6416TDSKでは、そんなことは通用しなかった…

というわけで、何が悪いのかを調べてみた。
どうも、McBSPのほうのレジスタ設定は問題ではなく、McBSPを介して接続されているAIC23のレジスタ設定の方が問題のようだ。なんでかというと、McBSPはメモリにレジスタがマップされているため、この設定はある程度ウェイトを入れてやれば必ず反映される。
問題は、AIC23のほうで、そもそもMcBSPを介しているのだから、データが送信されなければレジスタ設定もできない。

となれば、疑うべきは、レジスタ設定を行っているAIC23_Base::RegSetメソッドということで、よく見てみる。

while(!McBSP_xrdy(hControl));

で、メソッドに入る前に送信されそうになっているデータが送信されるのを待っている。で、その後に自分のデータを送信しているが、ん、ちょっと待てよ、自分のデータが送信完了するのを待っていないじゃないか…

というわけで、

while(!McBSP_xrdy(hControl));
MCBSP_write ( hControl, (reg<<9) | (val&0x1FF)) ;
while(!McBSP_xrdy(hControl));

としてみた。すると、最適化しても音が鳴るようになった。

よかった。というか、これで1週間も悩んだよ…やっぱり、雑誌の記事って鵜呑みにしちゃだめなのね。

コメント