BeagleBone BlackでPCM5122 DACを鳴らす(その1)

TI社PCM5122を用いたI2S I/F DACをブレッドボード上に組み、BBBで鳴らすことができたので記録を残すことにする。

I2S I/FのDACとの接続に関する情報はRaspberry Piの方が豊富でBBB関連では限られている。
調べた限りではBBBで使用できそうなI2S Audio Driverは二つある。
一つはBBB向けというよりはBBBのSoCを用いたAM335X EVM用の以下のAudio Driverを用いる方法。
AM335x Audio Driver’s Guide

この方法はTIの純正ドライバを用いるのだが、簡単には試せそうになく早々に諦めた。

もう一つの方法は以下のサイトで公開されているbotic driverを用いる方法。
BeagleBone Black with I2S, DSD and SPDIF interface

こちらは良く整備されていてSDカードのディスクイメージをSDカードに焼くだけで試せるようだ。

ただ、その前にI2S I/F DACを用意する必要がある。
I2S I/F DACは海外サイトで販売しているところもあるが、今回は自作を試みる。
使用するDACはPCM5122とする。
PCM5122はI2S I/Fを持つTI社の32bit DACである。
選定理由は入手しやすいこと、インターネット上でRaspberry Pi用としての作例が比較的多い事と、機能の豊富さが気に入ったからだ。
PCM5122にはハードウェアモードとソフトウェアモードがあり、ソフトウェアモードにはSPIモードとI2Cモードがある。
多くの機能を用いる為にはソフトウェアモードを選択する必要があるのでより簡単に接続できるI2Cモードを選ぶ事とする。

PCM5122のデータシートは以下。
http://www.ti.com/lit/ds/symlink/pcm5122.pdf

以下に今回試作した回路図を示す。

部品表は以下。

 

記号キゴウ 型番カタバン 仕様シヨウ諸元ショゲントウ 定数ジョウスウトウ 数量スウリョウ 入手ニュウシュサキ
C1,C2,C3,C4,
C12,C15,C16
チップ積層セキソウセラミックコンデンサ 0.1μF 7 秋月アキヅキ電子デンシ
C5,C7 ケミカル電界デンカイコンデンサ 470μF 2 秋月アキヅキ電子デンシ
C6,C8 導電性高分子アルミ固体電解コンデンサ 330μF 2 秋月アキヅキ電子デンシ
C9 ラジアルリード積層セキソウセラミックコンデンサ 0.1μF 1 秋月アキヅキ電子デンシ
C10,C11 ラジアルリード積層セキソウセラミックコンデンサ 0.2μF 2 秋月アキヅキ電子デンシ
C13 ケミカル電界デンカイコンデンサ 10μF 1 秋月アキヅキ電子デンシ
C14 ケミカル電界デンカイコンデンサ 10μF 1 秋月アキヅキ電子デンシ
C17,C18 ポリエステルフィルムコンデンサ 2.2nF 2 秋月アキヅキ電子デンシ
R1,R2,R3 アキシャルリードカーボン抵抗テイコウ(1/4W) 10Ω 3 秋月アキヅキ電子デンシ
R4,R5,R7,R8 アキシャルリードカーボン抵抗テイコウ(1/4W) 5.6KΩ 4 秋月アキヅキ電子デンシ
R9,R10 金属皮膜抵抗(1/4W) 470Ω 2 秋月アキヅキ電子デンシ
U1,U2 NJM2863F33 ローノイズ低飽和型レギュレータ  3.3V100mA 2 秋月アキヅキ電子デンシ
U3 PCM5122 オーディオ・ステレオ DAC 1 RSオンライン
D028 28ピンICピッチ/DIP変換基板 1 マルツパーツカン
SOT23/DIP変換基板 金フラッシュ 2 秋月アキヅキ電子デンシ
3.5mmステレオミニジャックDIP化キット 1 秋月アキヅキ電子デンシ
EIC-801 ブレッドボード 1 秋月アキヅキ電子デンシ
ホソピンヘッダ 秋月アキヅキ電子デンシ
ブレッドボードヨウ線材センザイ
           

電源回り以外はほぼリファレンス通りとしている。
I2Cモードは4本のGPIOが電源オンリセットで全て入力となるので端子処理が必要だ。
GPIOでLED等のコントロールを行えば色々な情報と同期させる事ができ見た目綺麗であるが、今回は使用しないので全てプルダウンすることとする。

PCM5122の電源はデジタル、アナログ、チャージポンプの三系統。
デジタル電源はBBBのDC_3.3Vから直接とる。
独立した電源を用意した方がノイズ対策的には良いのだろうが、BBBのVDD3.3とPCM5122のDVDDとの間で起動時/電源断時に電位差が 生じた場合、BBB/PCM5122双方の端子にVDDを超える電圧が残り、ダメージを与える可能性が否定できない。
今回は安全サイドに振る。
アナログ電源とチャージポンプの電源はそれぞれ独立させる事とする。
チャージポンプはノイズ源であるので、アナログ電源とは分離する方が良いだろう。
これら二つの電源には大きな容量のコンデンサを付けるので電源断後すぐに再電源投入してしまうとデジタル電源は抜けるがアナログ電源と チャージポンプ電源の電荷が抜けずに不良リセットとなる可能性がある。
再電源投入はコンデンサ放電までの時間を空ける必要があるが運用でカバーする。

3.3VレギュレータはNJM2863F33を用いる。
表面実装部品であるのでブレッドボードで用いる為には変換基板と細ピンヘッダが必要であるが全て秋月で揃える事ができる。
作例ではSOT23/DIP変換基板上にチップコンデンサの実装及び配線を行い3V3POWER_DBとしたドータボードを2個作成して用いている。
このドータボードをブレッドボードの中心に配置すると上半分を入力電源、下半分を出力電源とすることができ、取り回しが楽になるので好んで用いている。
2番と5番の短絡にはブレッドボード用の配線の足を適当に切って使用している。
変換基板の方に予備ハンダを行い、ネオバンの和紙ばんそうこうで配線を立たせた状態で仮止めして上からピンセットで押さえながらハンダ付けすると良い。
ブレッドボード用の配線の被膜は耐熱ではないので手早く行う必要がある。

PCM5122はTSSOP28ピンパッケージであるので同じく変換基板が必要となる。
TSSOP28ピン用の変換基板というのは意外と少なく、同じ0.65mmピッチの28ピンSSOP用変換基板で左右のランド間が短いものを選択する。
ダイセン電子工業のD028というものが入手性が良さそうだ。
私はマルツパーツ館で購入した。

28ピンSSOPのハンダ付けは位置合わせがうまくいけばそれほど難しいものではない。
前述の和紙ばんそうこうを細長く切りICの仮止め/位置の微調整を行い、ハンダで仮止めを行った後、網線でハンダブリッジを無くすよう調整してゆく。
とはいえ最近老眼だけなく白内障も進んでいる為、ルーペで見ても良く判らない。
カンでハンダ付けして付いているハズと信じて、隣り合うピンで短絡していなければ問題ないとしている。

作例ではD028基板上にC9~C13,C15,C16を実装している。
これはノイズ対策というよりもブレッドボード上で組む都合上。
音質は音が鳴ってから考える。

電源基板とDAC基板ができれば後はブレッドボード上に配置すれば完成となる。
LPF用のCR(C17,C18,R9,R10)と3.5mmステレオミニジャックDIP化基板は別のブレッドボード上に配置した。
C17,C18はルビコンのポリエステルフィルムコンデンサを使用している。
LPFはカットオフ周波数の絶対値よりも左右のバランスを気にするべきなので、マルチメータで計測して近い数値のものを選別して使用すると良い。

次にbotic demo用のmicro SDカードを作成する。
母艦(ゲストOS)上で作業を行う。
適当なmicro SDカードを母艦(ゲストOS)に認識させる。
以下はmicro SDが/dev/sdbとして認識されている場合の例。
botic demoのイメージを取得しmicro SDに焼きこむ。
すごく時間がかかる。

temp-host@temp-host:~$ mkdir botic_demo
temp-host@temp-host:~$ cd botic_demo
temp-host@temp-host:~/botic_demo$ wget http://bbb.ieero.com/botic3/bbb-demo-botic-v3-2gb.img.gz
--2015-01-05 22:44:40--  http://bbb.ieero.com/botic3/bbb-demo-botic-v3-2gb.img.gz
bbb.ieero.com (bbb.ieero.com) をDNSに問いあわせています... 74.220.219.62
bbb.ieero.com (bbb.ieero.com)|74.220.219.62|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 163338160 (156M) [application/x-gzip]
`bbb-demo-botic-v3-2gb.img.gz' に保存中

100%[======================================>] 163,338,160 5.23MB/s   時間 36s  

2015-01-05 22:45:16 (4.38 MB/s) - `bbb-demo-botic-v3-2gb.img.gz' へ保存完了 [163338160/163338160]

temp-host@temp-host:~/botic_demo$ gzip -d ./bbb-demo-botic-v3-2gb.img.gz
temp-host@temp-host:~/botic_demo$ sudo dd if=bbb-demo-botic-v3-2gb.img of=/dev/sdb
[sudo] password for temp-host: 
3481600+0 レコード入力
3481600+0 レコード出力
1782579200 バイト (1.8 GB) コピーされました、 5244.38 秒、 340 kB/秒
temp-host@temp-host:~/botic_demo$

取り急ぎ立ち上げてみる。
母艦(ゲストOS)からmicro SDを取り外し、BBBにセットして起動を行う。
コンソールはWindows8.1 ノートPCからUSBシリアルTTLケーブルを介し、TeraTermでシリアル接続で行う。
115200bps 8bit; non parity; stop bit 1; フロー制御なし。

U-Boot SPL 2014.04-00015-gb4422bd (Apr 22 2014 - 13:24:29)
reading args
spl_load_image_fat_os: error reading image args, err - -1
reading u-boot.img
reading u-boot.img


U-Boot 2014.04-00015-gb4422bd (Apr 22 2014 - 13:24:29)

I2C:   ready
DRAM:  512 MiB
NAND:  0 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
*** Warning - readenv() failed, using default environment

Net:    not set. Validating first E-fuse MAC
cpsw, usb_ether
Hit any key to stop autoboot:  0
gpio: pin 53 (gpio 53) value is 1
mmc0 is current device
gpio: pin 54 (gpio 54) value is 1
SD/MMC found on device 0
reading uEnv.txt
824 bytes read in 4 ms (201.2 KiB/s)
gpio: pin 55 (gpio 55) value is 1
Loaded environment from uEnv.txt
Importing environment from mmc ...
Checking if uenvcmd is set ...
gpio: pin 56 (gpio 56) value is 1
Running uenvcmd ...
reading zImage
3186872 bytes read in 249 ms (12.2 MiB/s)
reading initrd.img
** Unable to read file initrd.img **
reading /dtbs/am335x-boneblack-botic.dtb
30402 bytes read in 11 ms (2.6 MiB/s)
Kernel image @ 0x82000000 [ 0x000000 - 0x30a0b8 ]
## Flattened Device Tree blob at 88000000
   Booting using the fdt blob at 0x88000000
   Loading Ramdisk to 9f31f000, end 9f6290b8 ... OK
   Using Device Tree in place at 88000000, end 8800a6c1

Starting kernel ...

[    0.185749] omap_init_mbox: hwmod doesn't have valid attrs
[    0.260908] Initramfs unpacking failed: junk in compressed archive
[    0.383046] musb-hdrc musb-hdrc.0.auto: Failed to request rx1.
[    0.389256] musb-hdrc musb-hdrc.0.auto: musb_init_controller failed with status -517
[    0.422929] musb-hdrc musb-hdrc.1.auto: Failed to request rx1.
[    0.429113] musb-hdrc musb-hdrc.1.auto: musb_init_controller failed with status -517
[    0.525990] davinci-botic botic: ASoC: CODEC (null) not registered
[    0.533594] davinci-botic botic: snd_soc_register_card failed (-517)
[    0.546587] omap_voltage_late_init: Voltage driver support not added
[    0.553784] cpu cpu0: cpu0 regulator not ready, retry
[    0.563911] slave hdmi: could not get i2c
[    1.166926] usb 2-1: device v0411 p01a2 is not supported
systemd-fsck[75]: rootfs: clean, 34759/102752 files, 117596/410368 blocks
[    5.181938] libphy: PHY 4a101000.mdio:01 not found
[    5.187072] net eth0: phy 4a101000.mdio:01 not found on slave 1

Debian GNU/Linux 7 bbb ttyO0

default username:password are [debian:botic] and [root:botic]
The IP Address for usb0 is: 192.168.7.2
bbb login: debian

default username:password are [debian:botic] and [root:botic]とのこと。
ログインする。

bbb login: debian
Password:
Linux bbb 3.16.1-botic3 #1 PREEMPT Thu Aug 28 01:44:57 CEST 2014 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
debian@bbb:~$

起動確認ができたので一旦電源を落とす。

debian@bbb:~$ sudo shutdown -h now

BBBとDACとの接続は以下の通り。

I2S_LRCK:P9_29
I2S_DIN:P9_30
I2S_BCK:P9_31
I2S_SCK:P9_25
I2C_SCK:P9_18
I2C_SDA:P9_17
SYS_5V(CP):P9_7
SYS_5V(A):P9_8
VDD3.3(D):P9_3
GND(CP):P9_1
GND(A):P9_45
GND(D):P9_2

P9の方しか使用しないのでP8はテープでマスクする方が誤操作除けになって良い。
PCM5122は2.1Vrmsで出力で、イヤホン程度ならば直接駆動できる。

再度BBBの起動を行う。
起動後rootで操作を行う。

debian@bbb:~$ sudo -s
[sudo] password for debian:
root@bbb:

先ずはI2Cデバイスの確認を行う。

root@bbb:/home/debian# i2cdetect -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU UU -- -- 4c -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@bbb:/home/debian#

0x4cとして認識されいる。
もっとも、SCKを結線しているので特にI2Cで設定を行わなくてもデフォルトで音が鳴るはず。
boticドライバの設定はDSD switchとserconfigは本来あるべき値に設定するべきであるが、とりあえずデフォルトのままとする。

botic demoに含まれる音源サンプルの再生を試みる。

root@bbb:/home/debian# play /data/test/test_96k_24b.flac

/data/test/test_96k_24b.flac:

 File Size: 4.96M     Bit Rate: 2.41M
  Encoding: FLAC          Info: Processed by SoX
  Channels: 2 @ 24-bit
Samplerate: 96000Hz
Replaygain: off
  Duration: 00:00:16.50

In:100%  00:00:16.50 [00:00:00.00] Out:1.58M [ =====|======] Hd:0.1 Clip:0
Done.
root@bbb:/home/debian# play /data/test/test_44k1_16b.flac

/data/test/test_44k1_16b.flac:

 File Size: 1.46M     Bit Rate: 707k
  Encoding: FLAC          Info: Processed by SoX
  Channels: 2 @ 16-bit
Samplerate: 44100Hz
Replaygain: off
  Duration: 00:00:16.50

In:100%  00:00:16.50 [00:00:00.00] Out:792k  [ =====|======] Hd:0.1 Clip:0
Done.
root@bbb:/home/debian# play /data/test/test_48k_16b.flac

/data/test/test_48k_16b.flac:

 File Size: 1.52M     Bit Rate: 738k
  Encoding: FLAC          Info: Processed by SoX
  Channels: 2 @ 16-bit
Samplerate: 48000Hz
Replaygain: off
  Duration: 00:00:16.50

In:100%  00:00:16.50 [00:00:00.00] Out:792k  [      |      ] Hd:0.1 Clip:0
Done.
root@bbb:/home/debian# play /data/test/8in8_-_05_-_Ill_Be_My_Mirror.mp3

/data/test/8in8_-_05_-_Ill_Be_My_Mirror.mp3:

 File Size: 5.65M     Bit Rate: 239k
  Encoding: MPEG audio    Info: 2011-12-21T12:11:15
  Channels: 2 @ 16-bit   Track: 5
Samplerate: 44100Hz      Album: Nighty Night
Replaygain: off         Artist: 8in8
  Duration: 00:03:09.30  Title: I'll Be My Mirror

In:100%  00:03:09.30 [00:00:00.00] Out:9.09M [      |      ]        Clip:8
play WARN rate: rate clipped 4 samples; decrease volume?
play WARN dither: dither clipped 4 samples; decrease volume?
Done.
root@bbb:/home/debian# play /data/test/

特に問題無く音が鳴動した。
44.1KHzサンプルである場合は、48KHzの倍数でリサンプリングされ再生される。

私には音質を語ることはできないが、気になるノイズや再生の開始・停止時のポップノイズは全くなく満足してしまった。

とはいえ、botic demoの環境ではWiFiが使用できない等、自分の環境では許容できない問題があるのでkernelの再構築が必要だ。
その前に、折角I2Cモードで接続しているので、次回I2Cで設定変更を試みる事とする。

タイトルとURLをコピーしました