LPC1114FN28/102 (14) -- リニア PCM プレイヤー (2)

リニア PCM プレイヤーでは、MMC/SD カードから読み出したウェーブ・データを、せいぜい 8 ビット・オフセット・バイナリ形式から 2 の補数 16 ビット・データに変換する程度で、特に複雑な「処理」はせずに DAC に流しこみます。
特に 16 ビット・ステレオ・フォーマットでは、1 オーディオ・サンプルあたり 4 バイトのデータを何の変更も加えず、そのまま DAC に出力するだけです。
その場合、純粋なオーディオ・データに限れば MMC/SD カードから SPI を介して読み取るデータ量と、SPI を介して DAC に送るデータ量とは全く一致します。
実際には FAT ファイルシステムの管理用データを MMC/SD カードから読み取る必要があり、また、MMC/SD カードに対してコマンドを発行するオーバーヘッドがあるので、MMC/SD カードとインターフェースする SPI 側の方がデータ量が多くなります。
STM8S 用のプログラムの場合は、ソフト SPI (9 Mbps) とハード SPI (9 Mbps) との間に速度差がなかったので、MMC/SD カード側にソフト SPI、オーディオ DAC 側にハード SPI を使いました。
LPC1114 用のプログラムでは、ソフト SPI (6 Mbps) とハード SPI (18 Mbps) との間に大きな速度差があるので、オーディオ DAC 側にソフト SPI、MMC/SD カード側にハード SPI を使うことにしました。
DAC および micro SD カード・スロットとの接続の回路図を下に示します。

リセット・スイッチやブート・スイッチ、シリアル・インターフェース部の回路は省略しています。
micro SD カード・スロットでは、カード検出スイッチは使用していません。
MMC/SD カードの CS 信号は LPC1114FN28/102 の 25 番ピン (SSEL0) に接続してありますが、これは SSP0 の SSEL0 (Slave SELect 0) ハードウェア信号としてではなく、汎用出力ポート (GPIO ポート 0、ビット 2) として CS 信号をドライブしています。
ハードウェアの SSEL0 信号は、SPI 転送一回ごとに H→L→H の変化を繰り返し、MMC/SD カードとのインターフェース信号としては適さないためです。
DAC は毎度おなじみの ROHM BU9480F です。
GPIO のポート 0 のビット 7 (28 番ピン) をソフト SPI の SCK として DAC の BCLK (7 番ピン) につなぎ、GPIO のポート 0 のビット 3 (26 番ピン) をソフト SPI の MOSI として DAC の SDAT (7 番ピン) につないでいます。
ソフト SPI のプログラムとしては、SCK と MOSI は同じポートに割り付けるのが都合よく、また、MOSI はビット 5 〜 0 のいずれかに割り付けるのが都合がよいので、このようにしました。
サンプリング周波数 48 kHz で SCK と LRCK を観測した写真を下に示します。

上側のトレースが SCK で、下側のトレースが LRCK です。
割り込み要因としては、LRCK 信号を生成しているタイマによる割り込みひとつだけで、LRCK 信号の立ち上がりと、立ち下りとの、両エッジ付近で割り込みが発生します。 (サンプリング周波数 fs の 2 倍のレート)
タイマ割り込みハンドラ内でソフト SPI の処理をしており、DAC に対するデータ転送が終了するまで、メイン・ルーチンに制御は戻りません。
DAC にデータを転送している正味の時間は、
16 × 6.5 / (2 × 18.432 [MHz]) = 2.82 [μs]
程度で、割り込みレイテンシや割り込みハンドラ内の他の処理と合わせると、合計で 6 〜 7 μs 程度となります。
したがって、メイン・ルーチン内で MMC/SD カードとの転送に費やせる時間は 96 kHz サンプリング周期当たり 3 〜 4 μs となります。
LPC1114 の SSP モジュールには 8 レベルの FIFO バッファが内蔵されており、FIFO にフルにデータを積んでおけば、あとはハードで勝手に転送を行ってくれます。
この FIFO で間に合えば、プログラムとしては SSP 割り込みを使わずに実現できます。
FAT ファイルシステムのソフトウェアとしては ChaN さんの「FatFS」を利用していて、それに付属する LPC17xx 用のサンプル・ドライバ・ルーチンに少々の変更を加えたもので、うまく動作させることができました。
変更部分はハードウェアの差異に関する部分で、ドライバ本体には手を入れなくてすみました。
ソフト SPI のプログラム部分は次回説明することとして、最後に MOSI、SCK の波形写真を示します。 オシロの「ドット蓄積モード」を利用して「重ねがき」したものです。
最初の写真がデータの MSB (b15、符号ビット) 付近で、2 枚目の写真が LSB (b0) 付近です。