Embedded/ST Series

[STM32F7] SAI(Serial audio interface) FIFO, Interrupt

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

 

[이전 회차]

 

 

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

[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (3)[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (2)[이전 회차] [STM32F7] SAI(Serial audio interface) 학습하기 (1)들어가기 앞서 이것은 STM32F7 DataShee

starlighton.com

 

 




Internal FIFOs

 

SAI의 각 오디오 블록에는 고유한 FIFO가 있습니다. 해당 블록이 송신기로 설정되어 있다면 FIFO는 쓰기(write) 동작을 하고, 수신기로 설정되어 있다면 FIFO는 읽기(read) 동작을 수행합니다. 따라서 SAI_xSR 레지스터의 FREQ 비트와 연결된 FIFO 요청(FIFO request)은 하나뿐입니다.

 

SAI_xIM 레지스터에서 FREQIE 비트가 활성화된 경우, 인터럽트가 발생할 수 있습니다. 이 인터럽트의 발생 조건은 다음과 같습니다:

  • FIFO 임계값(FIFO threshold) 설정 (SAI_xCR2 레지스터의 FLVL 비트에 의해 설정됨)
  • 통신 방향 (송신기인지 수신기인지) 
    - 아래에서 설명,

송신기 모드에서의 인터럽트 생성 

송신기 모드에서 인터럽트 발생 여부는 FIFO 설정에 따라 달라집니다:

    • SAI_xCR2 레지스터의 FIFO 임계값 비트(FTH[2:0])가 FIFO 비어 있음(FIFO empty)으로 설정되어 있는 경우 (즉, 0b000),만약 SAI_xDR 레지스터에 전송할 데이터가 하나도 없다면, SAI_xSR 레지스터의 FREQ 비트가 하드웨어에 의해 1로 설정되며 인터럽트가 발생합니다. (이때, SAI_xSR의 FLVL[2:0] 비트가 0b001보다 작다는 것은 FIFO가 완전히 비어 있음을 의미합니다.)이 인터럽트는 FIFO가 더 이상 비어 있지 않을 때, 즉 FIFO에 하나 이상의 데이터가 저장되면 자동으로 클리어됩니다. 이때, FLVL[2:0] 값이 0b000이 아니게 되므로, 인터럽트 플래그(FREQ)도 자동으로 내려갑니다.
      즉, 인터럽트는 비어 있는 순간에만 발생하며, 그 상태가 해소되면 즉시 사라집니다.
    • SAI_xCR2 레지스터의 FIFO 임계값(FTH[2:0])이 1/4 채움 상태(FIFO quarter full)로 설정된 경우 (FTH = 0b001), FIFO에 저장된 데이터가 1/4 미만일 때 인터럽트가 발생합니다. 이 경우 하드웨어가 SAI_xSR 레지스터의 FREQ 비트를 1로 설정하여 인터럽트를 생성합니다. 즉, SAI_xSR의 FLVL[2:0] 비트 값이 0b010보다 작을 때 인터럽트가 발생합니다. 이 인터럽트(FREQ)는, FIFO에 적어도 1/4 이상 데이터가 저장되었을 때 (즉, FLVL[2:0] ≥ 0b010), 하드웨어에 의해 자동으로 클리어됩니다.
      이 구조는 FIFO 언더런(underrun)을 방지하기 위해, 데이터가 완전히 소진되기 전에 미리 CPU나 DMA가 데이터를 공급할 수 있도록 유도합니다.
    • SAI_xCR2 레지스터의 FIFO 임계값 비트(FTH[2:0])가 FIFO 절반 채움 상태(half full)로 설정된 경우 (FTH = 0b010), FIFO에 저장된 데이터가 절반보다 적을 때, 인터럽트가 발생합니다. 즉, SAI_xSR 레지스터의 FLVL[2:0] 비트가 0b011보다 작을 때, FREQ 비트가 하드웨어에 의해 1로 설정되어 인터럽트가 생성됩니다. 이 인터럽트는, FIFO에 최소 절반 이상 데이터가 채워졌을 때(FLVL ≥ 0b011) 하드웨어가 FREQ 비트를 자동으로 클리어하면서 종료됩니다.
      정리하면 FIFO에 데이터가 절반 미만으로 남았을 때 인터럽트가 발생하며, 이 인터럽트는 FIFO가 다시 절반 이상 채워지면 자동으로 해제됩니다.
      이 설정은 FIFO가 너무 빨리 비는 것을 방지하고, 데이터가 끊기지 않도록 사전에 보충할 수 있도록 돕는 중간 단계의 보호 수단입니다.
    • SAI_xCR2 레지스터의 FIFO 임계값 비트(FTH[2:0])가 FIFO 3/4 채움 상태(three quarter full)로 설정된 경우 (FTH = 0b011), FIFO에 저장된 데이터가 3/4 미만일 때, 인터럽트가 발생(FREQ 비트가 하드웨어에 의해 1로 설정)합니다. 즉, SAI_xSR 레지스터의 FLVL[2:0] 비트 값이 0b100보다 작을 때 인터럽트가 생성됩니다. 이 인터럽트는, FIFO에 적어도 3/4 이상 데이터가 채워졌을 때 (즉, FLVL[2:0] ≥ 0b100) FREQ 비트가 하드웨어에 의해 자동으로 클리어되어 해제됩니다.
      정리하자면 FIFO에 데이터가 3/4 미만으로 저장되어 있을 때 인터럽트가 발생합니다. 이후 FIFO가 다시 3/4 이상 채워지면 인터럽트는 자동으로 해제됩니다.
      이 방식은 FIFO가 충분히 채워진 상태에서만 전송이 이뤄지도록 유도하며, 데이터 언더런을 사전에 방지하는 안정 지향적인 설계에 적합합니다.
    • SAI_xCR2 레지스터의 FIFO 임계값 비트(FTH[2:0])가 FIFO 가득 참(FIFO full)으로 설정된 경우 (FTH = 0b100), FIFO가 완전히 가득 차지 않았을 경우 (FLVL[2:0] < 0b101), 하드웨어는 SAI_xSR 레지스터의 FREQ 비트를 1로 설정하여 인터럽트를 발생시킵니다. 이 인터럽트(FREQ 비트)는, FIFO가 완전히 가득 찼을 때(FLVL = 0b101) 하드웨어에 의해 자동으로 클리어됩니다.
      요약하면 FIFO가 완전히 차지 않은 상태에서는 인터럽트가 발생하고, FIFO가 완전히 채워졌을 때 자동으로 인터럽트가 해제됩니다.
      이 방식은 FIFO가 충분히 버퍼링된 후 전송하도록 설계된 시스템에 적합하며,데이터 손실 없이 안정적인 대량 전송을 요구하는 경우에 유리합니다.

수신기 모드에서의 인터럽트 생성 

수신기 모드에서의 인터럽트 발생 조건은 FIFO 구성에 따라 달라집니다:

  • SAI_xCR2 레지스터의 FIFO 임계값 비트(FTH[2:0])가 FIFO Empty (FTH = 0b000)로 설정된 경우, SAI_xDR 레지스터에 적어도 하나 이상의 데이터가 존재하면 (SAI_xSR의 FLVL[2:0] ≥ 0b001), SAI_xSR 레지스터의 FREQ 비트가 하드웨어에 의해 1로 설정되며, 인터럽트가 발생합니다. 이 인터럽트(FREQ 비트)는, FIFO가 다시 비었을 때 (FLVL[2:0] = 0b000) 하드웨어에 의해 자동으로 클리어됩니다.
    요악하면 FIFO에 데이터가 하나라도 들어오는 순간 인터럽트가 발생합니다. 이 인터럽트는 FIFO가 다시 비면 자동으로 해제됩니다.
    이 방식은 즉시 처리해야 할 수신 데이터를 빠르게 감지할 수 있어서, 낮은 지연이 필요한 시스템에 매우 유용합니다.
  • SAI_xCR2 레지스터에서 FIFO 임계값 비트(FTH[2:0])가 FIFO 1/4 채움 상태(FTH = 0b001)로 설정된 경우, FIFO의 저장 공간 중 최소 1/4 이상이 채워져 있을 때 (FLVL[2:0] ≥ 0b010), 하드웨어가 SAI_xSR 레지스터의 FREQ 비트를 1로 설정하여
    인터럽트를 발생시킵니다. 이 인터럽트(FREQ)는, FIFO의 데이터가 1/4 미만으로 떨어졌을 때 (FLVL[2:0] < 0b010), 하드웨어에 의해 자동으로 클리어됩니다.
    요약하면 FIFO에 데이터가 1/4 이상 쌓였을 때 인터럽트가 발생하고,다시 1/4 미만으로 줄어들면 인터럽트는 자동으로 해제됩니다.
    이 방식은, 데이터를 여유 있게 확보한 뒤에 처리할 수 있는 환경에 적합하며, 시스템 부하를 줄이는 동시에 안정적인 수신을 가능하게 합니다.
  • SAI_xCR2 레지스터의 FIFO 임계값 비트(FTH[2:0])가 FIFO 절반 채움 상태(FTH = 0b010)로 설정된 경우, FIFO 저장 공간의 절반 이상이 데이터로 채워져 있을 때 (FLVL[2:0] ≥ 0b011), 하드웨어가 SAI_xSR 레지스터의 FREQ 비트를 1로 설정하여 인터럽트를 발생시킵니다. 이 인터럽트(FREQ 비트)는, FIFO에 저장된 데이터가 절반 미만이 되었을 때 (FLVL[2:0] < 0b011), 하드웨어에 의해 자동으로 클리어됩니다.
    요약하면 FIFO에 데이터가 절반 이상 쌓였을 때 인터럽트가 발생하고, 다시 절반 미만으로 떨어지면 인터럽트는 자동 해제됩니다.
    이 방식은 빈번한 인터럽트 호출을 줄이면서도 일정량의 데이터를 확보하고 처리하는 데 적합하며, DMA나 대용량 버퍼 기반 수신 구조에 효과적입니다.
  • SAI_xCR2 레지스터에서 FIFO 임계값 비트(FTH[2:0])가 FIFO 3/4 채움 상태(FTH = 0b011)로 설정된 경우, FIFO 저장 공간의 3/4 이상이 데이터로 채워져 있을 때 (FLVL[2:0] ≥ 0b100), 하드웨어는 SAI_xSR 레지스터의 FREQ 비트를 1로 설정하여 인터럽트를 발생시킵니다. 이 인터럽트(FREQ 비트)는, FIFO의 데이터가 3/4 미만으로 줄어들었을 때 (FLVL[2:0] < 0b100), 하드웨어에 의해 자동으로 클리어됩니다.
    요약하면 FIFO에 데이터가 3/4 이상 쌓였을 때 인터럽트가 발생하고, 3/4 미만으로 줄어들면 자동으로 해제됩니다.
    이 구성은 빈번한 인터럽트를 피하고, 데이터를 묶어서 효율적으로 처리하려는 경우에 적합하며, 버스트 기반 처리, 지연 허용 수신 시스템에서 유리합니다.
  • SAI_xCR2 레지스터의 FIFO 임계값 비트(FTH[2:0])가 FIFO 가득 참(full)으로 설정된 경우 (FTH = 0b100), FIFO가 완전히 가득 찼을 때 (SAI_xSR의 FLVL[2:0] = 0b101), 하드웨어는 SAI_xSR 레지스터의 FREQ 비트를 1로 설정하여 인터럽트를 발생시킵니다. 이 인터럽트(FREQ 비트)는, FIFO가 가득 차지 않은 상태가 되었을 때 (FLVL[2:0] < 0b101), 하드웨어에 의해 자동으로 클리어됩니다.
    요약하면 FIFO가 완전히 가득 찼을 때 인터럽트가 발생하며, 데이터가 하나라도 빠지면 자동으로 해제됩니다.
    이 방식은 수신 데이터를 최대한 누적 후 처리하려는 경우에 유리하며, 인터럽트 빈도를 최소화하고 최대량 수신 후 처리가 필요한 시스템에 적합합니다.

 

인터럽트 발생 방식과 마찬가지로, SAI_xCR1 레지스터의 DMAEN 비트가 설정되면, SAI는 DMA를 사용할 수 있습니다. FREQ 비트가 설정되는 방식은, 앞서 설명한 FREQIE를 통한 인터럽트 발생 방식과 동일합니다. 각 FIFO는 8워드(word) 크기로 구성되어 있으며, FIFO에 대해 읽기 또는 쓰기 작업이 수행될 때마다, 접근 크기(size)와 관계없이 한 워드 크기의 공간이 사용됩니다. 각 FIFO 워드에는 오디오 슬롯(audio slot) 하나가 포함되어 있으며, SAI_xDR 레지스터에 접근할 때마다 FIFO 포인터는 한 워드씩 증가하여, DMA 또는 CPU가 데이터를 순차적으로 처리하도록 설계되어 있습니다.

 

SAI에서 SAI_xDR 레지스터에 이터를 읽거나 쓸 때는 항상 오른쪽 정렬(Right-aligned) 형식을 사용해야 합니다. 이 덕분에 다양한 비트 폭(8, 16, 24, 32비트) 데이터를 통일된 방식으로 처리할 수 있습니다. 또한, SAI가 비활성화된 상태에서, SAI_xCR2 레지스터의 FFLUSH 비트를 설정하면, FIFO 포인터를 초기화(reinitialize)할 수 있습니다. 만약 SAI가 활성화된 상태에서 FFLUSH를 설정하면, FIFO에 저장되어 있던 데이터는 자동으로 소실되므로 주의가 필요합니다.

 

 

 


[다음 회차]

 

 

[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

 

 

 

 

 

 

 

반응형