Embedded/ST Series

[STM32F7] I2S(integrated interchip sound) 학습하기 (2)

별빛의온기 2025. 5. 13. 12:05
반응형

[이전 회차]

 

[STM32F7] STM32의 I2S(integrated interchip sound) 학습하기 (1)

들어가기 앞서 이것은 STM32F7 DataSheet에 나온 문서를 기반으로 개인적으로 정리한 자료입니다. 만약, 오정보가 있다면 댓글로 알려주시면 감사하겠습니다. 그럼 STM32에서의 I2S 구조를 파악함에 앞

starlighton.com

 


 

I2S의 데이터 전송 방식

 

 

I2S는 주로 오디오 데이터를 전송하는 데 사용되며, 일반적으로 좌/우(L/R) 두 채널의 데이터를 시간 분할(time-multiplexed) 방식으로 처리합니다. 즉, 좌/우 채널 순서로 데이터를 번갈아 전송하는 방식입니다.

 

I2S는 Half-Duplex 방식이 기본이므로 송신과 수신을 동시에 처리할 수 없습니다. 때문에 데이터를 전송할 때는 항상 16bit 단위로 처리해야 합니다. 그 이유는 I2S에서 사용되는 SPIx_DR 레지스터가 16bit 크기로 구성되어 있기 때문입니다.

 

 

SPIx_DR는 송신 또는 수신 시에 데이터를 읽고 쓰는 데 사용되며, 하드웨어적으로 FIFO 인터페이스와 직접 연결되어 있어, 사용자 코드는 오로지 DR 레지스터만 접근하면 됩니다. 이 레지스터는 I2S 모드에서도 SPI와 동일하게 동작합니다.

 

Channel 구분 방식

 

I2S 통신에서 좌/우(L/R) 채널 데이터는 항상 ‘왼쪽 → 오른쪽’ 순서로 전송됩니다.

하지만 I2S는 Half-Duplex이여서, 송수신 모두 SPIx_DR 레지스터를 통해 처리되기 때문에 소프트웨어 입장에서는 어느 채널의 데이터가 수신되었는지 알기 어려울 수 있습니다.

 

따라서 전송 시 소프트웨어는 이 순서에 맞게 데이터를 준비해 SPIx_DR에 순차적으로 기록하면 되고,
수신 시에는 CHSIDE 비트를 통해 현재 수신된 데이터가 어느 채널에 해당하는지 확인해야 합니다.

 

CHSIDE 비트는 I2S Philips, MSB 우선, LSB 우선 모드에서만 유효하며, PCM 모드에서는 채널 구분 방식이 다르기 때문에 CHSIDE 비트는 의미를 갖지 않습니다.

<주의사항>
CHSIDE는 I2S Philips ,MSB 우선 모드, LSB 우선 모드에서 유효합니다.
PCM 모드에서는 채널 구분 방식이 다르기 때문에 이 비트는 의미가 없습니다.

 

CHSIDE = 0 왼쪽 채널 (Left)
CHSIDE = 1 오른쪽 채널 (Right)



Data 및 Frame 형식

 

데이터 포멧은 아래와 같이 4가지가 있습니다.

 

데이터 크기 프레임 크기
16bit 16bit
16bit 32bit
24bit 32bit
32bit 32bit

 

<참고>
프레임은 채널당 전송 단위를 의미하며, 데이터 크기보다 프레임 크기가 클 경우, 남는 영역은 하드웨어에 의해 자동으로 0으로 패딩 처리됩니다.

 

데이터의 길이에 따라 접근 방식 달라지는데 예를 들면 아래와 같습니다.

 

1. 16bit 데이터 → 32bit 프레임

  • 상위 16비트(MSB)는 유효한 데이터
  • 하위 16비트(LSB)는 자동으로 0으로 채워짐
  • 소프트웨어나 DMA가 별도 처리할 필요 없음 (1회 읽기/쓰기로 전송 가능)

 

2. 24bit 또는 32bit 데이터 → 32bit 프레임

  • 레지스터(SPIx_DR)를 2회 연속 접근해야 함
    • CPU 방식: 2번 읽기/쓰기
    • DMA 방식: 2개의 half-word 전송
  • 24bit의 경우, 하위 8비트는 하드웨어가 0으로 패딩
<참고>
모든 데이터 포맷과 오디오 통신 표준(I²S, MSB/LSB Justified, PCM)에서는 MSB(Most Significant Bit)가 항상 먼저 전송됩니다. 즉, LSB 우선 모드조차도 전송 순서는 MSB부터 시작하며, 데이터의 정렬만 다를 뿐입니다.

 

I2S가 지원하는 오디오 프로토콜

 

I2S 인터페이스는 다음의 4가지 오디오 표준 프로토콜을 지원합니다:

  • I2S (Philips 표준)
  • MSB Justified
  • LSB Justified
  • PCM

이 프로토콜들은 SPIx_I2SCFGR 레지스터I2SSTD[1:0]PCMSYNC 비트를 통해 구성할 수 있습니다.

 

 

1. I2S Philips

I2S Philips 는 가장 널리 사용되는 표준 모드입니다,

 

 

WS(Word Select)신호

 

WS(Word Select) 신호는 현재 전송되고 있는 데이터가 속한 채널(Left 또는 Right)을 나타냅니다.
WS는 데이터 프레임이 시작되기 1 클럭 전에 전환되므로, WS의 상태는 항상 SD 라인의 현재 데이터와 채널이 일치합니다.

 

 

16/32bit 전송 방식

 

 

 

16/32bit 전송 방식에서 데이터는 클럭 신호의 falling edge에서 전송쪽에서 출력되고, 수신쪽은 rising edge에서 이를 샘플링합니다. WS가 Low이므로 해당 데이터의 채널은 Left이며, MSB를 전송하기 전의 1 클락전에 WS가 변화한것을 볼 수 있습니다. 

 

 

24bit 전송 방식

 

 

 

  • I2S Philips에서는 채널당 프레임 크기를 32bit 고정으로 사용하는 것이 일반적입니다.
  • 24bit 데이터를 전송할 경우, 하위 8비트는 자동으로 ‘0’ 패딩됩니다.
  • 이 방식은 데이터를 두 번에 나누어 Write/Read해야 합니다. 따라서 SPIx_DR에 두 번 연속 접근이 필요하며, 하위 8비트는 무시하면 됩니다.

 

예1) 전송모드에서 0x8EAA83 이라는 24bit 데이터를 전송해야 하는 경우

 

 

  • 첫 번째 쓰기에서는 상위 16bit인 0x8EAA가 SPIx_DR에 쓰입니다.
  • 두 번째 쓰기에서는 하위 8bit를 상위 바이트로 옮긴 0x33XX가 기록됩니다. 이때 0xXX는 무시되며, 하위 8비트 0x33만 유효합니다.

즉, 실제 전송되는 데이터는 0x8EAA33이며, 두 번의 레지스터 접근을 통해 총 24bit가 전송됩니다.

 

 

 

예2) 수신모드에서 0x8EAA83 이라는 24bit 데이터를 수신해야 하는 경우

 

 

  • 첫 번째 읽기는 상위 16bit 0x8EAA이고, 두 번째 읽기는 하위 8bit를 상위 바이트로 옮긴 0x33XX입니다.
    이때, 하위 8bit(XX)는 의미가 없으므로 버려도 됩니다.

 

 

만약, 16bit 데이터를 32bit 프레임으로 확장하여 사용하는 경우, SPIx_DR 레지스터에 한 번만 접근하면 됩니다. 이 경우 16bit만 처리하더라도, 하드웨어는 자동으로 하위 16bit를 0x0000으로 패딩하여 32bit 프레임을 유지합니다.

 

 

예를 들어, 전송 또는 수신할 데이터가 0x76A3일 경우,32bit 프레임으로 확장하면 0x76A30000이 되며, 아래와 같이 SPIx_DR에 한 번만 접근하면 됩니다.

 

 

 

SPIx_DR에 16bit 데이터를 쓰면, 하드웨어적으로 나머지 16bit를 0으로 패딩하여 32bit 프레임을 구성하게 됩니다. 이 방식은 접근 횟수가 적기 때문에, DMA나 Interrupt 방식과 함께 사용하기에 적합합니다.

 

이때, 데이터 전송과 수신시의 내부 동작은 아래와 같습니다.

 

1) 데이터 전송(TX)

  • SPIx_DR 레지스터에 MSB(상위 16비트)를 쓰면, 하드웨어가 자동으로 이를 전송 준비 상태로 바꿉니다.
  • 이때 TXE (Transmit Buffer Empty) 플래그가 즉시 설정되며, 인터럽트가 허용되어 있다면 인터럽트가 발생합니다.

이때, 아직 이전 하위 16비트(예: 0x0000 패딩)가 전송되지 않았어도, TXE가 먼저 설정되면서 다음 데이터를 미리 준비할 수 있습니다. 즉, 하드웨어가 자동으로 데이터 전송을 관리하기 때문에, 사용자는 다음 데이터를 미리 준비할 수 있는 여유를 갖게 됩니다.

 

2) 데이터 수신(RX)

 

  • 32bit 프레임 중 상위 16bit(MSB)가 도착하면 RXNE(Receive Buffer Not Empty) 플래그가 세트됩니다.
  • 인터럽트가 활성화된 경우 인터럽트가 발생합니다.

 

이때, 수신 시에도 상위 16비트가 도착하면 RXNE 플래그가 먼저 설정되므로, 하위 16비트(LSB)가 아직 도착하지 않았더라도 처리 지연 없이 데이터를 빨리 받아들일 수 있습니다.

 

이렇게 하면 송신(TX)의 경우, 다음 데이터를 준비할 충분한 시간 확보 가능하고, 수신(RX)의 경우, 상위 데이터를 미리 읽어와 수신 버퍼를 읽지 못하는것을 방지하기 때문에 데이터 언더런(미리 못 보냄), 오버런(미리 못 읽음)이 방지 됩니다. 오디오는 실시간 전송이기 때문에 생긴 구조라고 보면 됩니다.

 

2. MSB 우선

 

MSB 우선(MSB Justified)은 WS 신호가 전환되자마자, 즉시 MSB부터 데이터 전송이 시작되는 구조입니다.

 

 

 

MSB는 WS 전환과 동시에 SD 라인에 출력됩니다. 이때, 데이터는 I2S Philips와 동일하게 CK의 falling edge에서 전송되고, rising edge에서 수신됩니다. 

 

 

앞서 본 I2S Philips와 똑같이 프레임과 데이터수가 동일하지 않을경우 MSB 데이터를 먼저 보내고 뒤의 bit들은 0으로 패딩합니다. 

 

3. LSB 우선

 

LSB 우선은 MSB 우선과 유사합니다. MSB 우선이 앞쪽 정렬이라면, LSB 우선은 뒤쪽 정렬이라고 이해하면 됩니다.

 

 

16bit 프레임에 16bit 데이터를 보내거나, 32bit 프레임에 32bit 데이터를 보내면 MSB 방식과 큰 차이가 없습니다. 데이터는 여전히 MSB부터 전송됩니다.

 

 

하지만, 32bit 프레임에 24bit 데이터를 전송하는 경우, 앞쪽 8비트는 자동으로 0 패딩되며, 데이터는 여전히 MSB부터 전송됩니다.

즉, 데이터는 하위 24비트에 붙고, 상위 8비트는 의미가 없습니다.

 

요약하면 LSB 우선은

 

  • WS 신호에 따라 채널 전환이 이루어지며, 데이터는 MSB부터 전송됩니다.
  • 다만, 데이터의 위치가 오른쪽에 정렬되어 출력됩니다.
  • 즉, 프레임 내에서 LSB가 끝에 맞춰지고, 앞쪽은 자동 패딩됩니다.

 


예1) 전송모드에서 0x3478AE 이라는 24bit 데이터를 전송해야 하는 경우

 

 

소프트웨어 또는 DMA를 통해 SPIx_DR 레지스터에 두 번의 쓰기 작업이 필요합니다.

 

  • 첫 번째 쓰기는 상위 8bit가 0으로 패딩되고, 하위 8bit로 0x34를 포함한 0x0034가 전송됩니다.
  • 두 번째 쓰기는 나머지 16bit 0x78AE를 씁니다.


예2) 수신모드에서 0x3478AE 이라는 24bit 데이터를 수신해야 하는 경우

 

 

 

  • RXNE 이벤트마다 SPIx_DR 레지스터에서 두 번 연속으로 읽기 작업이 필요합니다.
  • 첫 번째 읽기는 0으로 패딩된 8bit와 상위 8bit를 포함한 0xXX34, 두 번째 읽기는 0x78AE입니다. 이때, 상위 8bit는 의미가 없으므로 무시해도 됩니다.

 

만약, 16Bit 프레임을 32비트 채널 프레임으로 확장하는것을 설정했다면, SPIx_DR 레지스터에 대한 접근은 한 번만 하면 됩니다. 이 경우 16Bit 데이터를 처리하더라도 32비트 프레임을 유지하게 되는데, 나머지 16Bit는 하드웨어가 자동으로 0x0000을 채워 넣습니다.

 

예를 들어, 전송할 데이터 또는 수신할 데이터가 0x76A3(32bit 확장 시 0x000076A3)이라면, 아래와 같이 SPIx_DR에 단 한 번만 접근하면 됩니다.

 

 

 

이때, 데이터 전송과 수신시의 내부 동작은 아래와 같습니다.

 

1) 데이터 전송(TX)

 

  • TXE 이벤트가 발생하면 애플리케이션은 전송할 데이터(예: 0x76A3)를 써야 합니다.
  • 예를 들어, 전송할 16bit 데이터가 0x76A3라면,하드웨어는 이를 32bit 프레임으로 채우기 위해 상위 16bit를 자동으로 0x0000으로 패딩한 뒤, 전체 0x76A3를 전송하게 됩니다.
  • 즉, 하드웨어가 0으로 패딩하는 필드에는 TXE를 기다리지 않고 자동 처리한다는 뜻이기도 합니다.

 


2) 데이터 수신(RX)

  • RXNE(Receive Buffer Not Empty) 플래그가 언제 발생하느냐가 중요합니다.
  • STM32는 의미 없는 0x0000이 아닌, 실제 유효한 데이터(하위 16bit)가 수신될 때 RXNE를 세트합니다.
    즉, 사용자는 가짜 데이터(0으로 패딩된 필드)를 신경 쓸 필요 없이, 유효 데이터만 처리하면 됩니다.

 

이렇게 하면 송신(TX)의 경우, 다음 데이터를 준비할 충분한 시간 확보 가능하고, 수신(RX)의 경우, 상위 데이터를 미리 읽어와 수신 버퍼를 읽지 못하는것을 방지하기 때문에 데이터 언더런(미리 못 보냄), 오버런(미리 못 읽음)이 방지 됩니다. 

 

4. PCM

 

PCM은 음성 신호의 전송에 주로 사용되며, I2S처럼 오디오 데이터 전송에도 널리 활용됩니다. PCM은 채널을 구분하는 WS(Word Select) 신호를 다르게 사용하며, 두 가지 방식의 동기화 모드(Short Frame, Long Frame)를 지원합니다. 이는 SPIx_I2SCFGR 레지스터의 PCMSYNC Bit를 사용하여 설정할 수 있습니다.

 

PCM 모드는 두 가지 동기화 방식 제공:

  1. Short Frame Synchronization (1클럭)
  2. Long Frame Synchronization (13클럭)

 

PCM 모드에서 출력 신호(WS, SD)는 CK의  rising edge에서 전송쪽에서 샘플링되고, 입력 신호는 CK의 falling edge에서 샘플링됩니다. 위에 언급한 3가지와는 다른 타이밍에 샘플링됩니다.

 

마스터 모드라면 CK와 WS는 출력으로 설정됩니다. 

 

 

Short frame이라면 WS는 1클럭만 활성화되며, Long frame이라면 마스터 모드에서 13 클럭동안 유지됩니다. 그리고  SD는 MSB부터 전송됩니다.

 

 

 

데이터는 16bit이고 프레임은 32bit인 경우 나머지 16bit는 하드웨어가 자동으로 0으로 패딩합니다. 

 

 

참고로 PCM은 마스터/슬레이브 관계 없이 동작합니다.

그리고 short/long frame 방식 모두에 대해 데이터 간 간격, 즉 두 연속된 데이터 사이의 클럭 수를 DATLEN, CHLEN 비트를 통해 설정해야 합니다 (SPIx_I2SCFGR 사용).

 

Master Mode에서 각 인터페이스의 Start-up sequence

 

아래 그림은 I2S 또는 PCM을 Master로 설정하고 SPI/I2S를 Enable(I2SE=1) 하면, 클럭(CK), WS, SD의 초기 상태와 전송이 어떻게 시작되는지를 도식적으로 보여주는 설명입니다. 또한 CK 극성 설정(CKPOL) 값에 따라 출력 클럭의 위상이 어떻게 달라지는지도 함께 나타냅니다.

 

 

 

이전 설명과 마찬가지로, 모든 모드는 I2SE 비트를 통해 SPI/I2S가 Enable될 때 시작되며,첫 데이터 전송 전에 항상 dummy 전송이 포함될 수 있다는 점을 보여줍니다.

 

마스터가 아닌 슬레이브 모드에서는?

 

슬레이브 모드에서 프레임 동기화 감지 방식은 ASTRTEN 비트 값에 따라 달라집니다.

 

 

1) ASTRTEN = 0

  • 오디오 인터페이스가 활성화된 경우(I2SE = 1), 하드웨어는 CK 신호를 사용하여 수신 WS 신호의 적절한 전환을 기다립니다. 
  • Philips을 사용하는 경우 WS의 falling edge, 다른 표준을 사용하는 경우는 rising edge 입니다. 

 

2) ASTRTEN = 1

  • WS가 활성화 되기 전에 사용자가 직접 I2SE를 적절한 WS 상태에 맞춰 Enable 해야 합니다.
    • Philips 모드: WS = 1일 때 I2SE = 1
    • 다른 모드: WS = 0일 때 I2SE = 1

 

 

즉, 슬레이브 모드에서는 프레임 동기화를 수동 또는 자동으로 처리할 수 있으며, ASTRTEN이 0이면 자동 동기화, 1이면 수동 트리거가 필요합니다.

 


[다음 회차]

 

 

[STM32F7] I2S(integrated interchip sound) 학습하기 (3)

[이전 회차] [STM32F7] I2S(integrated interchip sound) 학습하기 (2)[이전 회차] [STM32F7] STM32의 I2S(integrated interchip sound) 학습하기 (1)들어가기 앞서 이것은 STM32F7 DataSheet에 나온 문서를 기반으로 개인적으로

starlighton.com

 

 

 

반응형