[이전 회차]
[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 발생 후에는 슬레이브 장치와 마스터 장치 간의 재동기화가 필요하므로, 아래 절차를 따라야 합니다.
- I²S를 비활성화 (I2SE = 0)
- I²S를 다시 활성화 (I2SE = 1)
단, ASTRTEN = 0 상태를 유지.
마스터와 슬레이브 간 동기화 손실은 다음과 같은 이유로 발생할 수 있습니다.
- 통신 클럭(CK) 라인의 전기적 노이즈.
- WS 프레임 동기화 라인의 불안정성.
이러한 문제가 발생하면, ERRIE = 1 상태에서 FRE 오류 인터럽트가 발생합니다.
FRE는 상태 레지스터를 읽으면 소프트웨어에 의해 클리어됩니다.
'Embedded > ST Series' 카테고리의 다른 글
[STM32F7] SAI(Serial audio interface) 학습하기 (2) (0) | 2025.05.17 |
---|---|
[STM32F7] SAI(Serial audio interface) 학습하기 (1) (1) | 2025.05.16 |
[STM32F7] I2S(integrated interchip sound) 학습하기 (5) (0) | 2025.05.14 |
[STM32F7] I2S(integrated interchip sound) 학습하기 (4) (0) | 2025.05.14 |
[STM32F7] I2S(integrated interchip sound) 학습하기 (3) (0) | 2025.05.13 |