VS1063a をスタンドアロンで使用する

# はじめに

VS1063a (VS1053b でも同じ事が可能ですが、以後 VS1063a とだけ記述します)では VSDSP4 という Processor を内蔵しており、マイコンからの制御に用いる Control Interface (DREQ/SO/SI/SCLK/XCS) 経由で VS1063a のメモリへユーザーコードをロードして実行する機能があります。また、GPIO ピンに接続された外部 Serial SPI Flash からのブートも可能で、マイコンを用いずに VS1063a 単独(=スタンドアロン)でアプリケーションを実行できます。VLSI Solutions 社の [Software](http://www.vlsi.fi/en/support/software/vs10xxapplications.html) サイトでは、VS1063a で動作するスタンドアロンのアプリケーションとして Standalone Player / Recorder が公開されています。この記事では、Standalone Player (SD/MMC カード内の音楽ファイルを再生)を実際に動作させてみます。

# 準備するもの

- VS1063a 搭載基板
Standalone Player をそのまま動作させるためには、以下の条件を満たす必要があります。

  - GPIO0-GPIO3/DREQ/XCS/SI/XDCS/SO ピンが外部に引き出されている。
  - GPIO の IO 電圧が 3.3V。

該当する製品として SparkFun MP3 and MIDI Breakout - [VS1053](https://www.sparkfun.com/products/retired/9943)/[VS1063](https://www.sparkfun.com/products/retired/11684) があったのですが、既に販売終了となっています。現在入手可能なものとして [Adafruit VS1053 Codec + MicroSD Breakout - MP3/WAV/MIDI/OGG Play + Record - v4](https://www.adafruit.com/product/1381#technical-details) があります(ただし、microSD カードスロットは Standalone Player が要求する配線と異なるため利用できません)。他に VS1063a/VS1053b 搭載の Arduino Shield の中で使用できるものもあるかも知れませんが、GPIO ピンの IO 電圧には注意が必要です。DREQ/XCS/SI/XDCS/SO ピンはスイッチや LED を接続するため、配線を引き出せれば電圧は何でも問題ありません。

- 128Kbit 以上の SPI Serial Flash
Standalone Player コードを書き込むために使用します。Standalone Player が必要なサイズは約 11kbytes なので、それ以上の容量が必要です。SPI Serial Flash には読み出しコマンドのアドレスバイト数が 2バイトと3バイトのものがありますが、どちらにも対応しています。SST25VF032B (32Mbit) と MX25L4006 (4Mbit) は使用できました。SPI Serial Flash へは Standalone Player のイメージ(コンパイルして作成)をあらかじめ書き込んでおきます。また、VSIDE 上から VS1063a 経由で書き込みを行う事もできます(RX/TX の配線が必要です)。

- 押しボタンスイッチ 3個
  プレイヤーの操作に使用するボタンです。

- 使用するメモリカードとコネクタ
使用できるメモリカードは SD/SDHC/MMC です。この記事では microSD として書きます。カードは FAT または FAT32 でフォーマットして mp3 等の音楽ファイルを保存しておきます。

- 抵抗 10kΩ x 5
スイッチ等の pull up 用として。

- LED x 1 (任意)
Status indicator 用。LED に適した適当な電流制限抵抗も。

- USB シリアル変換ボード (任意)
VSIDE (後述)上から、VS1063a 経由で Serial SPI Flash を書き換えを行う場合は必要です。RX と TX ピンを接続します。

# 作業の流れ

1. 準備したものを配線する
2. VSIDE をインストール
3. Standalone Player のソースコードをコンパイルしてイメージを作成
4. 作成したイメージを SPI Flash へ書き込む

## 配線図

![vs1063a_standalone_schematic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553718/dbf53020-a715-3fee-87ea-c8c7fa449919.png)

- 配線の色はネットの区別です。
- [Standalone Player / Recoder のドキュメント](https://www.vlsi.fi/fileadmin/software/VS10XX/standalone-vs1063.pdf) の18ページに書かれている回路図からプレイヤーとしての動作に必要な最小限の配線を書き出したものです。
  - アナログ出力の配線は入れ忘れてしまいましたが、Breakout によっては必要な周辺回路が実装済みの LEFT, RIGHT, GBUF が基板上にあります。この場合はヘッドホンジャック等を配線するだけでヘッドホンを接続できます。
- Breakout board の I/O 電圧は 3.3V を想定しています。
- Breakout board 内では GPIO0 - 3 に 100kΩ の pull down が実装されているものとします。この pull down の実装は VS1063a のデータシートにて推奨されているため、ほとんどの Breakout board では実装されていると思います。
- 一見すると SPI Flash と MicroSD の SCLK/SO/SI/CS の配線は標準的な SPI とは違っています。理由については、[Standalone Player / Recoder のドキュメント](http://www.vlsi.fi/fileadmin/software/VS10XX/standalone-vs1063.pdf)に記載があります。
- BOOT はスイッチではなくジャンパピンにします。ショートすると、SPI Flash からブートします。常に SPI Flash からブートさせる場合はジャンパは不要で、10kΩで pull up しておきます。

## VSIDE をインストール

[VSIDE](https://www.vlsi.fi/en/support/software/vside.html)から Windows installer をダウンロードできます。インストール手順の[動画(YouTube)](https://www.youtube.com/watch?v=WzMSd_--xDg)があり、この中ではデフォルトのインストールパスを C:\Program Files (x86)\VSIDE から C:\VSIDE へ変更しています(ルート直下へのインストールが推奨されている様です)。

![vside_00_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553718/2cc4d28c-6d6b-d02a-bc2c-e86c1eb8571d.png)
アイコンが Windows 9x 時代の懐かしい感じです。

## Standaslone Plyer のソースコードをコンパイルしてイメージを作成

1. [VS10XX Applications] (https://www.vlsi.fi/en/support/software/vs10xxapplications.html)から、VS1063 Standalone Player/Recorder - VSIDE -> Download のファイルをダウンロードして、適当なディレクトリへ展開しておきます。

2. VSIDE を起動してメニューの File -> Open -> Solution を選択します。
![vside_01_open_solution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553718/6f5c94fb-c592-c971-dceb-a23d1260ed1f.png)

3. vs1063-standalone.solution を選択して開きます。
![vside_02_select_solution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553718/c404a0dd-6fbf-8f94-943b-1282b655479a.png)

4. Solution browser から standalone.h を選択して開きます。
![vside_04_change_direct_keys.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553718/051198b2-91cd-71eb-5edb-fd792bf70809.png)
画像の様に COMPACT_KEYS をコメントアウトして、代わりに DIRECT_KEYS を有効化します。それ以外に使用できるオプションもありますので、必要に応じて変更します。いくつかはドキュメントの「Option Definitions」に説明があります。少し下の方にある VOL_VAL はデフォルトの音量ですが、手持ちのヘッドホンで 0x2020 はかなり大きかったので0x4A4A へ変更しました。ENABLE_I2S を有効にすると、GPIO4 - GPIO7 へ I2S を出力できます。

5. メニューの Build -> Build Solutions を実行します。
![vside_05_build_solution.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553718/696e037f-498a-1f96-03fd-7f62413b8c07.png)

7. エラー等がなければイメージ作成は完了です。
![vside_06_build_completed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553718/fbe84283-eef8-2992-7ec7-1c37fb933b96.png)

## 作成したイメージを SPI Flash へ書き込む

solution のディレクトリ(vs1063-standalone-vside-dist)以下にある player.img を SPI Flash へ書き込みます。

単体での SPI Flash へ書き込み手段がない場合は、回路実装済みの状態で VS1063a を通して行う事ができます。ドキュメント (https://www.vlsi.fi/fileadmin/software/VS10XX/standalone-vs1063.pdf) の 16ページに手順の記載があります。その手順中の「SPIB jumper (JP10)」は前述した回路図では BOOT ジャンパと読み替えて下さい。SPI Flash は種類によって書き込み方法が異なりますが、色々と対応している様で、手持ちの SST25VF032B と MX25L4006 は利用できました。

書き換え時は以下の様なログが VSIDE の Log Window から出力されます。

```
VS1053/VS1063 16/24 BIT SPI EEPROMMER / FLASHER V1.2 (UNIPROM2)
(can prom up to 64K bytes)
Detecting connected SPI Flash or EEPROM type...
Read electronic signature (RDES (0xAB) method): 12 12 
Read manufacturer and product id (RDID (0x90) method): c2 12 
First 16 bytes of the chip are now:
50264800265800500030069737000024 P&H.&X.P.0..7..$
Sending a Flash Erase Block 0 (64KB) Command (0xD8)...
Erase took time, probably this is a Flash chip: Using 24-bit address.
First 16 bytes of the chip are now:
ffffffffffffffffffffffffffffffff ................
Opened file eeprom.img.
Programming blocks of data... "." means OK, "X" means error.
. 0x01 KB.. 0x02 KB.. 0x03 KB.. 0x04 KB.. 0x05 KB.. 0x06 KB.. 0x07 KB.. 0x08 KB.. 0x09 KB.. 0x0a KB..
Verifying...
.. 0x01 KB.. 0x02 KB.. 0x03 KB.. 0x04 KB.. 0x05 KB.. 0x06 KB.. 0x07 KB.. 0x08 KB.. 0x09 KB.. 0x0a KB.
Verify OK.
Finished!
First 16 bytes of the chip are now:
50264800265800500030069737000024 P&H.&X.P.0..7..$
Resetting chip.
```

# Standalone Player の操作方法

BOOT ジャンパがある場合はそれをショートした状態で電源を入れると SPI Flash からブートします。
MicroSD カード内の最初のファイルの再生が開始されます。

操作は以下の様になっています。

| スイッチ | 動作 | 動作(長押し) |
| --- | --- | --- |
| SW1 | 次の曲 | 音量を上げる |
| SW2 | 前の曲 | 音量を下げる |
| SW3 | 一時停止/解除 | 再生中: ラウドネス切り換え<br>一時停止中: シャッフル再生ON/OFF 切り換え|

# おわりに

今回 Standalone Player を動作させるまでには、

1. pyboard から VS1053b を制御してみる(https://github.com/ain1084/pyboard_vs1053_player)
1. VS1063a Breakout を作る(VS1063a を使ってみたかったので…)
1. pyboard で SPI Flash writer を作る(https://github.com/ain1084/serial_flash_writer)
1. 万能基板で配線する

といった作業があったため、実はそれなりに時間が掛かりました。VS1063a の発表当時はともかく、今日では mp3 等のデコードは安価なマイコン(ESP32 や Raspberry Pi Pico 等。しかも VS1063a チップ単体よりも安価…)のソフトウェアのみで実現できてしまう様です。わざわざ専用チップを用いるメリットはあまり無いかも知れません…。一番苦労したのは最後の万能基板の配線だったりします(Breakout 等、数枚が必要であれば PCB を作ってしまうのですが、一枚だけしか必要ないから…と始めたら、結構な時間が掛かってしまいました)。

作成したプレイヤーは机の隅に置いて、テレワーク中のお供として使用しています。
![IMG_20210913_025931 - コピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553718/40d4b4a5-921b-e6ff-c846-e3e5cd27526c.jpeg)