Embedded/ST Series

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

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

 

 

 

[이전 회차]

 

 

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

[이전 회차] [STM32F7] I2S(integrated interchip sound) 학습하기 (3)[이전 회차] [STM32F7] I2S(integrated interchip sound) 학습하기 (2)[이전 회차] [STM32F7] STM32의 I2S(integrated interchip sound) 학습하기 (1)들어가기 앞서 이

starlighton.com

 

 


 

I2S Slave Mode

 

슬레이브 구성에서는, I2S를 송신 모드 또는 수신 모드로 설정할 수 있습니다.
슬레이브 모드의 동작 방식은 기본적으로 I2S 마스터 모드와 동일한 규칙을 따릅니다.

 

슬레이브 모드에서는 I2S 인터페이스가 클럭(CK) 을 직접 생성하지 않으며, 클럭(CK) 및 WS(Word Select) 신호는 외부 마스터 장치로부터 입력받습니다. 따라서 사용자가 클럭을 설정할 필요는 없습니다.

 

설정 절차(Procedure)

 

1. SPIx_I2SCFGR 레지스터에서 I2SMOD 비트를 설정하여 I2S 모드를 선택하고,

  • I2S 표준 방식(I2SSTD[1:0]),
  • 데이터 길이(DATLEN[1:0]),
  • 프레임당 채널 비트 수(CHLEN)
  • 송수신 방향(I2SCFG[1:0])

을 선택합니다.

 

2. 필요 시 SPIx_CR2 레지스터에서 인터럽트 소스 및 DMA 설정을 구성합니다.

 

 

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

 

전송 시퀀스(Transmission sequence )

 

전송 시퀀스는 외부 마스터가 클럭을 제공하고, NSS_WS 신호가 데이터 전송을 요청하는 시점에 시작됩니다.

 

 

외부 마스터가 통신을 시작하기 전에, 슬레이브는 미리 활성화되어 있어야 합니다.


또한, 마스터가 통신을 개시하기 전, 슬레이브의 I2S 데이터 레지스터(SPIx_DR)는 전송할 데이터로 미리 채워져 있어야 합니다.

 

 

 

전송 동작 원리

 

MSB 또는 LSB 정렬 모드에 관계없이, 첫 번째로 기록되는 데이터는 왼쪽 채널(Left channel) 에 해당합니다.

 

통신이 시작되면, 데이터는 Tx 버퍼 → 시프트 레지스터로 전달되고, 이후 TXE 플래그가 set 되어 오른쪽 채널 데이터를 쓰도록 요청합니다.

 

CHSIDE 플래그 동작

 

CHSIDE 플래그는 현재 전송할 채널(Left 또는 Right)을 나타냅니다.

 

마스터 모드와 달리, 슬레이브 모드에서는 CHSIDE가 외부 마스터의 WS 신호에 따라 변경됩니다.

 

즉, 마스터가 클럭(CK)을 생성하기 전에, 슬레이브가 첫 번째 데이터 전송 준비를 마쳐야 합니다. WS 신호가 assert되면 Left 채널부터 전송을 시작한다는 것을 의미합니다.

 

<참고>
마스터가 CK 클럭을 발생시키기 최소 2개의 PCLK 클럭 주기 이전에, 슬레이브의 I²S 기능은 I2SE = 1로 활성화 되어 있어야 합니다.

 

 

데이터 하프워드(16비트)의 첫 비트 전송이 시작되면, 내부 버스로부터 시프트 레지스터에 병렬로 로드되고, 이후 MSB부터 SD 라인으을 통해 직렬 전송됩니다.

TX 버퍼에서 시프트 레지스터로 전송이 완료될 때마다, TXE 플래그가 설정되고, 만약 SPIx_CR2의 TXEIE 비트가 설정되어 있으면 인터럽트가 발생합니다. TXE 플래그가 1로 설정된 후에만, TX 버퍼에 데이터를 기록해야 합니다.

 

연속적인 오디오 데이터 전송을 보장하려면, 현재 전송이 끝나기 전에 다음 전송할 데이터를 SPIx_DR 레지스터에 미리 써야 합니다. 다음 데이터 전송이 시작되기 전에 SPIx_DR에 데이터가 기록되지 않으면, 언더런 플래그(UDR)가 설정되며, 필요시 인터럽트가 발생할 수 있습니다.

이는 전송된 데이터가 잘못되었음을 소프트웨어에 알리는 신호가 됩니다. 만약 SPIx_CR2 레지스터의 ERRIE 비트가 설정되어 있다면, SPIx_SR의 UDR 플래그가 1로 설정될 때 에러 인터럽트가 발생합니다.

이 경우, 반드시 I2S를 비활성화한 뒤, Left 채널부터 다시 전송을 시작해야 합니다.

 

전송 모드 종료 방법

 

I2S를 비활성화하려면, I2SE 비트를 클리어하기 전에 TXE = 1 및 BSY = 0 상태를 반드시 확인해야 합니다.

 

 

수신 시퀀스(Reception sequence )

 

수신 모드의 동작 방식은 송신 모드와 거의 동일하지만, 설정 시 SPIx_I2SCFGR 레지스터의 I2SCFG[1:0] 비트를 수신 모드로 설정해야 합니다.

 

수신 동작 원리

 

데이터 길이(DATLEN) 또는 채널 길이(CHLEN)에 상관없이, 오디오 데이터는 항상 16비트 단위로 수신됩니다.

 

즉, Rx 버퍼가 가득 찰 때마다 RXNE 플래그가 설정되고, SPIx_CR2의 RXNEIE 비트가 설정되어 있다면 인터럽트도 발생합니다.

 

수신된 데이터는 구성에 따라, 한번 또는 두번에 걸쳐 Left/Right 채널의 데이터를 수신할 수도 있습니다.

 

CHSIDE 플래그 동작

 

CHSIDE 플래그는 수신된 데이터를 SPIx_DR에서 읽을 때마다 갱신되며, 이 플래그는 외부 마스터가 제공하는 WS (Word Select) 신호에 따라 동작합니다.

 

RXNE 클리어 방법

 

RXNE 플래그를 클리어하려면, SPIx_DR 레지스터를 읽으면 됩니다. (SPIx_SR 레지스터의 RXNE는 자동으로 0으로 리셋)

 

수신 모드 종료 방법

 

수신 모드에서 I²S를 종료하려면, 마지막 RXNE = 1 상태가 발생한 직후에 I2SE 비트를 클리어해야 합니다.
(즉, 마지막 데이터가 수신되었음을 확인한 뒤에 I2S 비활성화)

 

오버런(OVR) 

 

이전 데이터가 읽히기 전에 새로운 데이터가 수신되면, OVR(오버런) 플래그가 설정되며, 오류를 알리기 위해 인터럽트가 발생할 수 있습니다. 이때 SPIx_CR2의 ERRIE 비트가 설정되어 있다면 OVR 에러 인터럽트가 발생합니다.

 

<참고>
외부 마스터 구성 요소는 오디오 채널을 통해 16비트 또는 32비트 패킷으로 데이터를 송수신할 수 있어야 합니다.

 

 

 


[다음 회차]

 

 

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

[이전 회차] [STM32F7] I2S(integrated interchip sound) 학습하기 (5)[이전 회차] [STM32F7] I2S(integrated interchip sound) 학습하기 (4)[이전 회차] [STM32F7] I2S(integrated interchip sound) 학습하기 (3)[이전 회차] [STM32F7] I2S(inte

starlighton.com

 

 

 

 

 

반응형