Âm thanh & Loa DIY

PCM5102A với ESP32-S3 qua I2S: hướng dẫn kết nối và kiểm tra từng bước

Cimo 7 phút đọc

Hướng dẫn ghép ESP32-S3 với module PCM5102A qua I2S: bảng đấu dây, công thức tính BCK, đoạn code cấu hình ESP-IDF kèm trạng thái kiểm thử và quy trình kiểm tra từng bước sau khi nạp.

PCM5102A với ESP32-S3 qua I2S: hướng dẫn kết nối và kiểm tra từng bước
Mục lục
  1. Kiến trúc luồng tín hiệu
  2. Bảng đấu dây
  3. Tính tần số BCK để kiểm chứng
  4. Code cấu hình I2S theo ESP-IDF
  5. Kiểm tra từng bước sau khi nạp code
  6. Lỗi thường gặp khi ghép ESP32-S3 với PCM5102A
  7. Câu hỏi thường gặp
  8. ESP32-S3 có cần cấp MCLK cho PCM5102A không?
  9. Tôi dùng Arduino IDE thì code có khác không?
  10. Phát nhạc 44,1 kHz và 48 kHz lẫn nhau có cần đổi cấu hình không?
  11. Sao tôi nghe tiếng rất nhỏ dù đã phát đúng?

Kết nối ESP32-S3 với module PCM5102A qua I2S chỉ cần ba dây tín hiệu (BCK, WS, DOUT), một đường mass chung và nguồn cho module; đặt module ở chế độ PLL (chân SCK nối mass) thì không cần dây MCLK. Về phần mềm, cấu hình I2S của ESP32-S3 ở chế độ master, định dạng Philips chuẩn, độ rộng khe 32 bit và tần số lấy mẫu khớp với file nhạc là đủ để DAC phát tiếng.

Bài này hướng dẫn đấu nối, cách tính tần số BCK, đoạn code cấu hình theo ESP-IDF và quy trình kiểm tra từng bước sau khi nạp code. Nếu bạn chưa rõ chức năng từng chân trên module, đọc trước bài sơ đồ kết nối module PCM5102A và chế độ PLL; nền tảng hoạt động của I2S trên ESP32 nằm ở bài kết nối ESP32-S3 với DAC I2S trong cụm ESP32 Audio.

Kiến trúc luồng tín hiệu

Trong hệ thống này, ESP32-S3 đóng vai trò nguồn phát và là master của bus I2S: nó tự tạo cả BCK (xung nhịp theo bit) lẫn WS (xung chọn kênh, còn gọi là LRCK). Dữ liệu âm thanh đi một chiều từ chân DOUT của ESP32-S3 vào chân DIN của PCM5102A. DAC là phía slave, khóa PLL nội theo BCK nên không cần nhận thêm xung hệ thống. Ngõ ra analog của module (mức line-level 2,1 Vrms toàn thang) đưa thẳng vào ampli hoặc tai nghe qua tầng khuếch đại riêng — không nối loa trực tiếp vào ngõ ra DAC.

Bảng đấu dây

ESP32-S3Module PCM5102AGhi chú
GPIO 4 (ví dụ)BCKChân I2S có thể gán cho hầu hết GPIO qua ma trận GPIO của ESP32-S3
GPIO 5 (ví dụ)LRCK / WSTần số của xung này bằng đúng tần số lấy mẫu
GPIO 6 (ví dụ)DINDữ liệu ra của ESP32 nối vào dữ liệu vào của DAC
GNDGNDMass chung bắt buộc, nối trước khi cấp nguồn
—SCKNối xuống GND trên module để bật chế độ PLL nội
—VINCấp nguồn theo nhãn module (thường qua LDO trên bo); không lấy nguồn cho module từ chân GPIO

Các số GPIO trên chỉ là ví dụ. Khi chọn chân thật cho dự án, tránh các chân strapping của ESP32-S3 (GPIO 0, 3, 45, 46) và các chân dành cho USB (GPIO 19, 20) nếu bạn còn dùng cổng USB gốc; cũng tránh chân đang nối với flash/PSRAM trên module WROOM/WROVER cụ thể của bạn. Đặt cấu hình bốn chân cấu hình của DAC theo bài trụ cột PCM5102A là gì? Thông số, nguyên lý hoạt động và ứng dụng, trong đó quan trọng nhất là XSMT ở mức cao và FMT chọn định dạng I2S.

Dây jumper nối các chân I2S giữa bo ESP32 và module DAC PCM5102A trên bàn làm việc

Tính tần số BCK để kiểm chứng

BCK không phải một tần số tùy ý: nó được suy ra hoàn toàn từ cấu hình I2S theo công thức BCK = fs × độ rộng khe × số kênh. Với fs = 48 kHz, khe 32 bit, 2 kênh: BCK = 48.000 × 32 × 2 = 3.072.000 Hz, tức 3,072 MHz. Với fs = 44,1 kHz, cùng cấu hình: BCK = 2,8224 MHz.

Công thức này có hai tác dụng thực tế. Thứ nhất, khi đo kiểm bằng máy hiện sóng hoặc logic analyzer, bạn biết trước con số đúng để đối chiếu — nếu đo ra khác hẳn, cấu hình phần mềm đang sai. Thứ hai, nó giải thích vì sao nên chọn khe 32 bit dù file nhạc chỉ 16 bit: ở chế độ PLL, DAC cần BCK có tỉ lệ hợp lệ so với fs, và cấu hình 64 × fs (32 bit × 2 kênh) là tỉ lệ phổ biến, ổn định; dữ liệu 16 bit vẫn được đặt vào khung 32 bit bình thường, phần mềm phía phát xử lý việc này.

Code cấu hình I2S theo ESP-IDF

Đoạn code sau dùng driver I2S thế hệ mới (i2s_std) của ESP-IDF v5.x, cấu hình kênh phát (TX) ở chế độ master, định dạng Philips, khe 32 bit, tần số lấy mẫu 48 kHz. Trên Arduino-ESP32 bản 3.x, thư viện ESP_I2S bọc cùng driver này với cú pháp khác; bản Arduino-ESP32 2.x dùng driver legacy (i2s_driver_install, i2s_set_pin) đã bị loại bỏ ở bản 3.x — không trộn hai bộ API trong cùng một dự án.

#include "driver/i2s_std.h"
#include "driver/gpio.h"

#define I2S_BCK_GPIO  GPIO_NUM_4
#define I2S_WS_GPIO   GPIO_NUM_5
#define I2S_DOUT_GPIO  GPIO_NUM_6

i2s_chan_handle_t tx_handle;
i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_AUTO, I2S_ROLE_MASTER);
i2s_new_channel(&chan_cfg, &tx_handle, NULL);

i2s_std_config_t std_cfg = {
  .clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(48000),
  .slot_cfg = I2S_STD_PHILIPS_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_32BIT, I2S_SLOT_MODE_STEREO),
  .gpio_cfg = { .mclk = I2S_GPIO_UNUSED, .bclk = I2S_BCK_GPIO, .ws = I2S_WS_GPIO, .dout = I2S_DOUT_GPIO, .din = I2S_GPIO_UNUSED },
};
i2s_channel_init_std_mode(tx_handle, &std_cfg);
i2s_channel_enable(tx_handle);

Trạng thái kiểm thử: đoạn code trên là mã minh họa theo tài liệu ESP-IDF v5.x, chưa được biên dịch và chạy thử trên board ESP32-S3 cụ thể trong khuôn khổ bài viết này. Khi dùng, hãy đối chiếu tên hàm và macro với phiên bản ESP-IDF/Arduino-ESP32 bạn đang cài, vì Espressif có điều chỉnh API giữa các bản phát hành. Sau khi khởi tạo kênh, dữ liệu PCM được ghi vào kênh bằng i2s_channel_write trong vòng lặp hoặc tác vụ riêng; phần phát nhạc (đọc file, giải mã MP3/AAC) nằm ngoài phạm vi bài này.

Kiểm tra từng bước sau khi nạp code

  • Bước 1 — nguồn: đo điện áp tại chân VIN của module và xác nhận module không nóng. ESP32-S3 chạy bình thường, không reset vòng lặp (boot loop).
  • Bước 2 — xung nhịp: khi chương trình đang phát, kiểm tra WS có sóng vuông 48 kHz và BCK khoảng 3,072 MHz bằng máy hiện sóng hoặc logic analyzer. Không có hai xung này thì lỗi nằm ở cấu hình I2S phía ESP32, chưa cần đụng tới module DAC.
  • Bước 3 — dữ liệu: chân DIN phải có hoạt động dữ liệu khi đang phát và đứng yên khi dừng phát. Có clock mà không có dữ liệu thường do đường ghi dữ liệu vào kênh I2S chưa chạy (tác vụ phát chưa start, buffer rỗng).
  • Bước 4 — nghe thử có kiểm soát: phát sóng sine 1 kHz ở mức −12 dBFS, volume ampli để nhỏ. Tiếng sine sạch, đều hai kênh là dấu hiệu chuỗi đã thông.
  • Bước 5 — đổi tần số lấy mẫu: phát thử một file 44,1 kHz sau khi đổi cấu hình clock sang 44.100 Hz. Nếu vẫn giữ cấu hình 48 kHz cho file 44,1 kHz, cao độ và tốc độ phát sẽ sai lệch — đây là lỗi cấu hình, không phải lỗi phần cứng.

Lỗi thường gặp khi ghép ESP32-S3 với PCM5102A

  • Quên nối SCK xuống mass: module ở chế độ chờ MCLK mà không ai cấp, DAC im lặng dù I2S đúng. Đây là lỗi phổ biến nhất của cặp đôi này.
  • Chọn nhầm chân strapping hoặc chân USB: hệ thống chạy chập chờn, khó nạp code hoặc mất cổng USB sau khi đấu dây.
  • Cấp nguồn module từ nguồn 3,3 V yếu của bo devkit chung với Wi-Fi: khi Wi-Fi phát sóng, dòng đỉnh có thể làm sụt áp và gây tiếng lách tách; nên cấp nguồn riêng đủ dòng cho module hoặc thêm tụ lọc tại chân VIN.
  • Dây I2S dài, chạy vòng qua khu vực anten: gây lỗi dữ liệu ngẫu nhiên. Đặt module tránh xa anten của ESP32-S3 và giữ dây ngắn.

Câu hỏi thường gặp

ESP32-S3 có cần cấp MCLK cho PCM5102A không?

Không cần nếu module chạy chế độ PLL (SCK nối mass). ESP32-S3 có chân MCLK trong ngoại vi I2S, nhưng với PCM5102A, dùng PLL nội giúp giảm một dây nối và bỏ qua việc đồng bộ tỉ lệ MCLK.

Tôi dùng Arduino IDE thì code có khác không?

Khác về cú pháp. Arduino-ESP32 3.x cung cấp thư viện ESP_I2S với các hàm như I2S.setPins và I2S.begin, trong khi bản 2.x dùng driver legacy. Nguyên tắc cấu hình thì giống nhau: master, định dạng Philips/I2S, khe 32 bit, tần số lấy mẫu khớp file nhạc.

Phát nhạc 44,1 kHz và 48 kHz lẫn nhau có cần đổi cấu hình không?

Có. Đồng hồ I2S phải đặt đúng tần số lấy mẫu của nội dung đang phát, nếu không cao độ sẽ lệch. Nhiều trình phát xử lý bằng cách resample mọi nội dung về một tần số cố định (ví dụ 48 kHz) để đơn giản hóa cấu hình — đánh đổi là thêm một bước xử lý số.

Sao tôi nghe tiếng rất nhỏ dù đã phát đúng?

Kiểm tra theo thứ tự: volume số trong code có bị đặt thấp không, ngõ vào ampli có đúng line-in không, và module có đang bị XSMT kéo xuống mức thấp (mute) không. Ngõ ra toàn thang của DAC là 2,1 Vrms, đủ mức line-level tiêu chuẩn, nên tiếng nhỏ bất thường hầu như luôn do cấu hình hoặc tầng sau.

Nếu bạn đang lắp hệ thống nghe nhạc hoặc loa DIY quanh ESP32-S3 và PCM5102A, có thể tham khảo thêm các module DAC, ampli và linh kiện liên quan tại cimo.vn để chọn đúng phiên bản module và phụ kiện đấu nối phù hợp với sơ đồ của mình.

#pcm5102a esp32-s3 i2s
Chia sẻ bài viết
Facebook
Cimo
Cimo
Cimo - Mọi thứ bạn cần với mức giá tốt nhất

Bài viết liên quan

Tất cả danh mục
Flash Sale
Ưu đãi hôm nay
Đấu giá