AN07-00215-1

本ドキュメントはCypress (サイプレス) 製品に関する情報が記載されております。
AN07-00215-1
FR Family
FR80 MB91605A
ソフトウェア I2S バス制御方法
AN07-00215-1
注意事項

本資料の記載内容は、予告なしに変更することがありますので、ご用命の際は営業部
門にご確認ください。

本資料に記載された動作概要や応用回路例は、半導体デバイスの標準的な動作や使い
方を示したもので、実際に使用する機器での動作を保証するものではありません。し
たがいまして、これらを使用するにあたってはお客様の責任において機器の設計を行
ってください。これらの使用に起因する損害などについては、当社はその責任を負い
ません。

本資料に記載された動作概要・回路図を含む技術情報は、当社もしくは第三者の特許
権、著作権等の知的財産権やその他の権利の使用権または実施権の許諾を意味するも
のではありません。また、これらの使用について、第三者の知的財産権やその他の権
利の実施ができることの保証を行うものではありません。したがって、これらの使用
に起因する第三者の知的財産権やその他の権利の侵害について、当社はその責任を負
いません。

本資料に記載された製品は、通常の産業用、一般事務用、パーソナル用、家庭用など
の一般的用途に使用されることを意図して設計・製造されています。極めて高度な安
全性が要求され、仮に当該安全性が確保されない場合、社会的に重大な影響を与えか
つ直接生命・身体に対する重大な危険性を伴う用途(原子力施設における核反応制御、
航空機自動飛行制御、航空交通管制、大量輸送システムにおける運行制御、生命維持
のための医療機器、兵器システムにおけるミサイル発射制御をいう)、ならびに極め
て高い信頼性が要求される用途(海底中継器、宇宙衛星をいう)に使用されるよう設
計・製造されたものではありません。したがって、これらの用途にご使用をお考えの
お客様は、必ず事前に営業部門までご相談ください。ご相談なく使用されたことによ
り発生した損害などについては、責任を負いかねますのでご了承ください。

半導体デバイスはある確率で故障が発生します。当社半導体デバイスが故障しても、
結果的に人身事故、火災事故、社会的な損害を生じさせないよう、お客様は、装置の
冗長設計、延焼対策設計、過電流防止対策設計、誤動作防止設計などの安全設計をお
願いします。

本資料に記載された製品を輸出または提供する場合は、外国為替及び外国貿易法およ
び米国輸出管理関連法規等の規制をご確認の上、必要な手続きをおとりください。

本書に記載されている社名および製品名などの固有名詞は、各社の商標または登録商
標です。
Copyright© 2009 FUJITSU MICROELECTRONICS LIMITED all rights reserved
1
AN07-00215-1
改版履歴
版数
日付
内容
1.0 版
2009.3.27
新規作成
2
AN07-00215-1
目次
注意事項 ...............................................................................................................................1
改版履歴 ...............................................................................................................................2
目次 ...................................................................................................................................... 3
1
はじめに ........................................................................................................................ 4
2
マニュアル..................................................................................................................... 5
2.1
3
4
本アプリケーションにて使用されているマニュアルについて............................... 5
ハード構成..................................................................................................................... 6
3.1
回路例..................................................................................................................... 6
3.2
I2S制御の実現方法.................................................................................................. 6
ソフトウェア ................................................................................................................. 9
4.1
動作 ........................................................................................................................ 9
4.2
音楽データ設定方法 ............................................................................................. 10
4.3
サンプルソフト .................................................................................................... 12
3
AN07-00215-1
1
はじめに
本アプリケーションノートは、富士通マイクロエレクトロニクス製 32 ビット MCU FR80
MB91605A のマルチファンクションシリアルインターフェイスとベースタイマによって、旭化成エレ
クトロニクス株式会社製 96kHz, 24bitΔΣD/A コンバータ(AK4353)を、ソフトウェア I2S 制御する
方法について説明します。
なお、本 I2S 制御は、マルチファンクションシリアルインターフェイス(FIFO 付き)2chと、ベースタ
イマ 2ch が搭載されていれば、他品種でも同様に制御可能です。
4
AN07-00215-1
2
マニュアル
2.1
本アプリケーションにて使用されているマニュアルについて
・旭化成エレクトロニクス株式会社製の 96kHz, 24bitΔΣD/A コンバータ(AK4353)のデータシー
トは下記の URL を参照してください。
http://www.asahi-kasei.co.jp/akm/japanese/product/ak4353/ak4353.html
・Philips 社提唱の I2S Bus 規格については、下記 URL を参照してください。
http://www.nxp.com/acrobat_download/various/I2SBUS.pdf
・富士通マイコンに関するハードウエアドキュメント類、データシート類は下記の URL か
らダウンロード可能です。
http://jp.fujitsu.com/microelectronics/brochures/(日本語)
http://www.fujitsu.com/global/services/microelectronics/documents/(English)
※上記 URL は予告なく変更される可能性があります。
5
AN07-00215-1
3
ハード構成
3.1
回路例
3.3V
マイコン
FR80 MB91605A
3.3V
D/A コンバータ 3.3V
(AK4353)
TIOA1
BICK
SCK6
SOT6
LRCLK
SCK5
SOT5
SDTI
図 1. MB91605A と I2S インターフェイス D/A コンバータの接続例
図 1 に示した、マイコン MB91605A と 24bitΔΣD/A コンバータ(AK4353)の接続例にて、ソフト
ウェア I2S 制御で音楽再生する事が可能です。通常、I2S 制御ハード回路にて実現されますが、こ
こでは表 1 に示した周辺機能を用いる事で I2S 制御を実現しています。
表 1.ソフトウェア I2S 制御で使用する周辺機能
周辺機能
チャネル数
動作モード
マルチファンクションシリアル I/F
2 (Ch5,Ch6 使用)
CSIO モード
2 (Ch0,Ch1 使用)
リロードタイマモード
(送受信用 16Byte FIFO 付き)
ベースタイマ
3.2
I2S制御の実現方法
図 2 にソフトウェア I2S 制御方法の詳細を示します。ベースタイマ ch1(リロードタイマモ
ード)の TIOA1 端子から I2S 用クロックを出力し、このクロックをマルチファンクションシ
リアルインターフェイス ch5/ch6(CSIO モード)の SCK5/SCK6 端子に入力する事で、クロ
ックに同期したデータ転送を行ないます。SOT6 端子は LRCLK 信号、SOT5 端子はデータ
信号となります。また、今回再生する音楽データは 44.1kHz サンプリングデータである為、
ベースタイマ ch0 にて、44.1kHz 周期割り込みを発生し、音楽データを送信します。
6
AN07-00215-1
ベースタイマ
ch0
割り込み 44.1kHz
CPU
ベースタイマ
Ch1
D/A コンバータ
(AK4353)
TIOA1
2.8Mbps
BICK
L
SCK6
CSIO ch6
FIFO
16Byte
SOT6
LRCLK
R
SCK5
CSIO ch5
FIFO
16Byte
SOT5
SDTI
外バス
PCM データ
(FLASH)
図 2. MB91605A での I2S インターフェイス制御方法
ソフトウェア I2S 制御にて出力される波形は、図 3 の通りです。データ送信前に、1 周期
(44.1kHz)送信データ分(音楽データ:8Byte,LRCLK 用データ:8Byte)を送信用 FIFO に書き込みま
す。4 章で説明するサンプルソフトでは、最初の周期の LRCLK 用データは 0xFF,0xFF,0xFF,
0xFF  0xFF,0xFF,0xFF,0xFE、音楽データは Low(0x00×8)としています。これは、送信開始前
の SOT 端子レベルが High であるためです。
送信開始前の FIFO 書き込み後、ベースタイマ ch0 と ch1 の同時起動により送信開始し、
88.2kHz(44.1kHz の半周期)でベースタイマ ch0 割り込みが発生します。ここで、ベースタイマ ch0
の割り込み周期は 44.1kHz に変更し、音楽データと LRCLK 用データ(8Byte×2)を書き込みます。
2 回目以降は、44.1kHz 周期で割り込み発生し、音楽データと LRCLK 用データを、44.1kHz の中
間点で FIFO に書き込みます。2 回目以降の LRCLK 信号は、0x00,0x00,0x00,0x010xFF,
0xFF,0xFF,0xFE データを繰り返し送信する事で実現します。
今回再生する音楽データフォーマットを表 2 に示します。再生する音楽データフォーマットに合
わせて、I2S インターフェイスのデータ転送速度や送信データ長を調整します。
7
AN07-00215-1
図 3. ソフトウェア I2S 出力波形
表 2.音楽データフォーマット
項目
フォーマット
形式
PCM(Pulse Code Modulation) 非圧縮データ
サンプリング周波数
44.1kHz
ビット長
16bit
音質
ステレオ
8
AN07-00215-1
4
ソフトウェア
4.1
動作
24bitΔΣD/A コンバータ(AK4353)に、I2S インターフェイスで音楽データを送信する事で、
音楽再生が可能です。ここででは、PCM(Pulse Code Modulation)非圧縮音楽データを外部メ
モリ上に格納し、音楽再生するサンプルソフトについて説明します。今回のサンプルソフトでは、図
4 に示した領域に音楽データを格納しています。なお、キャッシュメモリをプログラム領域にて効率
良く使用するため、図 4 のようにキャッシュ領域を設定しています。音楽データのリードは、キャッ
シュ不可設定のミラー領域(0x40500000~0x405FFFFF)にアクセスしています。
0x00000000
0x00007FFF
0x00020000
0x0003FFFF
0x00040000
0x00500000
I/O 領域
キャッシュ領域設定
内蔵 RAM 128KB
外部領域
音楽データ
キャッシュ可能設定
0x005FFFFF
0x1003FFFF
0x20000000
SDRAM 領域
0x23FFFFFF
0x40000000
0x40500000
外部ミラー領域
音楽データアクセス先
音楽データ(ミラー領域)
0x405FFFFF
キャッシュ不可設定
0x4FFFFFFF
0x60000000
SDRAM ミラー領域
0x63FFFFFF
0xFFFFFFFF
図 4. 音楽データの外部 FLASH メモリへの格納
9
AN07-00215-1
4.2
音楽データ設定方法
本アプリケーションノートでは、以下ICEを使った開発環境にて、音楽データを設
定する方法を説明します。MB91605Aアダプタ搭載SRAM(外部メモリエミュレーション)上
でプログラム実行します。
メインユニット: MB2198-01
DSU ケーブル: MB2198-10
MB91605A アダプタ:
MB2198-81-E
以下フォルダ内にある音楽PCMデータファイル(test.wave)を、MB91605Aアダプタ搭
載SRAMにロードします。
AN07-00215-1¥SIO_91605
音楽データセット方法は以下の通りです。
(1)SOFTUNE メニューの”表示” => “メモリ” を選択します。表示位置は、音楽
データのロード開始番地である 0x500000 とします。
(2)メモリウィンドウ上で右クリックし特殊操作を選択します。充填にて、
0x500000~0x5FFFFF のデータを 0 クリアします。
10
AN07-00215-1
(3) SOFTUNE メニューの”ファイル” => “開く” を選択します。ファイルの種類はバイナ
リファイルを選択します。
以下フォルダのtest.wave(音楽PCMデータファイル)を選択します。ファイルの種類
は、” 全てのファイル” とし、開始アドレスは 0x500000 を指定してください。0x500000
番地から、test.wave(音楽PCMデータファイル)がロードされます。
AN07-00215-1¥SIO_91605
11
AN07-00215-1
4.3
サンプルソフト
サンプルソフトでの各関数の関係を下記に示します。
main()
読み出し
①
clock()
②
③
synch_CSIO_TX()
④
initial_BASE_TIMER()
割り込み
base_timer_0()
music_data_set()
図 5: 各関数の関係
12
enable_I2S_bus()
AN07-00215-1
関数名
引数
戻り値
処理内容
void clock(void)
Void
void
本関数はマイコンの動作クロックを以下の通り設定します。
CPU 動作クロック 80MHz(原発振 16MHz 時)
周辺機能動作クロック 40MHz, 外バス動作クロック 80MHz
void clock(void)
{
/* PLL configuration */
IO_CLKG.IO_PLLCR.hword = 0x14d0;
IO_CLKG.IO_CSELR.byte = 0x60;
/* CLK 5_PLL */
/* PLL Enable */
/* Waiting for PLL Lock */
while(IO_CLKG.IO_CMONR.byte != IO_CLKG.IO_CSELR.byte);
/* Clock divide configuration */
IO_CLK.IO_DIVR0.byte = 0x00;
IO_CLK.IO_DIVR1.byte = 0x80;
IO_CLK.IO_DIVR2.byte = 0x10;
/* BCLK : 1 divide */
/* TCLK : 1 divide */
/* PCLK : 2 divide */
/* clocksource select PLL1(80MHz) */
IO_CLKG.IO_CSELR.byte = 0x62;
/* PLL clock select */
}
13
AN07-00215-1
関数名
引数
戻り値
処理内容
void synch_CSIO_TX(void)
void
void
本関数はマルチファンクションシリアル I/F ch5 と ch6 の初期設定を行ないます。
マルチファンクションシリアル I/F ch5 ( I2S SDTI)
マルチファンクションシリアル I/F ch6 ( I2S LRCLK )
void synch_CSIO_TX(void)
{
IO_PORT2.IO_PFRA.byte = 0x12;
/* SOUT5,SOUT6 output enable */
/* SIO5 mode setting */
IO_UART5.CSIO5.SMR5.byte = 0x44;
IO_UART5.CSIO5.SMR5.bit.SOE = 1;
/* Synchronous serial mode, MSB first */
/* Serial Data output enable */
/* SIO6 mode setting */
IO_UART6.CSIO6.SMR6.byte = 0x44;
IO_UART6.CSIO6.SMR6.bit.SOE = 1;
/* Synchronous serial mode, MSB first */
/* Serial Data output enable */
/* CSIO FIFO control resister setting */
IO_UART5.CSIO5.FCR15.byte = 0x00;
IO_UART5.CSIO5.FCR05.byte = 0x01;
IO_UART6.CSIO6.FCR16.byte = 0x00;
IO_UART6.CSIO6.FCR06.byte = 0x01;
/* CSIO FIFO control resister setting */
IO_UART5.CSIO5.FBYTE25 = 0x00;
IO_UART5.CSIO5.FBYTE15 = 0x00;
IO_UART6.CSIO6.FBYTE26 = 0x00;
IO_UART6.CSIO6.FBYTE16 = 0x00;
次ページへ続く
14
/* FIFO enable */
/* FIFO enable */
AN07-00215-1
前ページから
/* CSIO control resister setting */
IO_UART5.CSIO5.SCR5.byte = 0x40;
IO_UART6.CSIO6.SCR6.byte = 0x40;
/* Slave mode */
/* Slave mode */
IO_UART6.CSIO6.RDR6 = 0xFF;
IO_UART5.CSIO5.RDR5 = 0x00;
IO_UART6.CSIO6.RDR6 = 0xFF;
IO_UART5.CSIO5.RDR5 = 0x00;
IO_UART6.CSIO6.RDR6 = 0xFF;
IO_UART5.CSIO5.RDR5 = 0x00;
IO_UART6.CSIO6.RDR6 = 0xFF;
IO_UART5.CSIO5.RDR5 = 0x00;
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
IO_UART6.CSIO6.RDR6 = 0xFF;
IO_UART5.CSIO5.RDR5 = 0x00;
IO_UART6.CSIO6.RDR6 = 0xFF;
IO_UART5.CSIO5.RDR5 = 0x00;
IO_UART6.CSIO6.RDR6 = 0xFF;
IO_UART5.CSIO5.RDR5 = 0x00;
IO_UART6.CSIO6.RDR6 = 0xFE;
IO_UART5.CSIO5.RDR5 = 0x00;
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
/* 1st cycle data in to the FIFO */
}
15
AN07-00215-1
関数名
引数
戻り値
処理内容
void initial_BASE_TIMER(void)
void
void
本関数はマイコンのベースタイマ ch0 と ch1 を以下の通り設定します。
ベースタイマ ch0 (I2S 用クロック出力用: 2.8MHz)
ベースタイマ ch1 (音楽再生周期割り込み用: 44.1kHz)
void initial_BASE_TIMER(void)
{
/*****************************************************************************/
/* initialization BASE timer 0 reload mode 16bit */
/*****************************************************************************/
IO_BTSEL0123.byte = 0x05;
/* sync enable mode ch0/1*/
IO_BT0.IO_RT.IO_TMCR.hword = 0x0000;
/* BaseTimer ResetMode */
IO_BT0.IO_RT.IO_TMCR.hword = 0x0130;
/* Reload Mode, rising edge triger */
IO_BT0.IO_PPG.IO_STC.bit.UDIE = 1;
IO_ICR[33].byte = 0x10;
IO_BT0.IO_RT.IO_PCSR = 0x01BF;
/* Interrupt Enable */
/* Interrupt priority */
/*25ns*(0x1bf+1)=11.2us(44.64kHz*2) */
IO_BT0.IO_RT.IO_TMCR.bit.CTEN = 1;
/* Count enable */
/*****************************************************************************/
/* initialization BASE timer 1 reload mode 16bit */
/*****************************************************************************/
IO_PORT2.IO_PFRD.bit.PFRD3 = 0;
IO_PORT2.IO_PFRD.bit.PFRD2 = 1;
/* TIOA1 BaseTimer1 Normal output */
IO_BT1.IO_RT.IO_TMCR.hword = 0x0130;
IO_BT1.IO_PPG.IO_STC.bit.UDIE = 1;
IO_BT1.IO_RT.IO_PCSR = 0x0006;
IO_BT1.IO_RT.IO_TMCR.bit.CTEN = 1;
/* Reload Mode, rising edge triger */
/* Interrupt Enable */
/*25ns*(0x0006+1)=175ns(2.85MHz*2) */
/* Count enable */
}
16
AN07-00215-1
関数名
引数
戻り値
処理内容
enable_I2S_bus(void)
void
void
本関数は I2S を起動します。マルチファンクションシリアル I/F ch5 と ch6 を送
信許可し、ベースタイマ ch0(音楽データのサンプリング周期用)と ch1(I2S クロ
ック用)を同時起動します。
void enable_I2S_bus(void)
{
chk=0;
Music_data = (M_dat *)0x40500000;
IO_UART6.CSIO6.SCR6.bit.TXE = 1;
IO_UART5.CSIO5.SCR5.bit.TXE = 1;
BTSSSR = 0x0003;
}
関数名
引数
戻り値
処理内容
/* Transmit enable */
/* Transmit enable */
/* Base timer ch0/1 enable*/
base_timer_0(void)
void
void
音楽データと LRCLK 用データセットのタイミング調整の為、1 回目の割り込み
のみ 44.1kHs の半周期(88.2kHz)で設定します。タイミングチャートは図 3 を参
照。
1 回目の割り込み:44.1kHz の半周期(88.2kHz)
2 回目以降の割り込み:44.1kHz の周期
unsigned char chk;
__interrupt void base_timer_0(void)
{
if (chk == 0)
{
IO_BT0.IO_RT.IO_PCSR = 0x037F;
BTSSSR = 0x0001;
chk = chk +1;
}
/* at only first interrupt */
/* 25ns*(0x37F+1) = 22.4us(44.64kHz) */
/* timer enable ch0 */
music_data_set();
IO_BT0.IO_RT.IO_STC.bit.UDIR = 0;
/* music data set */
/* interrupt flag clear */
}
17
AN07-00215-1
関数名
引数
戻り値
処理内容
void music_data_set(void)
void
void
本関数は、シリアル出力 SOT5 から音楽データ、シリアル出力 SOT6 から LRCLK
用データを送信します。
typedef union {
unsigned int word;
unsigned char byte[4];
} M_dat;
volatile M_dat *Music_data;
void music_data_set(void)
{
M_dat temp;
unsigned int b0,b1,b2,b3;
temp.word = Music_data->word;
/* external FLASH ==> RAM */
b0 = temp.byte[0];
b1 = temp.byte[1];
b2 = temp.byte[2];
b3 = temp.byte[3];
/* "RAM ==> Register" at speed optimize */
/* "RAM ==> Register" at speed optimize */
/* "RAM ==> Register" at speed optimize */
/* "RAM ==> Register" at speed optimize */
IO_UART6.CSIO6.RDR6 = 0x00;
IO_UART5.CSIO5.RDR5 = b1;
IO_UART6.CSIO6.RDR6 = 0x00;
IO_UART5.CSIO5.RDR5 = b0;
IO_UART6.CSIO6.RDR6 = 0x00;
IO_UART5.CSIO5.RDR5 = 00;
IO_UART6.CSIO6.RDR6 = 0x01;
IO_UART5.CSIO5.RDR5 = 00;
/* LRCLK data in to the FIFO */
/* music data in to the FIFO */
/* LRCLK data in to the FIFO */
/* music data in to the FIFO */
/* LRCLK data in to the FIFO */
/* dummy data in to the FIFO */
/* LRCLK data in to the FIFO */
/* dummy data in to the FIFO */
IO_UART6.CSIO6.RDR6 = 0xff;
IO_UART5.CSIO5.RDR5 = b3;
IO_UART6.CSIO6.RDR6 = 0xff;
IO_UART5.CSIO5.RDR5 = b2;
IO_UART6.CSIO6.RDR6 = 0xff;
IO_UART5.CSIO5.RDR5 = 0x00;
IO_UART6.CSIO6.RDR6 = 0xfe;
IO_UART5.CSIO5.RDR5 = 0x00;
/* LRCLK data in to the FIFO */
/* music data in to the FIFO */
/* LRCLK data in to the FIFO */
/* music data in to the FIFO */
/* LRCLK data in to the FIFO */
/* dummy data in to the FIFO */
/* LRCLK data in to the FIFO */
/* dummy data in to the FIFO */
Music_data++;
Music_data = (M_dat *)(0x40500000 | (unsigned int)Music_data & 0x000ffffc);
}
18