hiraコメントするI2Cの実装が、まともになったので、タッチパネルの操作を反映して、ファイラーにも対応した。これで、画面タッチでファイルを選択して、音楽を再生するガジェットがまともになった。曲の再生では、一時停止や、次の曲などをタッチ操作対応にした。本来ボタンを描画して、GUIで操作させるべきなのかもしれないが、それは、又後で考える。GUIに関しては、このボードの正規なサンプルプログラムとして既に公開されているが(SEGGER)、GUIのような複雑な動作をCで書くのは、自分的にはありえない。GUIの見た目や、操作の動作をエミュレーションする環境も必要な事を考えると、少し複雑なGUIを作ろうとすると、この環境だけではかなり厳しいと思う。GUIフレームワークがあるので、それをマイコン用にダイエットしてポートする予定でいる。その時に、PC上で、見た目やリソースを作成するアプリなども作る予定でいる。書き込み専用レジスターとなっており、詳しい説明は省略され、ライブライーを使う事を前提としている。話がそれたが、オーディオプレイヤーのタッチ操作は以下のようになっている。3点タッチ(離れた時)で、ファイラーが有効になる。現在、MP3、WAV形式のファイルをサポートしてあり、タグの表示にも対応している。タグは、ID3V2に対応しているが、V1タグは過去の物であり、あっても無視される。タグは、曲名、タイトル、アーティスト、トラック、リリース日付、などの対応になっている。※WAV形式のタグも同じように対応している。一般的な方法では、メモリ不足で、デコードする事が出来ないので、こちらはそのうち対応する事にする。(多分、一時メモリを使わず、直接フレームバッファに描画するようにすれば可能なハズだが、リアルタイムにスケーリングもする必要があり、少しハードルが高い)オーディオ出力は、RX65NのDA0、DA1から出力する(量子化は12ビットだが)、無音は、3.3VとGNDの中間電圧、1.65Vとなっている。バイパスコンデンサと抵抗だけで直にラインに繋げるのは心苦しいので、自分は以下の回路を組んでいる。※アンプの参考回路(以前にRL78で実装したWAVプレイヤーのもの)量子化は12ビットだが、自分の耳では、そんなに悪い音に感じない。※ブラインドテストで16ビットとの違いを聞き分けるのは難しいと思う。部D/Aで鳴らせると思う。(いずれ、それも対応する予定でいる)※SCIを使った簡易SPIだと、クロックを高速に出来ないので難しいかもしれない。※自作音楽プレイヤーを前から作りたかったので、丁度良い。hiraコメントするSCIで簡易I2Cを実装している。前回、ポーリングによる実装を行い、動作する事を確認した。動作周波数が遅いCPUなら、それでも良いのだが、120MHzで動作するRXマイコンだと、話が変わってくる。100KBPS程度の通信速度をポーリングで行うのは、マシンサイクルを無駄に消費してしまうので、許容できないと思う。そこで、割り込み処理にするのだが、RXマイコンで、I2Cを本格的に扱うのは今回が初めてとも言えるので、あまりよく考えていなかった。※IICAの専用インターフェースの実装も、いまだにポーリングのみの実装になっている。これもそのうち手を入れないといけない・・・SCIの簡易I2Cでは、STI(I2Cアクノリッジ待ち)で、送信終了割り込みを使うのだが、「sci.hpp」に定義をしていない。定義をしているが、グループが異なると、全く別の型となるので、そのままでは、定義が出来ない。基底クラスを継承させ、チャネルでグループが異なる場合を別けて実装するように修正した。そのままに、グループ別に異なったクラスを定義した。制御とクラスを別け、新規に「sci_i2c_io.hpp」とした。不快に思ってしまう、だが、人間「慣れ」るもので、回数を重ねると、ありがたく思うようになり、真摯に助言を受け入れる度量と分析力が育つ。正してもらった方が良い。要となるのだが・・ポーリング動作で、全体の見通しがついていたので、割り込み動作に関しては、それなりに順調に実装できた。FT5206、I2Cの定義は以下のように行う。※FT5206のリセットを制御するので、ポートを定義。FT5206;割り込みで処理するのは簡単で、以下のように、I2Cのインスタンスを起動する時に、割り込みレベルを設定するだけで良い。}}割り込みでは、データ転送が非同期になるので、同期を行うメソッドを追加し、非同期にデータが来ても誤動作しないように、FT5206の実装も見直した。hiraコメントするファイラーがそれなりに動くようになったので、オーディオプレイヤーを更新、PCMファイルのサポートも追加した。操作は、ファミコンパッドで行うのだが、もうそろそろ、タッチスクリーンを有効にしないと駄目な感じだ・・・タッチスクリーンで使用しているICはFT5206という物らしい。I2Cは、専用ポートしか考えていなかったので、専用のドライバーが既に動作しているが、FT5206はSCI6に接続されている。SCIの簡易I2Cを実装するしかない。割り込みでやるのは、設定が複雑になり、ハードルが高いと思ったので、とりあえずポーリングでやってみたが、どうにも動作しない。動いたー(当たり前だけど)※最初、動かないなぁーって思ったけど、とあるレジスターの応答が自分が思ってたのと違うだけで、ちゃんと動作してた(最近、こんな、早とちり的な事が多い)ソフトI2Cで動作し、FT5206のマネージメントもそれなりになったので、SCIの簡易I2Cをもう一度詳細に確認。ポーリングの場合、受信動作は問題無いが、送信動作では、送信レジスターがバッファされているので、フラグを見る場合は、多少の工夫が必要な事が判った。読みしないと、スレーブアドレスが残っている。false;}空読みするコードを追加したら正しく受信動作した、ヤレヤレ。I2Cのドライバーは、全体的に考え直す必要のあるデバイスだ(SPIもそうだが・・)特に120MHzで動作しているプロセッサの場合は、ポーリングでデータを取得するような低速ドライバーは問題外と思う。(もったいない)ただ、デバイスによって、通信の手順が色々なので、単純に割り込みにしただけでは駄目で、柔軟性のある機能を提供する必要がある。手順が面倒で、新規のI2Cデバイスドライバーを実装する手間が大変だと、それはそれで、痛いので、よくよく考えて、全体を設計しておく必要がある。受信と送信データはバッファリングして、それぞれの終了で設定したコールバックを呼び出すようにすれば良さそうだ。割り込み対応のI2Cドライバーは、次の機会に紹介する。以前に理由を聞いたら「冗長」だからーとか言ってた人がいるが、機能が違うので、そんな理由で、使っては駄目だ。前提として、キャストは、なるべく使わないように設計する必要がある。「const」を取り除くような方法もいけない。言語ベースの人はこの辺りを全く気にしない人が多いので困る。