[이전 회차]
[STM32F7] SAI(Serial audio interface) 학습하기 (1)
들어가기 앞서 이것은 STM32F7 DataSheet에 나온 문서를 기반으로 개인적으로 정리한 자료입니다. 만약, 오정보가 있다면 댓글로 알려주시면 감사하겠습니다. SAI(Serial audio interface)란? 아래 링크박스
starlighton.com
주요 SAI 동작 모드
오디오 서브블록(Audio subblock)이 어떤 기능을 수행할지 설정하는 모드로써, 오디오 블록의 역할(Role) 을 정의합니다.
SAI의 각 오디오 서브블록(Audio Subblock) 은 선택된 오디오 블록의 SAI_xCR1 레지스터의 MODE 비트를 통해 마스터(Master) 또는 슬레이브(Slave) 로 구성할 수 있습니다.
Master mode
SAI가 외부 장치에 클럭 및 동기화 신호를 제공합니다:
- 비트 클럭(SCK_x) 과 프레임 동기화(FS_x) 신호는 각각 SCK_x 핀과 FS_x 핀을 통해 출력됩니다.
- 필요에 따라, SAI는 마스터 클럭(MCLK_x) 신호를 MCLK_x 핀을 통해 출력할 수 있습니다.
이 모드에서는 SCK_x, FS_x, MCLK_x 모두 출력 핀(output)으로 설정됩니다.
Slave mode
SAI가 외부 장치로부터 클럭 신호를 수신해야 합니다.
- SAI 서브블록이 비동기 모드로 구성되면, 클럭(SCK_x) 및 프레임 동기화(FS_x) 신호를 외부에서 입력받아야 하므로, 이 두 핀은 자동으로 입력 모드(Input) 로 설정됩니다.
- 동기(synchronous) 설정에서는 SAI 블록이 내부의 다른 블록 또는 다른 SAI 인터페이스에서 클럭(SCK_x)과 프레임 동기화(FS_x) 를 공유합니다. 이 경우 클럭과 동기 신호를 외부 핀을 통해 생성하거나 수신할 필요가 없으므로, 해당 핀들을 자유롭게 다른 용도로(GPIO) 사용할 수 있게 됩니다.
슬레이브 모드에서는 MCLK_x 핀이 사용되지 않기 때문에, 해당 핀을 자유롭게 다른 기능으로 활용할 수 있습니다.
또한, 클럭 신호를 먼저 생성하는 마스터보다 슬레이브를 먼저 활성화해야 통신 오류를 예방할 수 있습니다.
SAI 모드 구성 및 활성화
SAI의 각 오디오 블록은 서로 다른 오디오 프로토콜을 독립적으로 구성할 수 있으며, SAI_xCR1 레지스터의 PRTCFG[1:0] 비트를 0으로 설정하면 ‘프리 프로토콜 모드’가 활성화됩니다. 이 모드에서는 I2S, MSB/LSB 정렬, PCM/DSP, TDM, AC’97 등을 자유롭게 에뮬레이션할 수 있습니다.
SAI의 각 오디오 서브블록은 MODE 비트를 통해 송신기 또는 수신기로 개별 설정할 수 있으며, 이에 따라 SAI_SD_x 핀은 송신기일 경우 출력(Output) 으로, 수신기일 경우 입력(Input) 으로 자동 설정됩니다.
같은 SAI 모듈 내에 있는 두 개의 마스터 오디오 블록은 서로 다른 MCLK 및 SCK 클럭 주파수를 사용하도록 설정할 수 있다. 이 경우에는 반드시 비동기 모드(asynchronous mode) 로 설정해야 한다.
STM32의 SAI 오디오 블록은 SAI_xCR1 레지스터의 SAIEN 비트를 통해 활성화되며, 이 비트가 1로 설정되는 즉시, 슬레이브 모드에서는 외부로부터 들어오는 클럭(SCK), 데이터(SD), 프레임 동기화(FS) 신호에 대해 즉각적으로 반응을 시작합니다.
따라서 슬레이브 장치는 마스터보다 먼저 안정적으로 활성화되어 있어야, 클럭과 데이터 손실 없이 정상 동작할 수 있습니다.
SAI를 마스터 송신 모드(Master Tx Mode) 로 설정하면, 오디오 블록을 활성화하는 순간부터 FIFO에 전송할 데이터가 없어도 외부 슬레이브를 위한 비트 클럭(SCK) 이 출력됩니다.
단, 프레임 동기화 신호(FS) 는 FIFO에 데이터가 존재할 때에만 생성되며, FIFO가 처음 전송할 데이터를 수신하면 해당 데이터는 외부 슬레이브로 출력됩니다. FIFO에 전송할 데이터가 없는 상태로 동작하면, 오디오 프레임에는 0이 전송되고 언더런(underrun) 플래그가 발생합니다.
슬레이브 모드에서는 오디오 프레임 전송이 자동으로 시작되지 않으며, 오디오 블록이 먼저 활성화(SAIEN=1) 된 상태에서,
외부 마스터로부터 들어오는 프레임 시작 신호(start of frame) 가 감지되어야 프레임 전송이 시작됩니다.
SAI 슬레이브 송신 모드에서 첫 프레임 전송 시 언더런(underrun)을 방지하려면, 다음 3단계의 순서를 반드시 지켜야 합니다:
1. 먼저 SAI_xDR 레지스터에 데이터를 기록합니다 (소프트웨어 또는 DMA로).
2. FIFO 임계값(FLH) 플래그가 0b000(FIFO 비어 있음)이 아닐 때까지 기다립니다.
3. 그런 다음, 오디오 블록을 슬레이브 송신 모드로 활성화(SAIEN=1) 합니다.
SAI 동기화(Synchronization) 모드
클럭 소스와 동기화 방법을 정의하는 모드입니다.
STM32의 SAI 동기화(Synchronization)는 두 가지 계층으로 나뉩니다.
(1) 오디오 서브블록(audio subblock) 레벨
(2) 전체 SAI 인터페이스(SAI level) 수준.
Internal Synchronization – 내부 동기화
SAI의 한 오디오 서브블록(A 또는 B) 은, 같은 SAI 내의 다른 서브블록(B 또는 A) 과 동기화하여 동작하도록 설정할 수 있습니다. 이 경우, 비트 클럭(SCK) 과 프레임 동기화(FS) 신호가 공유되므로, 외부 통신에 필요한 핀 수를 줄일 수 있습니다. 동기화 대상 블록(동기화된 쪽) 은 SCK_x, FS_x, MCLK_x 핀을 사용하지 않으며, 이들 핀은 일반 GPIO로 재할당됩니다. 반면, 비동기 모드로 설정된 블록(= 기준이 되는 마스터 블록) 외부 핀으로 실제 클럭과 FS를 출력합니다.
STM32의 SAI는 두 개의 오디오 블록(A, B)을 이용하여 Full Duplex 통신을 구성할 수 있으며, 이때 한 블록을 동기화 모드(synchronous mode) 로 설정하여 클럭을 내부 공유하는 구조를 사용합니다.
두 오디오 블록 중 하나는 마스터로, 다른 하나는 슬레이브로 설정할 수 있으며, 또는 두 블록 모두 슬레이브로 설정하되, 한 블록은 비동기 모드(SYNCEN[1:0] = 00), 다른 블록은 동기화 모드(SYNCEN[1:0] = 01)로 구성할 수 있습니다.
이렇게 하면 핀 수를 줄이면서도 송신(Tx)과 수신(Rx)을 동시에 처리하는 Full Duplex 통신이 가능합니다.
<참고>
SAI 내부의 재동기화(resynchronization) 단계들로 인해, APB 버스 클럭(PCLK) 주파수는 비트레이트 클럭(bit clock) 주파수의 두 배 이상이어야 합니다.
External Synchronization – 외부 동기화
SAI 오디오 서브블록은 외부의 다른 SAI와 동기화되도록 구성할 수도 있습니다. 이 경우 다음과 같이 구성할 수 있습니다.
1. 다른 SAI가 동기화할 기준이 되는 SAI는, 자신의 어느 서브블록이 FS(프레임 동기화) 및 SCK(비트 클럭) 신호를외부로 제공할지를 먼저 정의해야 합니다.이 작업은 SYNCOUT[1:0] 비트를 설정하여 수행합니다.
2.동기화 신호를 수신할 SAI는, SYNCIN[1:0] 비트를 통해 어떤 외부 SAI가 어떤 SAI를 동기 대상으로 삼을지를 선택해야 합니다. 그리고 두 서브블록 각각에 대해, 해당 블록이 다른 SAI와 동기화할지를 SYNCEN 비트를 통해 명시적으로 설정해야 합니다.
<참고>
SYNCIN[1:0] 및 SYNCOUT[1:0] 비트는 SAI_GCR 레지스터에 위치하며, SYNCEN 비트는 각 오디오 블록의 SAI_xCR1 레지스터에 위치합니다.
SAI 내의 두 오디오 서브블록(A, B)이 모두 외부 SAI와 동기화되어야 하는 경우, 다음 중 하나의 설정 구성을 선택할 수 있습니다.
① 각 오디오 블록을 외부 SAI 블록과 직접 동기화되도록 SYNCEN[1:0] 비트를 설정합니다.
- A와 B 모두 SYNCEN = 10으로 설정
② 하나의 오디오 블록은 외부 SAI에 동기화되도록 설정하고 다른 블록은 내부적으로 그 블록에 동기화되도록 설정합니다. (각각의 SYNCEN[1:0] 비트 설정을 통해)
- 예) A: SYNCEN = 10, B: SYNCEN = 01
다음 표는 사용 중인 SAI 블록에 따라 올바른 동기화 신호(SYNCIN)를 선택하는 방법을 보여줍니다.
예를 들어:
- SAI2가 SAI1로부터 동기화를 받으려면, SAI2.SYNCIN 값을 0으로 설정해야 합니다.
- 반대로 SAI1이 SAI2로부터 동기화를 받으려면, SAI1.SYNCIN 값을 1로 설정해야 합니다.
‘Reserved’로 표시된 값은 사용하면 안 되며, 설정 시 예측 불가능한 동작이 발생할 수 있습니다.
[다음 회차]
'Embedded > ST Series' 카테고리의 다른 글
[STM32F7] SAI(Serial audio interface) 학습하기 (1) (1) | 2025.05.16 |
---|---|
[STM32F7] I2S(integrated interchip sound) 학습하기 (6) (0) | 2025.05.14 |
[STM32F7] I2S(integrated interchip sound) 학습하기 (5) (0) | 2025.05.14 |
[STM32F7] I2S(integrated interchip sound) 학습하기 (4) (0) | 2025.05.14 |
[STM32F7] I2S(integrated interchip sound) 학습하기 (3) (0) | 2025.05.13 |