Embedded/ST Series

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

별빛의온기 2025. 5. 14. 15:17
반응형

 

 

[이전 회차]

 

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

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

starlighton.com

 

 




I2S Master mode 

 

I2S는 마스터 모드로 설정할 수 있으며, 이 경우 클럭(CK)WS(Word Select) 신호는 마스터(STM32)에서 출력하게 됩니다.
마스터 클럭(MCK) 신호는 SPIx_I2SPR 레지스터의 MCKOE 비트에 따라 출력되거나 비활성화될 수 있습니다.

 

설정 절차(Procedure)

 

1. SPIx_I2SPR 레지스터의 I2SDIV[7:0] 비트를 설정하여, 원하는 오디오 샘플링 주파수에 맞는 serial clock baud rate를 생성합니다. 이때 ODD 비트도 함께 설정해야 합니다.

 

2. CKPOL 비트를 설정하여 통신 클럭의 상태 레벨을 정의합니다.
또한 MCKOE 비트를 설정하여 MCK 출력이 필요한 경우 외부 DAC/ADC 오디오 장치에 마스터 클럭을 공급할 수 있게 합다.
(MCK 출력 설정 시 I2SDIV 및 ODD 값은 MCK 출력 상태에 따라 계산해야 합니다.)

 

3.SPIx_I2SCFGR 레지스터의 I2SMOD 비트를 설정하여 I2S 기능을 활성화합니다. 그리고 아래 비트들을 대상에 맞게 설정합니다.

 

  • I2S 표준 모드 선택: I2SSTD[1:0], PCMSYNC 비트
  • 데이터 길이 선택: DATLEN[1:0]
  • 채널 당 비트 수: CHLEN
  • 마스터/슬레이브 및 송신/수신 방향: SPIx_I2SCFGR 레지스터의 I2SCFG[1:0]

4. 필요하다면 SPIx_CR2 레지스터를 통해 인터럽트 소스 및 DMA 기능도 설정합니다.

 

5. SPIx_I2SCFGR 레지스터에서 I2SE 비트 1로 설정하여 I2S를 활성화해야 합니다.

 

참고로 마스터모드는 WS와 CK가 출력으로 설정되며, MCK도 SPIx_I2SPR의 MCKOE 비트가 설정되어 있으면 출력됩니다.

 

전송 시퀀스(Transmission sequence )

 

전송 시퀀스는 Tx 버퍼에 half-word(16비트)가 쓰여질 때 시작됩니다.

 

예를 들어, TX 버퍼에 기록된 첫 번째 데이터가 Left 채널 데이터라고 가정해보겠습니다. 이 값이 Tx 버퍼에서 시프트 레지스터로 이동하면, TXE 플래그가 설정되고, 오른쪽 채널 데이터에 해당하는 데이터가 TX버퍼에 기록되어야 합니다

 

CHSIDE 플래그는 전송될 채널을 나타내는데 WS가 전환되는 시점을 확인할 수 있습니다. TXE 플래그가 설정되면 CHSIDE 플래그가 업데이트되므로 TXE가 high일 때 CHSIDE 플래그는 현재 어떤 채널로 전송 중인지를 알려줍니다.

 

 

전체 프레임 전송 조건

 

전체 프레임은 왼쪽 채널 데이터 전송 후 오른쪽 채널 데이터 전송으로 간주해야 합니다. 왼쪽 채널만 전송되는 부분 프레임은 있을 수 없습니다. 즉, Left + Right 채널 데이터를 모두 써야 프레임이 완성되기에 Left 채널만 쓴 상태에서는 유효한 전송이 이뤄지지 않습니다.

 

Data half-word는 첫 번째 비트 전송 중에 16비트 시프트 레지스터에 병렬로 로드된 후, 이후 MSB부터 순차적으로 MOSI/SDI 핀을 통해 직렬로 시프트 아웃됩니다.

TX 버퍼에서 시프트 레지스터로 데이터가 전송될 때마다 TXE 플래그가 설정되며, 만약 SPIx_CR2 레지스터의 TXEIE 비트가 설정되어 있다면 인터럽트가 발생합니다.

 

참고로, 연속적인 오디오 데이터 전송을 보장하려면, 현재 데이터의 전송이 끝나기 전에 다음 데이터를 SPIx_DR 레지스터에 미리 써 넣어야 합니다. 이유는 오디오 데이터는 실시간으로 전송되어야하는데, 딜레이나 끊김이 발생하면 바로 잡음 또는 오디오 깨짐이 발생하기 때문입니다.

 

 

그래서 TXE 가 1이 되면서 버퍼가 비엇다는 상태가 나오면 데이터를 바로 써야하며, 이상태에서 데이터를 쓰지 않으면 언더런(underrun, 끊김)이 발생합니다.

 

만약, I2S를 종료하기 위해 I2SE 비트를 클리어하려면, 반드시 TXE가 1이고 BSY가 0이 될 때까지 기다려야 합니다.

 

 

수신 시퀀스(Reception sequence )

 

수신 동작은 기본적으로 전송 시퀀스와 같지만, 맨 앞에서 설명한 Master 모드에서의 설정절차에 있는 3번 항목에서만 차이가 있습니다. 수신 시퀀스의 경우 I2SCFG[1:0] 비트를 수신 모드로 설정해야 합니다.

 

수신의 경우 데이터 길이(DATLEN)나 채널 수(CHLEN)와 관계없이, STM32 I²S 수신부는 내부적으로 SPIx_DR 레지스터를 통해 16비트씩만 읽을 수 있으므로 오디오 데이터는 항상 16비트 단위로 수신됩니다. 즉, 데이터가 24bit든 32bit든, 16bit + 16bit로 나누어 들어옵니다.

 

Rx 버퍼가 16비트로 가득 차면 RXNE 플래그가 설정되고, 만약 SPIx_CR2 레지스터에서 RXNEIE 비트가 활성화되어 있다면 인터럽트가 발생합니다. 앞서 설명했듯 데이터 길이 및 채널 구성에 따라, 하나의 채널(Right 또는 Left)의 오디오 값은 Rx 버퍼로부터 한 번 또는 두 번의 수신 동작을 통해 조합될 수 있습니다.

 

 

데이터 길이 채널 프레임 길이 RX 수신 횟수 설명
16bit 16bit 1회 한 번에 수신됨
16bit 32bit 1회 하위 16bit, 상위는 0으로 패딩됨(상위는 하드웨어단에서 자동 처리)
24bit 32bit 2회 첫 16bit + 다음 8bit (상위 or 하위 정렬)
32bit 32bit 2회 두 번의 수신으로 완전한 채널 데이터 구성

 

 

RXNE 비트는 SPIx_DR 레지스터를 읽을 때 클리어됩니다. 즉, 16비트 Rx 버퍼가 채워지게 되면 RXNE = 1이 되는데, 이상태에서 SPIx_DR 레지스터를 읽는 순간 RXNE 비트는 0으로 클리어 됩니다. 

만약, RXNE가 1인데 읽지 않고 무시한다면 다음 데이터가 덮어씌워져서 overrun(오버런)이 발생 할 수 있습니다.


CHSIDE 플래그는 현재 수신 중인 데이터가 Left 채널인지, Right 채널인지를 알려주는 상태 플래그로써 매 수신마다 갱신되는데, I2S 내부에서 생성된 WS(Word Select) 신호에 반응하여 동작하기 때문입니다. DMA 모드나 인터럽트 기반 수신에서 CHSIDE를 확인하면 이 데이터가 Left인지 Right인지 구분이 가능합니다.

 

I2S를 사용하는 동안, 이전 수신된 데이터를 아직 읽지 않았는데 새로운 데이터가 수신되면 오버런(Overrun) 이 발생하며, OVR 플래그가 설정됩니다. SPIx_CR2 레지스터의 ERRIE 비트가 설정되어 있으면, 해당 오류에 대한 인터럽트가 발생합니다.

 

 

I2S 안전 종료를 위한 조건

 

I2S를 안전하게 종료하려면, 새로운 전송이 시작되지 않도록 전송 주기를 정상적으로 종료해야 합니다.
이때 따라야 할 종료 방식은 아래 세 가지 요소에 따라 달라집니다.

  • 데이터 길이 (DATLEN)
  • 채널 프레임 길이 (CHLEN)
  • 오디오 프로토콜 모드 (I2SSTD)

 

1. LSB 정렬 모드(I2SSTD = 10), 16비트 데이터 길이(DATLEN = 00), 32비트 채널 프레임(CHLEN =1)로 확장되어 있는 경우

a) 마지막에서 두 번째 수신 완료(RXNE = 1)가 감지될 때까지 대기한다.
 - n - 1 번째 RXNE 이벤트까지 기다린다.
b) 그 후, 소프트웨어 루프 등을 사용하여 I2S 클럭 17사이클을 더 기다린다. - 이는 전송이 마무리되고 시프트 레지스터에 남은 패딩 비트가 다 빠져나올 시간을 확보한다.
c) I2S Enable 비트(I2SE)를 0으로 클리어하여 I2S를 비활성화한다.

 

 

2. MSB, I2S, PCM 모드(I2SSTD = 00, 01, 11), 16비트 데이터 길이(DATLEN = 00), 32비트 채널 프레임(CHLEN = 1)으로 확장되어 있는 경우

 

a) 마지막 수신(RXNE = 1)이 감지될 때까지 대기한다. - 이때의 RXNE는 마지막 채널(Left 또는 Right) 수신을 의미하며, 실제 데이터 수신이 끝났다는 신호다.
b) 그 후, I2S 클럭 1사이클을 더 기다린다. - 소프트웨어 루프 등을 사용해 짧은 시간 대기를 수행하며, 시프트 레지스터의 전송이 끝나도록 보장한다.
c) I2S Enable 비트(I2SE)를 0으로 클리어하여 I2S를 비활성화한다.

 

 

3. DATLEN과 CHLEN의 조합이 위의 경우들에 해당하지 않는 모든 나머지 구성일 경우. (선택된 오디오 모드(I2SSTD 값)에 관계없음)

a) 마지막에서 두 번째 수신(RXNE = 1)이 발생할 때까지 대기한다 (n - 1) - 이 시점까지의 수신 데이터는 내부적으로 아직 완전히 전송되지 않았을 수 있으므로 한 번 더 기다린다.
b) 그 후, I2S 클럭 1사이클을 소프트웨어 루프 등을 통해 추가로 기다린다.
 - 마지막 비트가 시프트 레지스터를 완전히 빠져나갈 시간을 확보하는 단계.
c) I2S Enable 비트(I2SE)를 0으로 클리어하여 I2S를 비활성화한다.

 

<참고사항>
BSY(Busy) 플래그는 데이터 전송 중에도 Low 상태로 유지되기 때문에, 이 플래그만 보고 종료 타이밍을 판단하면 안 됩니다.

 


[다음 회차]

 

 

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

[이전 회차] [STM32F7] I2S(integrated interchip sound) 학습하기 (4)[이전 회차] [STM32F7] I2S(integrated interchip sound) 학습하기 (3)[이전 회차] [STM32F7] I2S(integrated interchip sound) 학습하기 (2)[이전 회차] [STM32F7] STM32의

starlighton.com

 

반응형