[ BBB - yocto (14) ] SPI(2)

 0) 개요

VS1003 MP3 디코더를 사용해보자.

참고 문서 : VS1003 Datasheet.pdf



1) VS1003

핀 이름기능 설명역할 및 특징
DREQData Request디코딩 준비 완료를 알리는 출력 신호. low 시 vs1003이 동작중인 상태이며, 데이터를 무시한다.
XDCSData Chip SelectSDI 프로토콜 전송을 위해 사용될 핀으로 low 시 SDI, high 상태가 idle이다.
XCSCommand Chip SelectSCI 프로토콜 전송을 위해 사용될 칩으로 low시 SCI, high 상태가 idle 이다.
XRSTReset칩 전체를 리셋시키는 핀으로, Low 신호 입력 시 칩이 초기 상태로 설정된다.

주의할 점은 xdcs와 xcs 핀이 동시에 low이면 안됀다.


DREQ는 SCI 전송 동작이 끝났을 때 excution 시간 동안 low로 떨어지며, XDCS와 XCS 핀을 사용하는 두 경우 다 공통으로 적용된다.


SCI는 레지스터 설정 프로토콜 이고, SDI는 데이터 전송 프로토콜로 보면 된다.


1. SCI


SCI는 읽기를 하려면 0x03을 먼저 전송하고, address를 전송한다. 그러면 2바이트 데이터를 얻는다.

SCI는 쓰기를 하려면 0x02를 먼저 전송하고, address, data 2바이트를 전송한다.

이렇게 레지스터를 컨트롤한다.


XCS를 보면 알겠지만, XCS가 LOW일 때 SCI 프로토콜로 전송된다. 이때 XDCS는 high 신호여야 한다.


2. SDI

SDI는 오디오 데이터(mp3, wav, wma, ...등)을 전송해 vs1003 dsp가 mp3를 디코딩하여 변환된 mp3 신호를 오디오 라인으로 재생하게 하는 프로토콜이다.

XDCS가 LOW일 때 SDI 프로토콜로 전송된다. XCS 신호는 high 신호여야 한다.


SDI의 제어 시퀀스에 대해서는 특별한 설명이 데이터 시트에는 없지만 주의해야 하는게 있다.

1. 비트 레이트와 SPI 클럭 속도를 동일하게 설정해야 올바른 속도로 음악이 재생이 된다

2. 샘플레이트와, mp3의 모드를 제대로 설정해 주어야 한다.

따라서 mp3 패킷을 파싱하여 샘플레이트, bitrate, mp3의 모드(스테레오 vs 모노)를 알아내야 한다.


이것을 하려면 mp3 패킷을 이해해야 한다.




2) mp3 패킷 구조

1. MP3 ID TAG HEADER

필드크기 (바이트/비트)설명
Identifier3 bytes (24비트)태그의 존재를 알리는 고정 문자열("ID3")
Version2 bytes (16비트)
- 1바이트: Major 버전
- 1바이트: Revision 버전
태그 버전 정보를 나타냄 (예: ID3v2.3) -> {0x02, 0x03}
Flags1 byte (8비트)플래그 비트들로, unsynchronisation, extended header, experimental indicator 등의 정보 포함
unsynchronisation : 7bit
extended header : 6bit
experimental indicator : 5bit
나머지 비트 padding (0으로 채움)
Size4 bytes (32비트)
(Sync-safe: 각 바이트 7비트 사용, 총 28비트 유효)
다음에 따라 나오는 태그 MP3 ID TAG FRAMES 필드의 크기를 나타내며, Sync-safe 방식으로 인코딩되어 MSB가 항상 0

뒤이어 나올 MP3 프레임의 크기를 구하려면 sync-safe 때문에 연산을 다음과 같이 해야 한다.

size = "(6byte << 21) + (7byte << 14) + (8byte << 7) + 9byte"


2. MP3 ID TAG FRAMES 필드

필드크기 (바이트/비트)설명
Frame ID4 bytes (32비트)프레임의 종류를 나타내는 고유 문자열 (예: TIT2(제목), TPE1(아티스트) 등)
Size4 bytes (32비트)프레임의 데이터 크기를 나타내며, 프레임 헤더(Frame ID, Flags)를 제외한 순수 데이터 크기
Flags2 bytes (16비트)프레임 관련 플래그로, Tag alter, File alter, Read-only, Compression, Encryption, Grouping 등의 정보 포함
Frame Data가변 (위 Size 값에 따라 결정됨)실제 메타데이터 값이 저장되는 영역


3.MP3 헤더

vs1003의 8.6.9 SCI_HDAT0 and SCI_HDAT1 (R) 항목을 보면 mp3 헤더에 대한 설명이 있다.



샘플레이트와 비트레이트, 그리고 mp3 모드(스테레오, 모노) 필드는 위 mp3 헤더를 표에 있는 그대로 파싱하면 얻을 수 있다.

4. 오디오 데이터
오디오 재생 데이터가 들어있다.

5. 메타 데이터
기타 데이터




3) 어플리케이션 동작 과정
link : https://github.com/leejugy/vs1003_linux

1.리셋 시퀀스

(0) XRST를 low로 강제로 떨군다. 최소 1ms 대기하고, dreq가 high가 될 때 까지 대기해야 한다.

(1) SCI_CLOCKF를 설정한다. 데이터 시트는 0x9000으로 설정할 것을 권장한다.

(2) SCI_BASS를 설정해, BASS를 설정한다.

(3) SCI_VOL을 설정해, 초기 볼륨을 설정한다.

2. 음악 재생 시퀀스

(1) MP3 패킷을 파싱한다. 파싱하는 방법은 MP3 ID TAG 헤더의 SIZE 부분의 값을 구한 뒤(프레임 크기) 
MP3 ID TAG 헤더의 크기(10바이트) + 프레임 크기 만큼 파일 오프셋을 설정한다.(lseek 함수 사용)
그러면 MP3 HEADER부터 읽어낼 수 있다. 
읽어낸 헤더에서, MP3 bitrate, sample rate, mode 값을 뽑아내 저장한다. (파싱)

(2) SCI_AUDATA에 샘플레이트, 모드(모노, 스테레오)를 설정한다.

(3) SPI 클럭 속도를 bitrate에 맞게 설정해준다.

(4) SPI로 mp3 오디오 데이터를 전송하여 재생한다.




4) MP3 음원 만들기

1. 갖고 있는 음원을 mp3로 우선 음악을 변환한다.

2. 이후 vs1003의 지원되는 범주의 kbps와 khz로 설정한다.

ex)
1. m4a음원을 가지고 mp3로 변환
https://convertio.co/kr/download/d981de4922a0933af341fabe337c900e9fe6ce/
2. mp3->320kbps 변환
https://online-audio-converter.com/



5) vs1003 다운로드 및 음원 옮기기
USB에 다음 파일을 담아두자.


이후 비글본에 USB를 마운트해서 옮긴 다음 /home/root에 복사해 쓰면된다.

~$ rz
~$ chmod +x vs1003
~$ mount /dev/sda /mnt
~$ cp /mnt/* /home/root/
~$ umount /mnt




6) 재생하기

참고로 핀 연결은 다음과 같다.

비글본 핀vs1003 핀
DREQP8_12
XCSP8_11
XDCSP8_16
XRSTP8_15
MISOP9_18
MOSIP9_21
SCLKP9_22


./vs1003 실행하고


텀 화면이다.

음악을 재생하려면 10. custom music root를 선택해야 한다.

"10"을 입력한다.

current route files에 있는 목록을 입력하여 주거나, 절대 경로로 음악 위치를 주면 된다.



댓글

이 블로그의 인기 게시물

[ BBB - yocto (9) ] 장치트리(DEVICE TREE)

[ BBB - yocto (11) ] uart

[ BBB - yocto (5) ] makefile 작성법과 컴파일 자동화