音声の録音媒体としてはATMELのDataFlashというSPIでつながるフラッシュを使っています。LCDボード上に32MBのNAND Flashが載っていますので、これを使うこともできるのですが、DataFlashはSPIを使ってどんなマイコンにでもつなげられそうなので、試しに使ってみたくなったのです。
実際に使っているのはAT45DB161の8ピンパッケージです。容量は16MbitですのでW-SIMから出力されるmu-Law PCMをそのまま記録しても4分程録音できる計算になります。データシートを読んでみてわかった概要を書きだしてみると。。
![](https://blogimg.goo.ne.jp/user_image/1f/58/defd65ffba1615e3f5c03409d7ae92eb.jpg)
上図はデータシートからブロック図を抜きだしたものです。64K PCM音声では512バイトは1/16秒すなわち62.5ms程度ですので、2つのバッファを使わなくとも書き込み処理は間に合いそうです。しかし2つのバッファを使えば処理時間には余裕がありますし、逐次音声データを内蔵バッファに転送していき、内蔵バッファがいっぱいになった時点でフラッシュのプログラムを行うことにより、マイコン側で用意するバッファメモリ量を小さく抑えることができます。わたしは、SSCで64バイト受信する毎にDMA完了割り込みにより、録音タスクを起床させてDataFlashの内蔵バッファへの転送をおこなうことにしました。
DataFlashにはいくつもコマンドが用意されているのですが、次のコマンドだけで録音/再生に必要な読み書きは実現できるようです。
実際に使っているのはAT45DB161の8ピンパッケージです。容量は16MbitですのでW-SIMから出力されるmu-Law PCMをそのまま記録しても4分程録音できる計算になります。データシートを読んでみてわかった概要を書きだしてみると。。
- 1ページ512または528バイトで、4096ページの構成。
- ページ単位での読み書き、消去ができる。ブロック単位での消去の必要がないので、ブロックを全く意識しないで使える。
- 書き込み(プログラム)に先立って、自動的に消去をしてくれるコマンドが用意されている。こいつを使えば、消去操作を意識せずに使える。ただし、最大で40msの時間が必要。
- 512/528バイトのSRAMバッファを2つ内蔵。ホストがひとつのバッファへの読み書きを実行している最中に、もうひとつのバッファとフラッシュの間でデータの読み書き(プログラム)を実行可能。
![](https://blogimg.goo.ne.jp/user_image/1f/58/defd65ffba1615e3f5c03409d7ae92eb.jpg)
上図はデータシートからブロック図を抜きだしたものです。64K PCM音声では512バイトは1/16秒すなわち62.5ms程度ですので、2つのバッファを使わなくとも書き込み処理は間に合いそうです。しかし2つのバッファを使えば処理時間には余裕がありますし、逐次音声データを内蔵バッファに転送していき、内蔵バッファがいっぱいになった時点でフラッシュのプログラムを行うことにより、マイコン側で用意するバッファメモリ量を小さく抑えることができます。わたしは、SSCで64バイト受信する毎にDMA完了割り込みにより、録音タスクを起床させてDataFlashの内蔵バッファへの転送をおこなうことにしました。
DataFlashにはいくつもコマンドが用意されているのですが、次のコマンドだけで録音/再生に必要な読み書きは実現できるようです。
Opcode | Command |
---|---|
84h | Buffer 1 Write |
87h | Buffer 2 Write |
83h | Buffer 1 to Main Memory Page Program with Built-in Erase |
86h | Buffer 2 to Main Memory Page Program with Built-in Erase |
53h | Main Memory Page to Buffer 1 Transfer |
55h | Main Memory Page to Buffer 2 Transfer |
84h | Buffer 1 Read |
87h | Buffer 2 Read |
D7h | Status Register Read |