I2S 프로토콜 : 작동, 차이점 및 응용

문제를 제거하기 위해 도구를 사용해보십시오





모바일 핸드셋, 컴퓨터 및 홈 오토메이션 제품은 일정 기간 동안 극적으로 변경되었습니다. 프로세서에서 또는 프로세서로 보내는 오디오 신호가 디지털화되고 있습니다. 다른 시스템의 이 데이터는 다음과 같은 많은 장치를 통해 처리됩니다. DSP , ADC, DAC, 디지털 I/O 인터페이스 등. 이러한 장치가 서로 오디오 데이터를 통신하려면 표준 프로토콜이 필요합니다. 그 중 하나가 I2S 프로토콜입니다. 1986년 2월 Philip Semiconductor가 장치 간의 디지털 오디오 인터페이스를 위해 설계한 직렬 버스 인터페이스입니다. 이 기사에서는 I에 대한 개요를 설명합니다. 2S 프로토콜 응용 프로그램 작업.


I2S 프로토콜이란 무엇입니까?

한 장치에서 다른 장치로 디지털 오디오 데이터를 전송하는 데 사용되는 프로토콜을 I2S 또는 Inter-IC Sound 프로토콜이라고 합니다. 이 프로토콜은 전자 장치 내의 한 IC에서 다른 IC로 PCM(펄스 코드 변조) 오디오 데이터를 전송합니다. I2S는 미리 녹음된 오디오 파일을 MCU에서 DAC 또는 앰프로 전송하는 데 핵심적인 역할을 합니다. 이 프로토콜은 마이크를 사용하여 오디오를 디지털화하는 데에도 사용할 수 있습니다. I2S 프로토콜 내에는 압축이 없으므로 OGG 또는 MP3 또는 오디오를 압축하는 기타 오디오 형식을 재생할 수 없지만 WAV 파일은 재생할 수 있습니다.



특징

그만큼 I2S 프로토콜 기능 다음을 포함합니다.

  • 각 샘플에 대해 8~32개의 데이터 비트가 있습니다.
  • Tx & Rx FIFO 인터럽트.
  • DMA를 지원합니다.
  • 16비트, 32비트, 48비트 또는 64비트 워드 선택 기간.
  • 동시 양방향 오디오 스트리밍.
  • 8비트, 16비트 및 24비트 샘플 너비.
  • 샘플 레이트가 다릅니다.
  • 데이터 속도는 64비트 워드 선택 기간 동안 최대 96kHz입니다.
  • 인터리브 스테레오 FIFO 또는 독립적인 좌우 채널 FIFO
  • Tx 및 Rx의 독립적인 활성화.

I2S 통신 프로토콜 작동

I2S 통신 프로토콜 SCK(Continuous Serial Clock), WS(Word Select) 및 SD(Serial Data)를 포함하는 3라인 직렬 버스를 통해 오디오 데이터를 간단히 처리하는 3와이어 프로토콜입니다.

I2S의 3선 연결:

SCK

SCK 또는 직렬 클록은 BCLK 또는 유사한 주기의 데이터를 얻는 데 사용되는 비트 클록 라인이라고도 하는 I2S 프로토콜의 첫 번째 라인입니다. 직렬 클럭 주파수는 Frequency = Sample Rate x Bits for each channel x no.와 같은 공식을 사용하여 간단히 정의됩니다. 채널의.

WS

I2S 통신 프로토콜에서 WS 또는 워드 선택은 오른쪽 또는 왼쪽 채널을 구분하는 FS(프레임 선택) 와이어라고도 하는 라인입니다.

WS = 0이면 왼쪽 채널 또는 채널 1이 사용됩니다.

WS = 1이면 오른쪽 채널 또는 채널 2가 사용됩니다.

SD

직렬 데이터 또는 SD는 페이로드가 2개의 보수 내에서 전송되는 마지막 회선입니다. 따라서 송신기와 수신기 모두 다른 단어 길이를 포함할 수 있으므로 MSB가 먼저 전송되는 것이 매우 중요합니다. 따라서 송신기 또는 수신기는 전송되는 비트 수를 인식해야 합니다.

  • 수신기의 워드 길이가 송신기보다 길면 워드가 단축됩니다(LSB 비트는 0으로 설정됨).
  • 수신기의 워드 길이가 송신기의 워드 길이보다 작은 경우 LSB 비트는 무시됩니다.

그만큼 송신기 다음 중 하나에 데이터를 보낼 수 있습니다. 클럭 펄스의 리딩 에지 ​​또는 트레일링 에지 . 해당 항목에서 구성할 수 있습니다. 제어 레지스터 . 하지만 수신기는 직렬 데이터를 래치하고 클록 펄스의 선두 에지에서만 WS를 래치합니다. . 송신기는 WS가 변경된 후 한 클럭 펄스 후에만 데이터를 전송합니다. 수신기는 직렬 데이터의 동기화를 위해 WS 신호를 사용합니다.

I2S 네트워크 구성 요소

여러 I2S 구성 요소가 서로 연결된 경우 이를 I2S 네트워크라고 합니다. 이 네트워크의 구성 요소에는 다른 이름과 다른 기능이 포함됩니다. 따라서 다음 다이어그램은 3개의 다른 네트워크를 보여줍니다. 여기에서 ESP NodeMCU 보드는 송신기로 사용되고 I2S 오디오 브레이크아웃 보드는 수신기로 사용됩니다. 송신기와 수신기를 연결하는 데 사용되는 세 개의 전선은 SCK, WS 및 SD입니다.

  I2S 네트워크 구성 요소
I2S 네트워크 구성 요소

첫 번째 다이어그램에서 송신기(Tx)는 마스터이므로 SCK(직렬 클럭) 및 WS(워드 선택) 라인을 제어합니다.

두 번째 다이어그램에서 수신자는 마스터입니다. 따라서 SCK 및 WS 라인은 모두 수신기에서 시작하고 송신기에서 끝납니다.

세 번째 다이어그램에서 외부 컨트롤러는 마스터 장치처럼 작동하는 네트워크 내의 노드에 연결됩니다. 따라서 이 장치는 SCK 및 WS를 생성합니다.

위의 모든 I2S 네트워크에는 하나의 마스터 장치만 사용할 수 있으며 사운드 데이터를 전송하거나 수신하는 다른 많은 구성 요소가 있습니다.

I2S에서는 클럭 신호를 제공하여 모든 장치가 마스터가 될 수 있습니다.

I2S 타이밍 다이어그램

I2S 및 그 기능에 대한 더 나은 이해를 위해 아래에 표시된 I2S 통신 프로토콜 타이밍 다이어그램이 있습니다. I2S 프로토콜의 타이밍 다이어그램은 3개의 와이어 SCK, WS 및 SD를 포함하는 아래에 나와 있습니다.

  I2S 프로토콜 타이밍 다이어그램
I2S 프로토콜 타이밍 다이어그램

위의 다이어그램에서 먼저 직렬 클록은 주파수 = 샘플 속도 * 각 채널의 비트 수 * 번호가 있습니다. 채널). 단어 선택 라인은 오른쪽 채널의 경우 '1'과 왼쪽 채널의 경우 '0' 사이에서 변경되는 두 번째 라인입니다.

세 번째 라인은 데이터가 HIGH에서 LOW로 점으로 표시된 하강 에지에서 각 클록 사이클마다 전송되는 직렬 데이터 라인입니다.

또한 WS 라인은 MSB가 전송되기 전에 한 CLK 주기를 변경하여 수신기에 이전 단어를 저장하고 다음 단어에 대한 입력 레지스터를 지울 수 있는 시간을 제공한다는 것을 알 수 있습니다. MSB는 WS가 변경된 후 SCK가 변경될 때 전송됩니다.

송신기와 수신기 간에 데이터가 전송될 때마다 전파 지연이 발생합니다.

전파 지연 = (외부 클럭과 수신기의 내부 클럭 사이의 시간 차이) +( 데이터가 수신될 때까지 내부 클럭 사이의 시간 차이).

전파 지연을 최소화하고 송신기와 수신기 사이의 데이터 전송 동기화를 위해 송신기는 다음의 클록 주기를 가져야 합니다.

T > tr  - T는 송신기의 클록 주기이고 tr은 송신기의 최소 클록 주기라고 가정합니다.

위의 조건에서 예를 들어 고려하면 데이터 전송 속도가 2.5MHz인 송신기는 다음을 수행합니다.

tr = 360ns

클록 높음 tHC(최소) >0.35 T.

클록 낮은 tLC(최소> > 0.35T.

데이터 전송 속도가 2.5MHz인 슬레이브로 수신기는 다음을 수행합니다.

클록 높은 tHC(최소) < 0.35 T

클록 낮은 tLC(최소) < 0.35T.

설정 시간 tst(최소) < 0.20T.

I2S 프로토콜 아두이노

이 프로젝트의 주요 목표는 Arduino I2S 라이브러리를 사용하여 I2S 테레민 인터페이스를 만드는 것입니다. 이 프로젝트를 만드는 데 필요한 구성 요소는 다음과 같습니다. 아두이노 MKR 제로, 브레드보드 , 점퍼 와이어, Adafruit MAX98357A, 3W, 4옴 스피커 및 RobotGeek 슬라이더.

Arduino I2S 라이브러리를 사용하면 I2S 버스를 통해 디지털 오디오 데이터를 송수신할 수 있습니다. 따라서 이 예제는 Arduino 설계에서 계산된 사운드를 재생하기 위해 이 라이브러리를 활용하여 I2S DAC를 구동하는 방법을 설명하는 것을 목표로 합니다.

이 회로는 다음과 같이 연결할 수 있습니다. 이 예에서 사용된 I2S DAC에는 I2S 버스용 전원 공급 장치와 함께 3개의 와이어만 있으면 됩니다. Arduino MKRZero의 I2S 연결은 다음과 같습니다.

핀 A6의 직렬 데이터(SD);

핀 2의 직렬 클록(SCK);

pin3의 프레임 또는 워드 선택(FS);

일하고 있는

기본적으로 테레민에는 피치와 볼륨 두 가지 컨트롤이 있습니다. 따라서 이 두 매개변수는 두 개의 슬라이드 전위차계를 이동하여 수정되지만 읽을 수 있도록 조정할 수도 있습니다. 두 개의 전위차계는 전압 분배기 형태로 연결되어 있으므로 이 전위차계를 움직이면 0에서 1023 사이의 값을 얻을 수 있습니다. 그 후 이 값은 최대 및 최소 주파수와 최소 및 최대 볼륨 사이에 매핑됩니다.

  I2S 테르민 다이어그램
I2S 테르민 다이어그램

I2S 버스에서 전송되는 사운드는 전위차계의 판독값에 따라 진폭과 주파수가 수정되는 단순한 사인파입니다.

암호

Theremin을 Arduino MKRZero, 2-슬라이더 전위차계 및 I2S DAC와 인터페이스하는 코드는 아래에 나와 있습니다.

#include

상수 정수 maxFrequency = 5000; //최대 생성 주파수
상수 정수 minFrequency = 220; //최소 생성 빈도
상수 정수 최대 볼륨 = 100; //생성된 주파수의 최대 볼륨
상수 정수 minVolume = 0; //생성된 주파수의 최소 볼륨
상수 정수 샘플 속도 = 44100; //생성된 주파수의 샘플레이트
상수 정수 wavSize = 256; //버퍼 크기
짧은 사인[wavSize]; // 사인 값이 저장되는 버퍼
const 정수 주파수 핀 = A0; // 신호의 주파수를 결정하는 포트에 연결된 핀
const 정수 진폭 핀 = A1; // 신호의 진폭을 결정하는 포트에 연결된 핀
const int 버튼 = 6; // 주파수를 표시하기 위해 버튼 컨트롤에 연결된 핀

무효 설정()
{

Serial.begin(9600); //시리얼 포트 설정
// I2S 송신기를 초기화합니다.
if (!I2S.begin(I2S_PHILIPS_MODE, sampleRate, 16)) {
Serial.println('I2S 초기화 실패!');

동안 (1);
}

사인 생성(); // 사인 값으로 버퍼 채우기
핀모드(버튼, INPUT_PULLUP); //버튼 핀을 입력 풀업에 넣습니다.

}
무효 루프() {

if (digitalRead(버튼) == 낮음)

{

부동 주파수 = map(analogRead(frequencyPin), 0, 1023, minFrequency, maxFrequency); //맵 빈도
정수 진폭 = map(analogRead(amplitudePin), 0, 1023, minVolume, maxVolume); //맵 진폭
playWave(주파수, 0.1, 진폭); //소리 재생
//시리얼에 값 출력
Serial.print('주파수 = ');
Serial.println(주파수);
Serial.print('진폭 = ');
Serial.println(진폭);

}

}
무효 생성 사인() {
for (int i = 0; i < wavSize; ++i) {
사인[i] = ushort(float(100) * sin(2.0 * PI * (1.0 / wavSize) * i)); //100은 작은 수를 가지지 않는 데 사용됩니다.
}
}
무효 playWave(부동 주파수, 부동 초, 정수 진폭) {
// 지정된 파형 버퍼를 재생합니다.
// 초의 양.
// 먼저 실행하기 위해 재생해야 하는 샘플 수를 계산합니다.
// 원하는 시간(초) 동안.

unsigned int 반복 = 초 * sampleRate;

// 그런 다음 파동을 통해 이동하는 '속도'를 계산합니다.
// 재생 중인 톤의 주파수를 기반으로 버퍼.

float 델타 = (주파수 * wavSize) / float(sampleRate);

// 이제 모든 샘플을 반복하고 재생하여
// 시간의 각 순간에 대한 웨이브 버퍼 내의 위치.

for (unsigned int i = 0; i < 반복; ++i) {
short pos = (unsigned int)(i * delta) % wavSize;
짧은 샘플 = 진폭 * 사인[pos];

// 샘플을 복제하여 왼쪽 채널과 오른쪽 채널 모두에 전송합니다.
// 순서는 오른쪽 채널, 쓰기를 원하면 왼쪽 채널인 것 같습니다.
// 스테레오 사운드.

동안 (I2S.availableForWrite() < 2);
I2S.write(샘플);
I2S.write(샘플);

}
}

I2C와 I2S 프로토콜의 차이점

I2C와 I2S 프로토콜의 차이점은 다음과 같습니다.

2C

I2S

그만큼 I2C 프로토콜 IC 간 버스 프로토콜을 나타냅니다. I2S는 Inter-IC Sound 프로토콜의 약자입니다. .
주로 유사한 PCB에 배치된 집적 회로 사이에서 신호를 실행하는 데 사용됩니다. 디지털 오디오 장치를 연결하는 데 사용됩니다.
SDA 및 SCL과 같은 여러 마스터 및 슬레이브 사이에 두 개의 라인을 사용합니다. . WS, SCK 및 SD의 세 가지 라인을 사용합니다.
멀티 마스터 및 멀티 슬레이브를 지원합니다. 단일 마스터를 지원합니다.
이 프로토콜은 CLK 스트레칭을 지원합니다. 이 프로토콜에는 CLK 스트레칭이 없습니다.
I2C에는 추가 오버헤드 시작 및 중지 비트가 포함됩니다. I2S는 시작 및 정지 비트를 포함하지 않습니다.

장점

그만큼 I2S 버스의 장점 다음을 포함합니다.

  • I2S는 별도의 CLK 및 직렬 데이터 라인을 사용합니다. 따라서 비동기식 시스템에 비해 수신기 설계가 매우 간단합니다.
  • 단일 마스터 장치이므로 데이터 동기화에 문제가 없습니다.
  • I2S o/p 기반의 마이크는 아날로그 프론트 엔드가 필요하지 않고, 디지털 송신기를 이용하여 무선 마이크 내부에서 활용됩니다. 이를 사용하여 트랜스미터와 트랜스듀서 사이에 완전한 디지털 연결을 할 수 있습니다.

단점

그만큼 I2S 버스의 단점 다음을 포함합니다.

  • I2S는 케이블을 통한 데이터 전송을 위해 제안되지 않습니다.
  • I2S는 상위 수준 응용 프로그램 내에서 지원되지 않습니다.
  • 이 프로토콜은 높은 비트 전송률 및 샘플링 주파수에서 감지되는 3개의 신호 라인 간의 동기화 문제가 있습니다. 따라서 이 문제는 주로 클럭 라인과 데이터 라인 사이의 전파 지연 변화로 인해 발생합니다.
  • I2S에는 오류 감지 메커니즘이 포함되어 있지 않으므로 데이터 디코딩 시 오류가 발생할 수 있습니다.
  • 주로 유사한 PCB에서 IC 간 통신에 활용됩니다.
  • I2S에는 일반적인 커넥터 및 상호 연결 케이블이 없으므로 다른 설계자가 다른 커넥터를 사용합니다.

애플리케이션

그만큼 I2S 프로토콜의 응용 다음을 포함합니다.

  • I2S는 디지털 오디오 장치를 연결하는 데 사용됩니다.
  • 이 프로토콜은 DSP 또는 마이크로컨트롤러에서 오디오 코덱으로 오디오 데이터를 전송하여 오디오를 재생하는 데 광범위하게 활용됩니다.
  • 초기에 I2S 인터페이스는 CD 플레이어 디자인 내에서 활용됩니다. 이제 IC 간에 디지털 오디오 데이터가 전송되는 위치를 찾을 수 있습니다.
  • I2S는 DSP, 오디오 ADC, DAC, 마이크로컨트롤러, 샘플 레이트 컨버터 등에 사용됩니다.
  • I2S는 특히 디지털 오디오 데이터 통신을 위한 집적 회로 사이에서 사용하도록 설계되었습니다.
  • 이 프로토콜은 I2S가 디지털 오디오 기기 간의 오디오 데이터 전송에 중점을 둘 때 마이크로 컨트롤러와 주변 기기를 연결하는 데 중요한 역할을 합니다.

따라서 이것은 전체 개요에 관한 것입니다. I2S 프로토콜 사양 여기에는 작업, 차이점 및 응용 프로그램이 포함됩니다. I²S는 3선 동기 직렬 프로토콜입니다. 두 개의 집적 회로 간에 디지털 스테레오 오디오를 전송하는 데 사용됩니다. 그만큼 I2S 프로토콜 분석기 모든 DigiView 로직 분석기를 포함하는 신호 디코더입니다. 이 DigiView 소프트웨어는 모든 유형의 신호에 광범위한 검색, 탐색, 내보내기, 측정, 플롯 및 인쇄 기능을 제공합니다. I3C 프로토콜이란 무엇입니까?