Embedded/ST Series

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

별빛의온기 2025. 5. 14. 18:19
반응형

 

 

[이전 회차]

 

 

[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

 


 

I2S Status flag

 

애플리케이션이 I2S 버스의 상태를 완전히 모니터링할 수 있도록 다음과 같은 세 가지 상태 플래그가 제공됩니다.

 

Busy flag (BSY)

 

BSY 플래그는 하드웨어에 의해 설정되며 클리어되며, I2S 통신 계층의 상태(전송 중/아님)를 나타냅니다.

이 플래그가 1로 설정되어 있다면 I2S는 현재 바쁘게 통신 중이라는 뜻이며, 이 플래그에 직접 값을 쓰는 동작은 아무런 영향이 없습니다.

 

BSY가 1이라면?

  • BSY가 1이면, I2S는 현재 통신 중(busy) 상태입니다.
  • 단, 예외적으로 마스터 수신 모드 (I2SCFG = 11) 에서는 수신 중에도 BSY 플래그는 Low(0) 로 유지됩니다.

 

BSY의 활용 목적

 

I2S 종료 직전, 통신이 완전히 끝났는지 소프트웨어에서 확인해야 할 때 사용됩니다.

 

만약 BSY가 1인 상태에서 종료하면 마지막 데이터가 유실될 수 있기 때문에, 정상 종료를 위해 아래 조건을 반드시 체크해야 합니다.

 

I2S 종료 전 데이터 손실 방지를 위한 체크 포인트

 

1) BSY가 Set(1) 되는 조건.

  • 전송이 전송이 시작되면 BSY = 1로 설정.
  • 단, 마스터 수신 모드(I2SCFG = 11) 에서는 예외적으로 BSY가 설정되지 않음.

2) BSY가 Clear(0) 되는 조건.

  • 모든 전송이 끝난 경우(단, 마스터 송신 모드에서는 예외. 이 모드는 지속적인 전송을 가정하므로 BSY가 계속 유지됨)
  • 또는 I2S 기능이 비활성화(I2SE = 0) 되었을 때

3) 연속 통신(Continuous Communication) 시 BSY 동작

 

  • 마스터 송신 모드에서는 모든 전송 중 BSY가 High(1) 상태로 유지.
    - 이건 데이터가 끊기지 않고 계속 전송됨을 의미합니다.
  • 슬레이브 모드에서는 전송 사이마다 BSY가 1 I2S 클럭 사이클 동안 Low(0)로 떨어졌다가 다시 올라감.
    - 이건 전송 간 짧은 간격 동안만 idle 상태가 된다는 의미입니다.

 

 

<주의 사항>
각 데이터 전송 또는 수신 동작을 BSY 플래그로 처리하려 하지 말아야합니다.
대신, TXE (전송 버퍼 비었음) 또는 RXNE (수신 버퍼 채워짐) 플래그를 사용하는 것이 훨씬 적절합니다.

 

 

TX buffer empty flag (TXE)

 

이 플래그가 설정되면, 송신 버퍼(Tx buffer)가 비어 있으며, 다음 전송할 데이터를 버퍼에 쓸 수 있음을 나타냅니다.

 

  • TXE flag는 송신 버퍼에 이미 데이터가 있으면 클리어 됩니다.
  • I2S가 비활성화(I2SE=0) 되면 TXE는 클리어됩니다.

Ex) TXE = 1 → 버퍼가 비었음 → 다음 데이터를 SPIx_DR에 써야 함

 

RX buffer not empty (RXNE)

 

이 플래그가 설정되면, 이 플래그는 RX 버퍼에 유효한 수신 데이터가 존재함을 의미합니다.
SPIx_DR 레지스터를 읽으면 RXNE는 자동으로 클리어됩니다.

 

Ex) RXNE = 1 → 수신된 데이터 있음 → 반드시 읽어야 함 (안 읽으면 OVR 발생)

 

Channel Side flag (CHSIDE)

 

CHSIDE Flag는 현재 채널 정보를 가진 플레그입니다.

 

<주의 사항>
PCM 모드(Short/Long 프레임 모두)에서는 CHSIDE 플레그가 의미를 가지지 않습니다.

 

 

SPIx_SR 레지스터에서 OVR 또는 UDR 플래그가 설정되었을 때, SPIx_CR2의 ERRIE 비트가 1이면 인터럽트가 발생합니다. 이 인터럽트 소스가 OVR(Overrun) 인 경우, SPIx_DR을 먼저 읽고 그 다음 SPIx_SR을 읽어야 플래그가 클리어되며, UDR(Underrun) 인 경우는 SPIx_SR만 읽어도 클리어됩니다. (이 경우, DR은 읽을 필요 없음)

 

 

송신 모드 (Transmisstion Mode)

 

CHSIDE 플래그는 TXE가 1(High)이 될 때 갱신 되며, SD로 전송할 데이터가 왼쪽 채널인지 오른쪽 채널인지를 나타냅니다.

 

단, 슬레이브 송신 모드에서 언더런(UDR) 발생 시에는 CHSIDE가 신뢰할 수 없게 되므로, I2S를 재시작해야 합니다. (I2SE = 0 to 1)

 

수신 모드 (Reception Mode)

 

CHSIDE 플래그는 SPIx_DR에 데이터가 수신될 때 갱신되며, 수신된 데이터가 어느 채널(Left or Right)에서 왔는지를 나타냅니다.

 

단, 오류(OVR 등) 발생 시에는 CHSIDE는 의미를 잃고, I2S를 다시 disable 후 enable 해야 플래그가 정상 동작합니다.

 

 

I2S Error flag

 

I²S 주변장치에는 총 세 가지 에러 플래그가 존재합니다.

 

Underrun Flag (UDR, 송신 언더런 오류 )

 

슬레이브 송신 모드에서, 마스터가 클럭을 발생시켰는데도 SPIx_DR에 데이터가 없는 경우, 즉 소프트웨어가 데이터를 준비하지 못했을 때 UDR 플래그가 설정됩니다.

 

  • 이 플래그는 SPIx_I2SCFGR 레지스터에서 I2SMOD 비트가 설정된 상태(=I2S 모드) 에서 유효합니다.
  • SPIx_CR2의 ERRIE 비트가 설정되어 있으면 UDR 발생 시 인터럽트가 생성됩니다.
  • 이 플래그는 SPIx_SR을 읽음으로써 클리어할 수 있습니다.

 

즉, 슬레이브 송신 시 데이터가 준비되지 않은 채로 마스터가 클럭을 주면 UDR이 1이 되는데, 이 상태에서는 데이터 타이밍이 꼬이므로 I2S를 껐다 켜야 복구 가능합니다.

 

Overrun Flag (OVR, 수신 오버런 오류 )

 

수신 데이터가 도착했는데, 이전 데이터를 아직 읽지 않았을 경우, 새 데이터가 덮어쓰여지고 OVR 플래그가 설정됩니다.

 

  • 이 경우, SPIx_DR을 읽으면 이전 데이터(정상 수신된 것) 만 반환되고, 그 이후 데이터는 모두 손실됩니다. 즉, 기존 수신 버퍼의 내용은 그대로 유지되고, 새로 들어온 데이터는 Rx 버퍼에 업데이트되지 않습니다. 이후 SPIx_DR 레지스터를 읽으면, 마지막으로 정상 수신된 이전 데이터가 반환됩니다. 그 이후 전송된 모든 반워드(half-word) 데이터는 손실됩니다.
  • SPIx_CR2의 ERRIE 비트가 설정되어 있으면 OVR 발생 시 인터럽트가 발생합니다. 
  • OVR 플래그를 클리어하려면,  SPIx_DR을 먼저 읽고, 이어서 SPIx_SR을 읽어야 합니다. 반드시 데이터 읽기 (DR) → 상태 확인 (SR) 순서를 따라야 합니다.

 

 

Frame Error Flag (FRE, 프레임 동기화 오류 )

 

이 플래그는 I2S가 슬레이브 모드일 때만 하드웨어에 의해 설정될 수 있습니다.

 

  • 마스터가 WS(Word Select) 신호를 변경했는데, 슬레이브가 그 타이밍을 예측하지 못한 경우 발생합니다.
  • 이는 CK 클럭 라인이나 WS 라인에 노이즈가 유입되어 동기화가 깨지는 경우 흔하게 발생합니다.

 

FRE 복구 방법

 

FRE 발생 후에는 슬레이브 장치와 마스터 장치 간의 재동기화가 필요하므로, 아래 절차를 따라야 합니다.

  1. I²S를 비활성화 (I2SE = 0)
  2. I²S를 다시 활성화 (I2SE = 1)
    단, ASTRTEN = 0 상태를 유지.

 

마스터와 슬레이브 간 동기화 손실은 다음과 같은 이유로 발생할 수 있습니다.

  • 통신 클럭(CK) 라인의 전기적 노이즈.
  • WS 프레임 동기화 라인의 불안정성.

이러한 문제가 발생하면, ERRIE = 1 상태에서 FRE 오류 인터럽트가 발생합니다.

FRE는 상태 레지스터를 읽으면 소프트웨어에 의해 클리어됩니다.

 

 

 


 

 

 

 

 

 

반응형