FR60 マイコン基板 (15) -- ベースボード製作(2)

ベースボードの製作では、ディジタル・オーディオ用 16 ビットシリアル DAC の ROHM BU9480F を接続しました。
BU9840F は推奨電源電圧範囲が 3.0 〜 5.5 V ですから、3.3 V 電源での動作に問題はありません。
シリアル DAC の LRCK 信号は PPG2 で発生させることにしました。
BCLK および SDAT の発生には通常 SPI を使いますが、FR60 には SPI はないので、UART を使います。
名前は「UART」ですが、同期転送の機能も含まれています。
同期転送のために必要な初期設定は次のようになります。

IO_PORT.IO_PFR2.bit.UART4 = 1; // enable UART4
IO_PORT.IO_PFR2.bit.SCKE4 = 1; // enable SCK4
IO_UTIMC4.bit.UCC1 = 0 ; // (2*n+2) mode
IO_UTIM4           = 3; // 20 / 8 = 2.5 Mbps 
IO_UTIMC4.bit.UTST = 1 ; // U-Timer start
IO_SMR4.bit.MD  = 2; // synchronous mode
IO_SCR4.bit.CL  = 1; // 8 bit data
IO_SCR4.bit.AD  = 0; // data frame
IO_SSR4.bit.BDS = 1; // MSB first
IO_SCR4.bit.TXE = 1; // enable Tx

もとが UART なので、受信側だけでなく送信側にもバッファレジスタが存在します。
したがって、2008 年 1 年 19 日の記事 (id:pcm1723:20080119) の SH2 の場合のように、割り込みルーチンでフラグチェックをせずに 1 バイト目を書き込み、間に少し処理をはさんで、2 バイト目を書き込みます。
具体的なコードは次のようになります。

__interrupt void ppg2_int(void)
{
  short int w;
  t1_tick = 1; // set timer1 tick flag
  IO_PCN2.bit.IRQF = 0; // clear flag
  w  = wave_que[wq_rd_ix]; // wave data
  IO_SIDR4 = (w >> 8); // send hi byte to serial DAC
  IO_PDUT3  = (0x8000 ^ (w + (1 << 6))) >>7; 
  wq_rd_ix = (wq_rd_ix + 1) & (WAVEQUESIZE-1);
  IO_SIDR4 = w; // send lo byte to serial DAC
} // __interrupt void ppg2_int()