Embedded/ST Series

[STM32F7] SAI(Serial audio interface) Specific features

별빛의온기 2025. 5. 19. 11:16
반응형

 

 

 

[이전 회차]

 

 

[STM32F7] SAI(Serial audio interface) SPDIF output

[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (6)[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (5)[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (4)[이전 회차] [STM32F7] SAI(Serial audio int

starlighton.com

 

 

 


 

Specific features

 

SAI 인터페이스에는 선택한 오디오 프로토콜에 따라 유용할 수 있는 고유 기능들이 포함되어 있습니다. 이러한 기능들은 SAI_xCR2 레지스터의 특정 비트를 통해 접근할 수 있습니다.

Mute 모드

Mute 모드는 오디오 서브블록이 송신기이거나 수신기일 때 사용할 수 있습니다.

 

오디오 서브 블록이 송신 모드인 경우

 

송신 모드에서 Mute 모드는 언제든지 선택할 수 있으며, 전체 오디오 프레임 단위로 활성화됩니다. 진행 중인 프레임 도중 SAI_xCR2 레지스터의 MUTE 비트를 설정하면 Mute 모드가 활성화됩니다.

 

프레임 단위로 Mute가 적용되므로 실시간 오디오 전송 중간에 Mute를 설정하더라도, 현재 프레임이 끝나야 다음 프레임부터 적용됩니다. SAI_xSLOTR 레지스터의 NBSLOT[3:0] 비트를 통해 설정된 슬롯 수가 2 이하인 경우, Mute 모드에서 송신되는 값으로 0을 보낼지, 이전 슬롯의 마지막 값을 보낼지를 선택할 수 있습니다. 이 선택은 SAI_xCR2 레지스터의 MUTEVAL 비트를 통해 결정합니다.

반면 슬롯 수가 2보다 클 경우, 모든 슬롯의 모든 비트에 0이 송신되며, 이때 MUTEVAL 비트는 의미를 가지지 않게 됩니다.

Mute 모드 동안에도 FIFO 포인터가 계속 증가하기 때문에, Mute 도중에도 FIFO는 소모됨. 오디오 드롭이나 지연 없이 Mute 처리가 가능하다는 의미지만, 반대로 Mute 시 데이터가 실제로 전송되지 않더라도 FIFO가 비워지므로 유의해야 합니다.

 

오디오 서브 블록이 수신 모드인 경우

 

외부 송신기가 연속된 Mute 프레임을 보낼 경우 이를 자동으로 감지할 수 있습니다.

이 감지는 오디오 프레임의 모든 선언된(valid) 슬롯이 0을 수신했을 때, 연속된 프레임 수가 SAI_xCR2 레지스터의 MUTECNT[5:0] 비트로 설정된 값에 도달하면 동작합니다. Mute 프레임의 개수가 설정된 값을 만족하면, SAI_xSR 레지스터의 MUTEDET 플래그가 설정되며, SAI_xCR2 레지스터의 MUTEDETIE 비트가 활성화되어 있을 경우, 인터럽트가 발생합니다.

Mute 카운터는 다음 두 상황에서 초기화됩니다:

  • 오디오 서브블록이 비활성화된 경우
  • 유효한 슬롯 중 하나라도 0이 아닌 데이터를 수신한 경우

이 인터럽트는 MUTEDET가 처음 감지될 때 단 한 번만 발생하며, Mute 카운터가 초기화되면 다시 감지 가능해집니다.

SPDIF 오디오 블록에서는 음소거 모드를 사용할 수 없습니다.

 

Mono/Stereo 모드

송신기 모드(Transmitter mode)에서는, 슬롯 수가 2개일 때(SAI_xSLOTR의 NBSLOT[3:0] = 0001) 메모리에서 데이터 전처리 없이 Mono 모드를 사용할 수 있습니다. 이 경우, FIFO로부터의 접근 시간이 절반으로 줄어듭니다, 왜냐하면 슬롯 0의 데이터가 슬롯 1에도 자동 복제되어 전송되기 때문입니다. Mono 모드를 활성화하려면 다음 단계를 따릅니다:

  1. SAI_xCR1 레지스터의 MONO 비트를 1로 설정합니다.
  2. SAI_xSLOTR에서 NBSLOT을 1로 설정, 그리고 SLOTEN을 3(0b11)으로 설정합니다.

수신기 모드(Receiver mode)에서도 MONO 비트를 설정할 수 있으며, 이 비트는 슬롯 수가 2개일 때만 유효합니다. 이 비트를 설정하면, 슬롯 0의 데이터만 FIFO에 저장되고, 슬롯 1의 데이터는 폐기됩니다, 왜냐하면 이 경우, 슬롯 1은 슬롯 0과 동일한 데이터일 것으로 간주되기 때문입니다. 만약 수신 데이터가 진짜 스테레오 (좌우 채널이 다름)인 경우, MONO 비트는 의미가 없으며, 스테레오 → 모노 변환은 소프트웨어에서 처리해야 합니다.

 

Companding 모드(압축 모드)

통신(Telecommunication) 애플리케이션에서는 전송 또는 수신되는 데이터를 컴팬딩(Companding) 알고리즘을 통해 처리해야 할 수 있습니다. Companding(Compression + Expanding)는 아날로그 오디오 또는 음성 데이터를 동적 범위를 줄여 디지털화할 때 자주 사용하는 방식입니다. 이 기능을 사용하면, 오디오 데이터를 전송 전에 압축하거나 수신 후 복원할 수 있어
통신 대역폭을 줄이면서 음성 품질을 유지할 수 있습니다. 단, Free Protocol Mode에서만 사용 가능하므로, I2S 같은 고정 포맷에서는 동작하지 않습니다.

 

Free Protocol Mode가 선택된 경우, SAI_xCR2 레지스터의 COMP[1:0] 비트를 설정함으로써 응용 소프트웨어는 데이터를 SD 직렬 출력 라인으로 전송하기 전에 압축(compression)하거나, SD 직렬 입력 라인으로 수신한 후 확장(expansion)할지를 선택할 수 있습니다. 지원되는 두 가지 컴팬딩 모드는 다음과 같습니다:

  • μ-Law (뮤-로우)
  • A-Law (에이-로우)

이 둘은 국제 CCITT G.711 권고안에 포함된 로그 압축 방식입니다.

 

미국과 일본에서 사용하는 컴팬딩(Companding) 표준은 µ-Law입니다. 이 방식은 14비트의 다이내믹 레인지(dynamic range)를 지원하며, SAI_xCR2 레지스터에서 COMP[1:0] = 10으로 설정합니다.

 

유럽에서 사용하는 컴팬딩 표준은 A-Law이며, 이 방식은 13비트의 다이내믹 레인지를 지원합니다. A-Law는 COMP[1:0] = 11로 설정합니다.

 

µ-Law 및 A-Law 방식 모두에서 데이터는 1의 보수(1’s complement) 또는 2의 보수(2’s complement)로 계산할 수 있으며, 이 방식은 SAI_xCR2의 CPL 비트 설정에 따라 달라집니다. 이 CPL 비트를 통해 1의 보수/2의 보수 표현을 선택할 수 있어 호환성을 유지한 통신이 가능합니다. µ-Law와 A-Law에서는 데이터가 항상 8비트 크기이며, MSB 정렬됩니다. 즉, 컴팬딩된 데이터는 항상 8비트로 전송됩니다. 이 때문에, SAI_xCR1 레지스터의 DS[2:0] 비트는 SAIEN 비트가 활성화(=1)되고, COMP[1:0] 비트 중 하나가 설정된 경우 자동으로 010(=8비트)로 강제 설정됩니다.

 

컴팬딩 처리가 필요하지 않은 경우, COMP[1:0] 비트는 0으로 유지해야 합니다.

 

압축(Compression) 및 확장(Expansion) 모드는 SAI_xCR2 레지스터를 통해 자동으로 선택됩니다:

  • SAI 오디오 블록이 송신기(transmitter)로 구성되어 있고, SAI_xCR2의 COMP[1] 비트가 설정되어 있다면,
    Compression(압축) 모드가 적용됩니다.
  • SAI 오디오 블록이 수신기(receiver)로 선언되어 있다면, Expansion(확장) 알고리즘이 적용됩니다.

이를 통해 별도의 소프트웨어 처리를 하지 않아도 G.711 기반 음성 통신에 최적화된 데이터 전송이 가능하며, 오디오 압축 및 복원이 매우 간편해집니다.

 

비활성 슬롯 전송 시 SAI 출력 데이터 라인(SD) 관리

 

SAI 송신기 모드에서, 비활성 슬롯 전송 시 SD 출력 라인을 0으로 고정하거나 하이 임피던스로 해제할 수 있습니다. 이 설정은 TRIS 비트를 통해 제어됩니다. 즉, 

  • SAI가 SD 출력 라인에 0을 강제로 출력하거나
  • 마지막 데이터 비트 전송이 끝난 후 SD 라인을 high-Z(하이 임피던스) 상태로 해제하여, 해당 노드에 연결된 다른 송신기가 라인을 사용할 수 있도록 합니다.

중요한 점은, **두 송신기가 동시에 SD 라인을 구동하려고 하면 단락(short-circuit)**이 발생할 수 있으므로, 절대로 같은 SD 핀을 동시에 구동하면 안 됩니다.


송신 간 간격을 확보하기 위해
, 데이터 길이가 32비트보다 짧은 경우, SAI_xSLOTR 레지스터의 SLOTSZ[1:0] = 10으로 설정하여 데이터를 32비트로 확장할 수 있습니다. 이렇게 설정하면, 활성 슬롯(active slot)의 LSB 이후(0으로 패딩되는 동안), 다음 슬롯이 비활성인 경우 SD 라인이 tri-state(high-Z)로 전환됩니다.

또한, (슬롯 수 × 슬롯 크기) < 프레임 길이인 경우, 오디오 프레임을 0으로 패딩하여 완성하는 과정 중에도 SD 라인은 tri-state 처리됩니다.

 

 

 

선택된 오디오 프로토콜이 FS 신호를 프레임 시작 및 채널 측 구분용으로 사용할 경우 (SAI_xFRCR 레지스터에서 FSDEF = 1), tristate 모드Figure 405의 조건에 따라 관리됩니다:

  • SAI_xCR1의 TRIS 비트 = 1
  • FSDEF = 1
  • Half frame length > 슬롯 개수의 절반
  • NBSLOT = 6

이 조건 하에서, 하이 임피던스 제어는 각 슬롯과 채널 경계에서 적절히 적용됩니다.

 

 

만약 SAI_xCR2 레지스터의 TRIS 비트가 클리어(=0)되어 있다면, 위 그림 Figure 404 및 405에서 SD 출력 라인이 high-Z가 되던 모든 부분은 0을 출력하도록 대체됩니다.


[다음 회차]

 

 

[STM32F7] SAI(Serial audio interface) Error flag

[이전 회차] [STM32F7] SAI(Serial audio interface) Specific features[이전 회차] [STM32F7] SAI(Serial audio interface) SPDIF output[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (6)[이전 회차] [STM32F7] SAI(Serial audio interf

starlighton.com

 

 

 

 

 

 

 

 

반응형