Tối Sáng
Hình 1. I2S là gì?

Inter-IC sound (I2S) là gì? Hiểu về giao thức truyền âm thanh số Để lại bình luận

Hình 1. I2S là gì?
Hình 1. I2S là gì?

Ngày nay, có nhiều hệ thống âm thanh kỹ thuật số được sử dụng rộng rãi trong thị trường tiêu dùng, bao gồm: đĩa CD (Compact Disc – CD), băng ghi âm kỹ thuật số (Digital Audio Tape – DAT), bộ xử lý âm thanh kỹ thuật số (Digital Sound Processor – DSP), âm thanh kỹ thuật số trên TV (Digital TV-Sound).

Trong những hệ thống này, tín hiệu âm thanh kỹ thuật số được xử lý bởi nhiều loại IC (VLSI/LSI – vi mạch tích hợp quy mô lớn/rất lớn), chẳng hạn như: bộ chuyển đổi A/D và D/A (Analog-to-Digital & Digital-to-Analog Converters), giao tiếp đầu vào/đầu ra kỹ thuật số…

Vì có nhiều loại thiết bị và IC khác nhau, việc có một chuẩn giao tiếp chung là rất quan trọng. Để giải quyết vấn đề này, chuẩn giao tiếp Inter-IC Sound (I²S) đã được phát triển. Đây là một giao thức truyền dữ liệu nối tiếp chuyên dụng cho âm thanh số, giúp các IC và thiết bị âm thanh có thể trao đổi dữ liệu dễ dàng với nhau.

Xem thêm: Tìm hiểu về Universal Serial Bus (USB)

Cấu Trúc của giao thức I2S

Hình 2. Cấu trúc của giao thức I2S
Hình 2. Cấu trúc của giao thức I2S

Giao tiếp I2S sử dụng 4 dây, gồm 2 dây clock và 2 dây dữ liệu để truyền và nhận thông tin giữa vi điều khiển và thiết bị ngoại vi.
🔹I2Sn_CLK (Bit-serial clock – BCLK): Mỗi bit dữ liệu được truyền ứng với một chu kỳ xung nhịp của chân này. Đây là xung nhịp bit, điều khiển tốc độ truyền dữ liệu.
🔹I2Sn_FS (Frame sync – WS – Word clock): Còn gọi là xung đồng bộ khung hoặc word clock. Xác định bắt đầu của một word trong luồng dữ liệu. Trong chế độ stereo, chân này phân biệt dữ liệu của kênh trái (L) và kênh phải (R).
🔹I2Sn_DX (Serial Data Transmit – SD): Chân truyền dữ liệu nối từ thiết bị gửi đến thiết bị nhận.
🔹I2Sn_RX (Serial Data Receive – SD): Chân nhận dữ liệu từ thiết bị gửi.

Hai chân I2Sn_CLK và I2Sn_FS có thể hoạt động 2 chiều tùy vào việc thiết bị được cấu hình là Master (chủ) hay Slave (phụ):
🔹Master: Cung cấp xung nhịp (I2Sn_CLK) và tín hiệu đồng bộ khung (I2Sn_FS).
🔹Slave: Nhận xung nhịp và tín hiệu đồng bộ từ Master.

Tổng quan về cấu trúc dữ liệu trong giao tiếp I2S

Giao thức I2S truyền dữ liệu dưới dạng chuỗi các bit 1 và 0, với cấu trúc phân cấp gồm bit, word và frame.

1. Bit – Đơn vị nhỏ nhất

Mỗi bit là một giá trị 1 hoặc 0.
Bit “1”: Chân dữ liệu (data pin) ở mức cao (logic high) trong suốt 1 chu kỳ xung nhịp bit (bit clock).
Bit “0”: Chân dữ liệu ở mức thấp (logic low) trong suốt 1 chu kỳ xung nhịp bit.

2. Word – Một nhóm các bit

Word (từ dữ liệu) là tập hợp nhiều bit, tạo thành một đơn vị dữ liệu hoàn chỉnh. Độ dài của word có thể thay đổi, do người dùng cài đặt.

3. Frame – Một nhóm các word

Frame (khung dữ liệu) chứa một hoặc nhiều word:
🔹Mono: Chỉ có 1 word trong mỗi frame.
🔹Stereo: Có 2 word trong mỗi frame (dữ liệu kênh trái và phải).

4. Các định dạng truyền dữ liệu I2S

I2S hỗ trợ hai định dạng truyền dữ liệu chính:
🔹I2S/Left-Justified Format: dữ liệu kênh trái và kênh phải được căn chỉnh về phía bên trái trong frame. Định dạng I2S là một trường hợp đặc biệt của Left-Justified Format.
🔹DSP Format: Frame sync signal (tín hiệu đồng bộ khung) đánh dấu ranh giới giữa hai frame bằng một xung ngắn. Ở chế độ I2S, frame sync signal có chu kỳ hoàn toàn bằng 1 xung nhịp, với độ rộng xung 50%.

Xem thêm: Tìm hiểu về Digital-to-Analog Converter (DAC)

Yêu cầu về thời gian của Frame Clock trong chế độ Slave (I2S)

Khi hoạt động ở chế độ Slave, thiết bị nhận tín hiệu frame clock (I2S_FS) từ thiết bị Master. Tuy nhiên, để đảm bảo dữ liệu được đọc chính xác, cần tuân thủ một số yêu cầu về thời gian giữa frame clock (I2S_FS) và bit clock (I2S_CLK).

1. Yêu cầu về xung nhịp Frame Clock (I2S_FS)

🔹Tín hiệu frame clock (I2S_FS) phải được ghi nhận (latched) khi bit clock (I2S_CLK) lên mức cao và khi nó xuống mức thấp, nghĩa là nó phải được giữ ổn định để có thể đọc được ở cả hai thời điểm này.
🔹Vì I2S_CLK do thiết bị Master tạo ra, nên I2S_FS phải đảm bảo đúng thời gian thiết lập (setup time) và giữ (hold time) để tránh lỗi dữ liệu.
🔹Nếu I2S_FS thay đổi quá gần với cạnh xuống (falling edge) của I2S_CLK, có thể gây mất đồng bộ và truyền dữ liệu sai.

Hình 3. Yêu cầu về thời gian của Frame Clock trong chế độ Slave
Hình 3. Yêu cầu về thời gian của Frame Clock trong chế độ Slave

2. Vấn đề độ trễ của Frame Clock

Hình 4. Vấn đề độ trễ của Frame Clock
Hình 4. Vấn đề độ trễ của Frame Clock

🔹Các thiết bị như ADC, DAC và Codec âm thanh thường chỉ quy định độ trễ tối đa (Tdelay) giữa cạnh xuống của I2S_CLK và chuyển tiếp của I2S_FS.
🔹Nếu I2S_FS thay đổi quá gần với cạnh xuống của I2S_CLK, có thể vi phạm yêu cầu giữ (hold requirement), dẫn đến lỗi truyền dữ liệu.

3. Giải pháp khắc phục lỗi đồng bộ

Để tránh lỗi, có thể chèn thêm độ trễ vào tín hiệu I2S_FS bằng mạch RC (điện trở – tụ điện).
Độ trễ này được tính theo công thức:

Công thức tính độ trễ tín hiệu I2S_FS

Khi thêm mạch RC, frame clock sẽ bị trì hoãn một chút, giúp tránh vi phạm thời gian giữ và cải thiện độ ổn định của dữ liệu.

Hình 5. Khắc phục vấn đề đồng bộ sử dụng mạch RC
Hình 5. Khắc phục vấn đề đồng bộ sử dụng mạch RC

Xem thêm: Analog-to-Digital Converter (ADC): Nguyên lý và Ứng dụng

Định dạng I2S/Left-Justified

Đây là một trong những chuẩn truyền dữ liệu âm thanh số trong giao tiếp I2S.
Frame clock (I2S_FS) có chu kỳ 50%:
🔹Nửa đầu chu kỳ dùng để truyền dữ liệu kênh trái (Left Channel).
🔹Nửa sau chu kỳ dùng để truyền dữ liệu kênh phải (Right Channel).
Dữ liệu được truyền từ bit quan trọng nhất (MSB – Most Significant Bit) trước.Dữ liệu được căn trái (left-justified), tức là bit đầu tiên của dữ liệu sẽ thẳng hàng với đầu frame (sau một khoảng trễ bit nhất định).

1. Cách truyền dữ liệu trong I2S (Left-Justified Format)

Hình 6. Truyền dữ liệu theo định dạng Left-Justified
Hình 6. Truyền dữ liệu theo định dạng Left-Justified

I2S_FS ở mức thấp → Bắt đầu truyền dữ liệu kênh trái (L).
I2S_FS ở mức cao → Bắt đầu truyền dữ liệu kênh phải (R).
Dữ liệu được truyền với độ trễ 1 bit so với xung đồng bộ (frame-sync).

2. Cách đồng bộ dữ liệu với Bit Clock (I2S_CLK)

Dựa vào hình 6:
Bên gửi (transmitter) có thể đồng bộ dữ liệu theo cạnh lên hoặc cạnh xuống của I2S_CLK.
Bên nhận (receiver) luôn lấy dữ liệu ở cạnh lên của I2S_CLK.
Bit MSB của kênh trái xuất hiện trên cạnh lên thứ hai của I2S_CLK sau cạnh xuống của I2S_FS.
Bit MSB của kênh phải xuất hiện trên cạnh lên thứ hai của I2S_CLK sau cạnh lên của I2S_FS.

Xem thêm: Controller Area Network (CAN) bus – Hệ Thần Kinh Của Ô Tô Hiện Đại

Định dạng DSP

Định dạng DSP (Digital Signal Processing) là một dạng truyền dữ liệu âm thanh trong giao tiếp I2S, khác với Left-Justified hay Right-Justified.

Hình 7. Truyền dữ liệu ở định dạng DSP
Hình 7. Truyền dữ liệu ở định dạng DSP

1. Cách hoạt động của DSP Format

  • Frame Sync (I2S_FS) có dạng một xung ngắn, không phải dạng xung vuông như trong chuẩn I2S thông thường.
  • Cạnh xuống (trailing edge) của I2S_FS đánh dấu bắt đầu truyền dữ liệu, với kênh trái (L) truyền trước, kênh phải (R) truyền sau.
  • Mỗi bit dữ liệu có giá trị ổn định trên cạnh xuống của Bit Clock (I2S_CLK).

2. Độ trễ dữ liệu (Data Delay) trong DSP Format

Dữ liệu có thể bị trễ 1 hoặc 2 bit sau cạnh xuống của I2S_FS:
🔹Nếu trễ 1 bit → MSB xuất hiện ngay trên cạnh xuống của I2S_FS.
🔹Nếu trễ 2 bit → MSB xuất hiện sau một chu kỳ I2S_CLK kể từ cạnh xuống của I2S_FS.

Truyền dữ liệu và điều khiển trong I2S

Hình 8. Block diagram của I2S
Hình 8. Block diagram của I2S

1. Cách truyền dữ liệu trong I2S

Khi I2S được kích hoạt, dữ liệu được truyền theo thứ tự từ bit quan trọng nhất (MSB-first).
Truyền dữ liệu bắt đầu khi mức tín hiệu phù hợp được phát hiện trên Frame Sync Clock (I2S_FS).
Dữ liệu kênh trái được truyền trước, sau đó đến dữ liệu kênh phải.
Dữ liệu được dịch chuyển tuần tự:
🔹Bên phát: Dữ liệu trong Thanh ghi Shift Truyền (Transmit Shift Register) được dịch ra chân I2Sn_DX.
🔹Bên nhận: Dữ liệu được dịch vào từ chân I2Sn_RX vào Thanh ghi Shift Nhận (Receive Shift Register).
Cạnh xung nào dùng để chốt dữ liệu (cạnh lên hoặc cạnh xuống của I2S_CLK) có thể được cấu hình trong bit CLKPOL.

2. Cơ chế nhận dữ liệu trong I2S

Khi đủ số lượng từ dữ liệu (word) được nhận, dữ liệu sẽ di chuyển từ Receive Shift Register đến Receive Buffer Register, sau đó đến Receive Left/Right Data1/0 registers.
Một ngắt nhận (Receive Interrupt) được tạo ra.
CPU hoặc DMA cần đọc dữ liệu từ Receive Data1/0 registers trước chu kỳ frame-sync tiếp theo. Nếu không đọc kịp, lỗi tràn (OUERROR) sẽ xảy ra.

3. Chế độ Packed Mode

Nếu bật chế độ Packed Mode, ngắt chỉ được tạo ra khi tất cả số lượng dữ liệu cần thiết được truyền/nhận.
Điều này giúp giảm số lần ngắt, hữu ích khi dùng DMA để truyền dữ liệu khối lớn.

Xem thêm: Hiểu về Direct Memory Access (DMA)

Độ trễ trong quá trình truyền dữ liệu I2S

1. Độ trễ trong I2S là gì?

Trong I2S, dữ liệu không được truyền trực tiếp mà được lưu tạm thời trong các bộ đệm (buffered) trước khi truyền/nhận.
Điều này dẫn đến độ trễ (latency) giữa thời điểm ghi dữ liệu vào thanh ghi và thời điểm dữ liệu thực sự xuất hiện trên chân I2S_DX hoặc được nhận từ I2S_RX.

2. Độ trễ ảnh hưởng như thế nào?

Trong ứng dụng truyền âm thanh liên tục (streaming audio), độ trễ này thường không gây ảnh hưởng đáng kể.
Tuy nhiên, khi bật chế độ loopback (LOOPBACK = 1 trong I2SSCTRL), độ trễ này có thể được quan sát thấy.
Loopback Mode: Dữ liệu từ đường truyền được gửi lại ngay trên đường nhận → Có thể thấy rõ độ trễ khi so sánh dữ liệu gửi đi và dữ liệu nhận được.

3. Độ trễ trong đường truyền dữ liệu

Khi I2S được kích hoạt, dữ liệu hợp lệ đầu tiên sẽ xuất hiện trên chân I2Sn_DX sau:
🔹5 xung frame-sync nếu bật Packed Mode (PACK = 1).
🔹3 xung frame-sync nếu không bật Packed Mode (PACK = 0).
Trong khoảng thời gian này, I2S sẽ truyền các giá trị 0 (zero) trên đường truyền.
Các giá trị 0 này cần được bỏ qua hoặc không tính đến trong quá trình xử lý dữ liệu.

4. Độ trễ trong đường nhận dữ liệu

Sau khi I2S được kích hoạt, đường nhận (receive path) sẽ bắt đầu nhận dữ liệu sau:
🔹1 hoặc 2 chu kỳ frame-sync (I2S_FS) đối với dữ liệu có độ dài 8, 18, 20, 24 hoặc 32 bit (tùy cấu hình).
🔹1, 2 hoặc 3 chu kỳ frame-sync (I2S_FS) đối với dữ liệu có độ dài 10, 12, 14 hoặc 16 bit (tùy cấu hình).

5. Độ trễ trong chế độ Loopback nội bộ

a. Loopback nội bộ là gì?

Loopback nội bộ là chế độ giúp kiểm tra chương trình xử lý ngắt/sự kiện I2S mà không cần đấu dây bên ngoài.
Trong chế độ này, dữ liệu từ Transmit Shift Register được gửi trực tiếp đến Receive Shift Register mà không đi qua các chân I2Sn_DX và I2Sn_RX.
Điều này dẫn đến độ trễ dữ liệu khác so với loopback ngoài.

b. Độ trễ của dữ liệu trong Loopback

Nếu bật Packed Mode:
🔹Dữ liệu 8-bit và FSDIV = 000 trong I2SSRATE → Bỏ qua 6 mẫu đầu tiên.
🔹Dữ liệu 8-bit và FSDIV > 000 trong I2SSRATE → Bỏ qua 5 mẫu đầu tiên.
🔹Dữ liệu 10-, 12-, 14- hoặc 16-bit → Bỏ qua 6 mẫu đầu tiên.
Nếu tắt Packed Mode:
🔹Bỏ qua 2 mẫu đầu tiên.

Xem thêm: Quad Serial Peripheral Interface (Quad-SPI) là gì?

Data Packing và Sign Extension

1. Data Pack Mode

a. Định nghĩa
  • Data Pack Mode cho phép gói (pack) nhiều mẫu dữ liệu nhỏ hơn vào cùng một thanh ghi 32-bit.
  • Áp dụng khi độ dài từ (word-length) là 8, 10, 12, 14 hoặc 16 bit.
  • Mục đích:
    • Tiết kiệm bộ nhớ khi sử dụng DMA để truyền dữ liệu.
    • Giảm số lần ngắt I2S, giúp giảm tải cho CPU.
b. Cách hoạt động

Ở chế độ nhận (Receive Mode):
🔹Dữ liệu được gói liên tiếp vào các thanh ghi I2Sn Receive Left/Right Data n Registers.
🔹Dữ liệu của kênh trái (Left) được lưu trước trong Data 1 Register.
🔹Dữ liệu của kênh phải (Right) được lưu tiếp vào Data 0 Register.
🔹Chỉ tạo ngắt hoặc sự kiện sau khi đã có đủ mẫu dữ liệu.

Ở chế độ truyền (Transmit Mode): Dữ liệu cần được chuẩn bị theo đúng định dạng gói (packed) trong I2Sn Transmit Left/Right Data n Registers.

c. Lợi ích của Pack Mode

Hiệu quả hơn khi dùng DMA: DMA truyền dữ liệu theo từng double-word (32-bit), giúp tận dụng tối đa băng thông bộ nhớ.
Giảm số lần ngắt I2S: Nếu dùng Pack Mode, cứ sau 2 hoặc 4 mẫu mới tạo một ngắt, giúp CPU giảm tải đáng kể.
Tiết kiệm bộ nhớ: Bộ nhớ đệm (buffer) giảm 2 lần cho dữ liệu 10-16 bit, hoặc 4 lần cho dữ liệu 8-bit.

2. Chế độ Sign Extend Mode

a. Định nghĩa

Mục đích: Giúp mở rộng dữ liệu có dấu (sign-extended) để phù hợp với các thuật toán xử lý tín hiệu số (S16, S32).
Dữ liệu có dấu được mở rộng (sign-extended) và căn phải (right-justified) trong thanh ghi 16-bit hoặc 32-bit.

b. Cách hoạt động

Dữ liệu có độ dài nhỏ hơn 16-bit (8-, 10-, 12-, 14-bit) → Mở rộng thành 16-bit.
Dữ liệu có độ dài nhỏ hơn 32-bit (18-, 20-, 24-bit) → Mở rộng thành 32-bit.
Không hỗ trợ mở rộng 8-bit trong Pack Mode (vì 4 mẫu dữ liệu được gói trong 32-bit).
🔹Nếu bit MSB của dữ liệu gốc là 0 → Điền thêm các bit 0 vào đầu để mở rộng.
🔹Nếu bit MSB của dữ liệu gốc là 1 → Điền thêm các bit 1 vào đầu để mở rộng.

c. Lợi ích của Sign Extend Mode

Dễ dàng sử dụng với các thuật toán DSP (vì nhiều bộ xử lý hỗ trợ S16/S32).
Đảm bảo dữ liệu đúng giá trị khi lưu vào thanh ghi I2S.
Tăng độ tương thích khi chuyển dữ liệu giữa các thiết bị.

Ứng dụng thực tế của I2S

1. Các thiết bị sử dụng I2S

Bộ chuyển đổi tín hiệu số – tương tự (DAC – Digital to Analog Converter).
Bộ chuyển đổi tín hiệu tương tự – số (ADC – Analog to Digital Converter).
Codec âm thanh (Audio Codec).
Micro kỹ thuật số MEMS (Micro-Electro-Mechanical Systems).
Bộ xử lý tín hiệu số (DSP – Digital Signal Processor).

2. Ứng dụng trong các hệ thống âm thanh

Điện thoại thông minh và máy tính bảng.
TV, soundbar, hệ thống âm thanh gia đình.
Thiết bị thu phát âm thanh Bluetooth.
Hệ thống nhận dạng giọng nói và trí tuệ nhân tạo.
Máy nghe nhạc Hi-Fi và hệ thống âm thanh chuyên nghiệp.

Giao thức I2S đóng vai trò quan trọng trong việc truyền tải âm thanh số giữa các vi mạch và thiết bị điện tử, đảm bảo dữ liệu được truyền chính xác và đồng bộ. Với cấu trúc đơn giản nhưng hiệu quả, I2S được sử dụng rộng rãi trong các ứng dụng âm thanh như DAC, ADC, bộ xử lý tín hiệu số và nhiều hệ thống nhúng. Việc hiểu rõ về I2S giúp bạn tối ưu hóa hiệu suất truyền dữ liệu, giảm thiểu lỗi đồng bộ và tận dụng tối đa tiềm năng của giao tiếp âm thanh số trong các thiết kế nhúng hiện đại.

Xem thêm: Giao thức truyền thông Local Interconnect Network (LIN)

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *