[이전 회차]
[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
Error flag
SAI에서 통신 신뢰성을 확보하기 위해선 다양한 오류 상황을 미리 감지할 수 있어야 합니다. SAI는 다음과 같은 오류 플래그들을 제공합니다:
- FIFO 오버런/언더런(Overrun/Underrun): FIFO에 데이터가 넘치거나 비어 있는 상태에서 데이터 전송 또는 수신이 시도될 경우 발생합니다.
- 프레임 동기화 신호 조기 감지 (Anticipated Frame Sync Detection): 동기화 신호가 예상보다 빨리 도착했을 때 발생하는 오류입니다.
- 프레임 동기화 신호 지연 감지 (Late Frame Sync Detection): 동기화 신호가 늦게 도착했을 때 발생하는 오류입니다.
- 코덱 준비 안 됨 (Codec Not Ready): AC’97 프로토콜 전용으로, 코덱이 준비되지 않은 상태에서 프레임이 시작된 경우 발생합니다.
- 마스터 모드에서의 잘못된 클럭 구성 (Wrong Clock Configuration in Master Mode): 마스터 모드일 때 잘못된 클럭 설정이 감지되면 발생합니다.
FIFO 오버런/언더런
FIFO 오버런/언더런 상태는 SAI_xSR 레지스터의 OVRUDR 비트를 통해 표시됩니다.
이 비트는 수신 데이터가 덮어쓰이거나(오버런), 송신 데이터가 없을 때(언더런) 발생하는 상황 모두를 감지합니다. SAI의 각 오디오 블록은 자체적인 SAI_xSR 레지스터를 가지고 있어 각각 독립적으로 이 비트를 사용합니다. 즉, 송신기/수신기 구분 없이 이 비트를 통해 FIFO 오류를 실시간으로 확인할 수 있으며, 오류 발생 시 인터럽트나 예외 처리를 구현할 수 있습니다.
Overrun
SAI가 수신기 모드일 때, FIFO가 가득 찬 상태에서 새로운 데이터가 수신되면OVRUDR 오류(Overrun)가 발생하며 데이터는 폐기됩니다. 이후 SAI_xSR 레지스터의 OVRUDR 플래그가 설정되며, SAI_xIM 레지스터의 OVRUDRIE 비트가 설정되어 있다면, 인터럽트가 발생합니다.
Overrun이 발생한 슬롯 번호(slot number)는 내부적으로 저장됩니다. FIFO가 비워져 새로운 데이터를 저장할 수 있을 때까지, 추가 데이터는 FIFO에 저장되지 않습니다. FIFO가 최소한 하나 이상의 빈 공간을 갖게 되면, SAI 수신기는 새로운 오디오 프레임의 데이터를, Overrun이 발생했던 슬롯 번호부터 다시 수신합니다.
이 메커니즘은 대상 메모리에서의 슬롯 오프셋 불일치(dealignment)를 방지합니다. OVRUDR 플래그는 SAI_xCLRFR 레지스터의 COVRUDR 비트를 클리어 해야합니다.
Underrun
SAI 송신기에서 FIFO가 비어 있는 상태로 데이터 전송 타이밍이 도래하면 언더런 오류가 발생합니다. 언더런이 감지되면 해당 슬롯 위치는 내부적으로 저장되며, 실제 데이터가 준비되기 전까지는 MUTE 값(0)이 전송됩니다.
이 메커니즘은 메모리 포인터와 슬롯 위치 간의 정렬 오류를 방지하며, 이벤트 발생 시 SAI_xSR 레지스터의 OVRUDR 플래그가 설정되고, SAI_xIM 레지스터의 OVRUDRIE 비트가 설정되어 있다면 인터럽트가 발생합니다.
이 플래그를 클리어하려면, SAI_xCLRFR 레지스터의 COVRUDR 비트를 설정해야 합니다. 언더런 이벤트는 오디오 서브블록이 마스터이든 슬레이브이든 모두 발생할 수 있습니다.
프레임 동기화 신호 조기 감지 (Anticipated Frame Sync Detection)
AFSDET(예상보다 이른 프레임 동기화 검출) 플래그는 슬레이브 모드에서만 사용됩니다. 마스터 모드에서는 절대 활성화되지 않습니다.
SAI의 슬레이브 모드에서 AFSDET 플래그는 예상보다 빠른 프레임 동기화(FS) 감지를 의미합니다. 이 감지는 오디오 전송 흐름을 방해하지 않고, 단지 비정상적인 FS 타이밍을 감시하는 용도입니다.
하드웨어 노이즈나 외부 마스터의 타이밍 오류로 인해 일찍 발생한 FS 신호가 있을 경우, AFSDET 플래그가 활성화되며, 시스템은 이를 토대로 정렬 오류 또는 통신 안정성을 분석할 수 있습니다.
SAI_xIM 레지스터에서 AFSDETIE 비트가 설정되어 있을 경우, AFSDET 플래그가 활성화되면 인터럽트가 발생합니다.
AFSDET 플래그를 클리어하려면, SAI_xCLRFR 레지스터의 CAFSDET 비트를 1로 설정해야 합니다. 예상보다 빠른 프레임 동기화(FS) 오류 발생 후, 마스터와 다시 동기화(resync)하려면 다음과 같은 4단계 절차가 필요합니다:
- SAI_xCR1의 SAIEN 비트를 0으로 설정하여 SAI 블록을 비활성화합니다.
- SAI가 실제로 꺼졌는지 확인하려면 SAIEN 비트를 다시 읽어서 0인지 확인 - SAI_xCR2 레지스터의 FFLUSH 비트를 1로 설정하여 FIFO를 초기화(플러시) 합니다.
- SAIEN 비트를 다시 1로 설정하여 SAI를 재활성화합니다.
- SAI 블록은 FS 신호의 assertion(하이 레벨 전환)을 대기하며, 이를 통해 마스터와의 동기화가 다시 시작됩니다.
이 방식은 데이터 정렬 손상 없이 통신 상태를 안정적으로 회복할 수 있는 중요한 메커니즘입니다.
<참조>
AFSDET 플래그는 AC’97 모드에서는 설정되지 않습니다.
그 이유는 SAI 오디오 블록이 슬레이브로 선언되어 있더라도 링크 컨트롤러 역할을 수행하며 FS 신호를 생성하기 때문입니다.
또한, SPDIF 모드에서는 FS 신호 자체를 사용하지 않기 때문에 AFSDET는 의미가 없습니다.
프레임 동기화 신호 지연 감지 (Late Frame Sync Detection)
SAI_xSR 레지스터의 LFSDET 플래그는 SAI 오디오 블록이 슬레이브로 동작할 때만 설정될 수 있습니다.
프레임 길이(Frame Length), 프레임 극성(Frame Polarity), 프레임 오프셋(Frame Offset)는 SAI_xFRCR 레지스터에 정의되어 있어야 합니다.
외부 마스터가 FS(Frame Sync) 신호를 제 시간에 보내지 않고 지연된 경우, LFSDET 플래그가 설정되며, SAI_xIM 레지스터의 LFSDETIE 비트가 설정되어 있다면 인터럽트가 발생합니다. 이 플래그를 클리어하려면 SAI_xCLRFR 레지스터의 CLFSDET 비트를 설정해야 합니다.
해당 오류가 감지되면 LFSDET 플래그가 설정되며, SAI는 마스터와 다시 동기화되어야 합니다.
(※ 재동기화 절차는 프레임 동기화 신호 조기 감지 처리 시퀀스와 동일함)
노이즈 환경에서 클럭 신호(SCK)의 글리치로 인해 SAI의 상태 머신이 오디오 프레임 타이밍을 잘못 해석할 수 있습니다. 이 경우, 데이터가 잘못된 위치에 시프트되며 SAI는 이를 감지해 LFSDET(Late Frame Sync) 플래그를 설정합니다.
단, 외부 마스터가 프레임을 비연속 모드로 송신하는 경우에는 데이터 손상 없이 플래그만 감지됩니다.
AC’97이나 SPDIF 모드에서는 FS 신호 구조상 이 플래그가 의미를 가지지 않으며 무시됩니다.
요약하면 이 오류는 외부 마스터의 타이밍 불일치 또는 하드웨어 신호 지연 등에 의해 발생할 수 있으며, 신뢰성 있는 오디오 프레임 정렬을 유지하기 위한 중요한 오류 감지 수단입니다.
코덱 준비 안 됨 (Codec Not Ready)
SAI_xSR 레지스터의 CNRDY 플래그는 SAI 오디오 블록이 AC'97 모드로 설정되었을 때만 유효합니다 (SAI_xCR1의 PRTCFG[1:0] = 10). SAI_xIM 레지스터의 CNRDYIE 비트가 설정되어 있다면, CNRDY 플래그가 활성화될 때 인터럽트가 발생합니다.
CNRDY 플래그는, AC'97 오디오 프레임의 TAG 0 (slot 0) 수신 시점에 코덱이 통신 준비가 되지 않은 경우에 설정됩니다.
이 경우 코덱이 준비될 때까지 데이터는 FIFO에 자동 저장되지 않으며, TAG 0이 코덱이 준비되었음을 표시하면, SAI_xSLOTR에 정의된 모든 활성 슬롯의 데이터 수신이 시작됩니다.
이 플래그를 클리어하려면, SAI_xCLRFR 레지스터의 CCNRDY 비트를 직접 설정해야 합니다.
CNRDY 인터럽트는 AC'97 초기화 지연, 전원 문제, 통신 불일치 진단에 유용합니다.
마스터 모드에서의 잘못된 클럭 구성 (with NODIV = 0)
오디오 블록이 마스터 모드로 동작 중(MODE[1] = 0)이고, NODIV 비트가 0으로 설정된 경우 프레임 길이 설정값(FRL + 1)이 2의 제곱수가 아니거나 8~256 범위를 벗어나면 WCKCFG 플래그가 설정되고 SAI는 자동으로 비활성화됩니다.
WCKCFGIE 비트가 설정되어 있다면,WCKCFG 플래그가 설정될 때 인터럽트가 발생합니다.
이 플래그를 클리어하려면, SAI_xCLRFR 레지스터의 CWCKCFG 비트를 설정해야 합니다.
WCKCFG 플래그가 설정되면, SAIEN 비트는 하드웨어적으로 자동 클리어되며, 오디오 블록은 비활성화됩니다.
이 오류는 워드 클럭 구성 자체가 잘못되었음을 의미하며, 인터럽트 발생 후 설정을 수정한 뒤 재시작해야 합니다.
안정적인 오디오 전송을 위한 필수적인 하드웨어 오류 감지 장치입니다.
SAI 비활성화
SAI 오디오 블록은 SAI_xCR1 레지스터의 SAIEN 비트를 클리어함으로써 언제든지 비활성화할 수 있습니다.
하지만, 이미 시작된 오디오 프레임 전송은 자동으로 완료된 후에 SAI 동작이 중지됩니다.
이때 SAIEN 비트는 현재 오디오 프레임 전송이 끝날 때까지 high(1) 상태를 유지하다가 전송이 완전히 종료되면 자동으로 low(0)로 클리어됩니다.
또한, 동기화 모드로 구성된 SAI에서는 반드시 마스터 블록을 먼저 비활성화해야
클럭 오류나 비정상 종료를 방지할 수 있습니다.
SAI DMA 인터페이스
CPU 부하를 줄이고 버스 대역폭을 최적화하기 위해, 각 SAI 오디오 블록은 독립적인 DMA 인터페이스를 갖추고 있어 SAI_xDR 레지스터를 통해 내부 FIFO로부터 데이터를 읽거나 쓸 수 있습니다. 각 오디오 서브블록(audio subblock)당 하나의 DMA 채널이 할당되며, 기본적인 DMA 요청/응답 프로토콜(request/acknowledge)을 지원합니다.
SAI 오디오 서브블록을 DMA 전송용으로 설정하려면, SAI_xCR1 레지스터의 DMAEN 비트를 설정해야 합니다.
DMA 요청은 FIFO 임계치를 기준으로 자동으로 발생하며, DMA 전송 방향은 SAI 오디오 서브블록의 구성(송신/수신)에 따라 달라집니다.
- 오디오 블록이 **송신기(Tx)**로 동작할 경우,
- 오디오 블록의 FIFO 컨트롤러는 SAI_xDR에 기록된 데이터를 FIFO에 적재하기 위해 DMA 요청을 발생시킵니다. - 오디오 블록이 **수신기(Rx)**로 동작할 경우,
- SAI_xDR 레지스터로부터 데이터를 읽어들이기 위해 DMA 요청이 발생합니다.
DMA 모드에서 SAI 인터페이스를 설정하려면 다음 순서를 따릅니다:
- SAI 및 FIFO 임계값(FIFO Threshold)을 설정하여 DMA 요청 발생 시점을 정의합니다.
- SAI에 연결된 DMA 채널을 구성합니다.
- DMA를 활성화합니다.
- SAI 인터페이스를 활성화합니다.
이 구조는 고속 오디오 처리에 필수적이며, CPU 부하를 획기적으로 줄일 수 있는 방법입니다.
'Embedded > ST Series' 카테고리의 다른 글
[STM32F7] SAI(Serial audio interface) Specific features (0) | 2025.05.19 |
---|---|
[STM32F7] SAI(Serial audio interface) SPDIF output (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 |