[이전 회차]
[STM32F7] SAI(Serial audio interface) 학습하기 (6)
[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (5)[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (4)[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (3)[이전 회차] [STM32F7] SAI(Serial audio int
starlighton.com
SPDIF output
SAI는 SPDIF 출력을 지원합니다. SPDIF 인터페이스는 송신기 모드에서만 사용 가능합니다. 이 기능은 오디오 IEC60958 표준을 지원합니다.
SPDIF 모드를 선택하려면, SAI_xCR1 레지스터의 PRTCFG[1:0] 비트를 01로 설정해야 합니다.
SPDIF 프로토콜의 경우 다음과 같은 조건이 적용됩니다:
- SD 데이터 라인만 활성화됩니다.
- FS, SCK, MCLK 핀은 사용되지 않으며 자유롭게 사용할 수 있습니다.
- 데이터 레이트를 제어하기 위해 SAI의 클록 생성기를 활성화하는 마스터 모드로 설정되며, 이때 MODE[1] 비트는 강제로 0이 됩니다.
- 데이터 크기는 24비트로 고정되며, SAI_xCR1의 DS[2:0] 설정 값은 무시됩니다.
- 심볼레이트(SPDIF 전송 속도)를 설정하기 위해 클록 생성기를 구성해야 하며, 이때 비트 클록은 심볼레이트의 두 배가 되어야 합니다.
- 데이터는 맨체스터(Manchester) 방식으로 인코딩됩니다.
- SAI_xFRCR 및 SAI_xSLOTR 레지스터는 무시되며, SAI는 SPDIF 규격에 맞춰 내부적으로 자동 설정됩니다 (아래 그림 참조).
SPDIF는 디지털 오디오 데이터를 192프레임 단위 블록으로 묶어 전송하며, 각 프레임은 왼쪽/오른쪽 채널용으로 32비트 서브프레임 2개로 구성됩니다. 각 서브프레임의 첫 4비트 SOPD 패턴은 채널 식별용, 나머지 28비트는 실제 24비트 오디오 데이터 + 4비트 상태 정보로 채워집니다.
SPDIF 전송 시, STM32의 SAI_xDR 레지스터에 데이터를 저장할 때는 비트별 정렬을 정확히 맞추는 것이 필수적입니다.
- 상위 3비트([26:24])에는 SPDIF의 필수 제어 비트인 Validity(V), User(U), Channel Status(CS) 비트를 저장하고,
- 나머지 하위 24비트([23:0])는 실제 오디오 데이터를 담습니다.
만약, 전송하려는 데이터가 16비트 또는 20비트일 경우, 항상 MSB를 23번 비트에 위치시키고 나머지 하위 비트는 0으로 채워 정렬해야 합니다.
<참고>
전송은 항상 LSB 먼저 전송됩니다.
SPDIF 전송 시, SAI는 각 서브프레임마다 먼저 프리앰블을 전송하고, 그다음 SAI_xDR에 저장된 27비트의 데이터(CUV + 24비트 오디오)를 맨체스터 인코딩 방식으로 SD 라인에 출력합니다.
마지막으로, 전체 데이터의 패리티를 계산하여 1비트 추가 전송함으로써 서브프레임을 완성합니다. 이 패리티는 아래 표의 방식에 따라 계산됩니다.
SPDIF 모드에서는 SAI가 송신기 모드에서만 동작하기 때문에, SAI_xSR 레지스터에 존재하는 유일한 오류 플래그는 언더런(underrun)입니다. 따라서 언더런 인터럽트 또는 언더런 상태 비트를 통해 오류가 감지된 경우, 다음과 같은 순서로 복구 절차를 수행해야 합니다:
- DMA를 사용하는 경우, DMA 스트림을 DMA 주변 장치를 통해 비활성화합니다.
- SAI를 비활성화하고, SAI_xCR1 레지스터의 SAIEN 비트가 0이 될 때까지 polling하여 주변 장치가 실제로 비활성화되었는지 확인합니다.
- SAI_xCLRFR 레지스터의 COVRUNDR(underrun 오류) 플래그를 클리어합니다.
- SAI_xCR2 레지스터의 **FFLUSH 비트를 설정하여 FIFO를 플러시(초기화)**합니다.
- 소프트웨어는 다음 블록의 시작에 해당하는 새 데이터 주소를 가리키도록 설정해야 합니다 (즉, 프리앰블 B에 해당하는 데이터부터). DMA를 사용하는 경우, DMA 소스 베이스 주소 포인터도 함께 갱신해야 합니다.
- DMA를 사용하는 경우, DMA 스트림을 다시 활성화하여 새 주소 기반으로 데이터 전송을 관리합니다.
- 마지막으로, SAI_xCR1의 SAIEN 비트를 설정하여 SAI를 다시 활성화합니다.
SPDIF 생성기 모드에서의 클럭 설정
SPDIF 모드에서는 오디오 전송을 위해 심볼레이트보다 2배 빠른 비트 클럭이 필요합니다.
아래 표는 **오디오 샘플링 주파수(FS)**에 따른 심볼레이트의 예시를 보여줍니다.
좀 더 일반적으로, 오디오 샘플링 주파수(FS)와 비트 클럭(F_SCK_X) 사이의 관계는 다음 공식으로 주어집니다.
비트 클럭(F_SCK_X)은 다음과 같이 구해집니다.
<참고>
위의 공식은 SAI_ACR1 레지스터에서 NODIV 비트가 1로 설정되어 있어야 유효합니다.
[다음 회차]
[STM32F7] SAI(Serial audio interface) Specific features
[이전 회차] [STM32F7] SAI(Serial audio interface) SPDIF output[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (6)[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (5)[이전 회차] [STM32F7] SAI(Serial audio interfa
starlighton.com
'Embedded > ST Series' 카테고리의 다른 글
[STM32F7] SAI(Serial audio interface) Error flag (0) | 2025.05.19 |
---|---|
[STM32F7] SAI(Serial audio interface) Specific features (0) | 2025.05.19 |
[STM32F7] SAI(Serial audio interface) AC'97 Protocol (0) | 2025.05.19 |
[STM32F7] SAI(Serial audio interface) FIFO, Interrupt (0) | 2025.05.19 |
[STM32F7] SAI(Serial audio interface) 슬롯 구성 (0) | 2025.05.18 |