Embedded/ST Series

[STM32F7] SAI(Serial audio interface) 학습하기 (4)

별빛의온기 2025. 5. 18. 14:41
반응형

 

 

 

[이전 회차]

 

 

[STM32F7] SAI(Serial audio interface) 학습하기 (3)

[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (2)[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (1)들어가기 앞서 이것은 STM32F7 DataSheet에 나온 문서를 기반으로 개인적으로 정리한 자료입

starlighton.com

 

 




슬롯 구성(Slot configuration) 

 

슬롯은 오디오 프레임에서 가장 기본적인 단위입니다. SAI에서는 오디오 프레임을 여러 개의 슬롯(Slot)으로 나누어 전송합니다.

이 슬롯은 각각 하나의 채널이나 데이터 블록에 해당하며, 기본적으로 NBSLOT[3:0] + 1 방식으로 개수를 설정합니다. 최대 16개까지 설정 가능하며, 다채널 오디오 전송이나 TDM 구성에서 매우 유용하게 사용됩니다. 다만 AC’97이나 SPDIF (즉, PRTCFG[1:0] = 10 또는 PRTCFG[1:0] = 01) 와 같이 표준이 고정된 프로토콜을 사용할 경우, 슬롯 수는 자동으로 결정되며 NBSLOT[3:0]를 통한 설정은 무시됩니다.

각 슬롯은 SAI_xSLOTR 레지스터의 SLOTEN[15:0] 비트를 설정하여 각 슬롯을 유효하거나 무효한 슬롯으로 정의할 수 있습니다.
송신기(transmitter) 모드에서는 무효 슬롯이 전송될 때, TRIS 비트 설정에 따라 SD 데이터 라인을 0으로 고정하거나(high) 하이 임피던스(high-Z) 상태로 해제합니다.

수신기(receiver) 모드에서는, 무효 슬롯의 끝에서 받은 값은 무시됩니다. 즉, 해당 슬롯에 대해서는 FIFO 접근이 이루어지지 않으며, FIFO에 대한 읽기/쓰기 요청도 발생하지 않습니다.


이 구조는 멀티채널 환경에서 일부 채널만 선택적으로 사용하는 데 유리하며, DMA와 버스 자원 낭비를 줄일 수 있는 유용한 기능입니다.

 

슬롯 크기도 아래 그림에서 보이는 것처럼 구성할 수 있습니다. 슬롯의 크기는 SAI_xSLOTR 레지스터의 SLOTSZ[1:0] 비트를 설정함으로써 선택됩니다. 설정된 크기는 오디오 프레임 내 모든 슬롯에 동일하게 적용됩니다. 슬롯 크기를 적절히 구성하면 DMA 처리 단위를 최적화할 수 있으며, 다채널 TDM 전송이나 32비트 인터페이스에서도 유연하게 대응할 수 있습니다.

 

 

 

 

 

SAI는 슬롯 내에서 첫 데이터 비트의 위치를 설정할 수 있습니다. 이 오프셋(offset)은 SAI_xSLOTR 레지스터의 FBOFF[4:0] 비트를 통해 설정합니다. 송신 시에는 오프셋 전 구간에 '0'이 채워지고, 수신 시에는 이 구간의 데이터가 무시됩니다. 이 기능은 특히 LSB 정렬 방식의 전송을 구현할 때 유용하며, 슬롯 크기에서 데이터 크기를 뺀 만큼 오프셋을 설정하면 데이터가 슬롯의 가장 끝쪽에 정렬되어 전송됩니다.

 

 

 

SAI 구성 시에는 슬롯과 프레임 사이의 정렬을 보장하기 위해 반드시 아래의 조건을 만족해야 합니다:

  • FBOFF ≤ (SLOTSZ - DS)
  • DS ≤ SLOTSZ
  • NBSLOT × SLOTSZ ≤ FRL (프레임 길이)
  • 오프셋(FBOFF)은 슬롯 크기(SLOTSZ)에서 데이터 크기(DS)를 뺀 값보다 작아야 하며,
  • 데이터 크기(DS)는 슬롯(SLOTSZ)보다 작거나 같아야 하고,
  • 전체 슬롯 길이(NBSLOT x SLOTSZ)는 프레임 길이(FRL)를 초과해서는 안 됩니다.

또한, SAI_xFRCR 레지스터에서 FSDEF 비트가 설정된 경우, 슬롯 수는 반드시 짝수여야 하며, AC’97 및 SPDIF 프로토콜 모드 (PRTCFG[1:0] = 10 또는 01)에서는 슬롯 크기를 직접 설정할 수 없습니다.  

이러한 조건을 지켜야 SAI 인터페이스가 안정적으로 동작합니다.

 SAI 클럭 생성(SAI clock generator) 

 

SAI는 각 오디오 블록마다 개별 클럭 생성기를 내장하고 있어, 두 블록이 완전히 독립적으로 작동할 수 있습니다.

이 두 클럭 생성기 간의 기능 차이는 없습니다. 마스터로 설정된 블록은 통신용 비트 클럭과 외부 디코더용 마스터 클럭을 생성하며,
슬레이브로 설정된 블록은 내부 클럭 생성기가 꺼지고 외부 클럭에 동기화됩니다.
이 구조는 오디오 송수신을 유연하게 구성하는 데 핵심적인 역할을 하며, 아래 그림은 오디오 블록 클럭 생성기의 구조를 보여줍니다.

 

 

<참고>
NODIV 비트가 1로 설정된 경우, MCLK_x 핀이 GPIO 주변 장치에서 SAI 핀으로 설정되어 있을 때, 해당 MCLK_x 신호는 '0' 레벨(LOW 상태)로 유지됩니다.

 

 

클럭 생성기의 소스는 제품의 클럭 컨트롤러(Product Clock Controller)로부터 공급됩니다.
sai_x_ker_ck 클럭은 **마스터 클럭(MCLK)**과 동일하며, MCKDIV[3:0] 비트를 사용하여 외부 장치가 요구하는 클럭 속도에 맞게 분주할 수 있습니다.

  • MCKDIV[3:0] ≠ 0000인 경우(나눠져서 출력): MCLK_x = sai_x_ker_ck / (MCKDIV × 2) 
  • MCKDIV[3:0] = 0000인 경우(그대로 출력): MCLK_x = sai_x_ker_ck 
  • 이 MCLK_x 신호는 Free Protocol Mode에서만 사용됩니다.

SAI에서 MCLK와 SCK 클럭을 안정적으로 출력하기 위해서는, 분주 값은 반드시 짝수여야 하며, 이를 통해 50% 듀티 사이클을 유지할 수 있습니다.

MCKDIV[3:0] 비트를 0000으로 설정하면 분주 없이 원본 클럭(sai_x_ker_ck)이 그대로 출력됩니다.

 

SAI는 오디오 통신의 표준에 맞게 MCLK와 FS의 비율을 256:1로 고정하여 동작합니다. 일반적으로 세 가지 주파수 범위가 사용되며, 이는 아래 그림과 같습니다.

 

 

오디오 블록이 마스터(Master)로 선언되고 SAI_xCR1 레지스터의 NODIV 비트가 0으로 설정된 경우에는, 외부 디코더를 위한 마스터 클럭(MCLK)을 I/O 핀(MCLK_x)을 통해 외부로 출력할 수 있습니다.

하지만 슬레이브 모드에서는 내부 클럭 생성기가 비활성화되므로 이 설정은 무시되며, MCLK_x 핀은 GPIO로 사용 가능하게 해제됩니다.

 

비트 클럭(SCK_x)은 마스터 클럭(MCLK_x)을 기준으로 오디오 프레임의 길이에 따라 자동 계산됩니다. 비트 클럭 분주기(bit clock divider)는 비트 클럭(SCK_x)과 마스터 클럭(MCLK_x) 사이의 분주 비율을 다음 공식을 기반으로 설정합니다:

 

SCK_x = MCLK x (FRL[7:0] +1) / 256

 

여기서:

  • 256은 MCLK와 오디오 샘플링 주파수(FS) 사이의 고정 비율입니다.
  • FRL[7:0]은 오디오 프레임 내의 비트 클럭 사이클 수 - 1로, SAI_xFRCR 레지스터에서 설정됩니다.

 

SAI를 마스터로 구성할 때는 프레임 길이 설정 시 (FRL[7:0] + 1) 값이 2의 제곱수(power of 2)가 되도록 설정해야 합니다.

이 조건을 만족해야 **비트 클럭 사이클(SCK_x)**당 MCLK_x 펄스가 짝수 개 생성되며, 50% 듀티 사이클이 보장됩니다.

또한, sai_x_ker_ck 클럭을 비트 클럭(SCK) 주파수와 동일하게 설정할 수도 있습니다. 이 경우 SAI_xCR1 레지스터에서 NODIV 비트를 설정해야 하며, MCKDIV 분주기 및 비트 클럭 분주기 설정은 무시됩니다. 이 설정을 사용하면 프레임당 비트 수를 자유롭게 구성할 수 있으며, 반드시 2의 제곱수일 필요는 없습니다. 이 설정은 외부 MCLK가 필요 없는 시스템에 특히 유리합니다.

비트 클럭(SCK)의 샘플링 에지(strobing edge)는 SAI_xCR1 레지스터의 CKSTR 비트로 설정하여 타이밍 호환성을 확보할 수 있습니다.

 

 


[다음 회차]

 

 

 

 

 

 

 

반응형