
Kiểm tra và gỡ lỗi bus dữ liệu số I2C
Tìm hiểu cách kiểm tra và gỡ lỗi giao tiếp I²C để nhanh chóng xác định các sự cố có thể làm gián đoạn quá trình truyền dữ liệu.
Thuật ngữ "bus" là một từ có nguồn gốc từ một thành phần dẫn điện trong hệ thống phân phối điện. Nó thường dùng để chỉ một thanh dẫn điện ngắn, chuyên dụng, phân nhánh từ các đường dây điện trên không hoặc ngầm dưới đất. Theo truyền thống, bus bao gồm một thanh đồng trần, thường có tiết diện hình chữ nhật, được gắn chắc chắn bên trong tủ điện hoặc vỏ bọc và có khả năng dẫn dòng điện lớn.
Từ bus dữ liệu song song sang bus dữ liệu nối tiếp.
Ngược lại, các bus dữ liệu ban đầu bao gồm các nhóm dây dẫn cách điện được bố trí song song, được kết nối ở hai đầu bằng cách hàn hoặc sử dụng đầu nối cắm. Theo thời gian, đã có sự chuyển đổi rõ rệt từ truyền dữ liệu song song sang truyền dữ liệu nối tiếp, mặc dù truyền song song vẫn được sử dụng trong một số trường hợp. Truyền dữ liệu nối tiếp có ưu điểm là sử dụng ít dây dẫn hơn và ít bị ảnh hưởng bởi nhiễu xuyên âm, nhiễu điện và mất dữ liệu.
Mỗi loại bus kỹ thuật số có cách truy cập và hiển thị các đặc tính tín hiệu trên máy hiện sóng khác nhau để phục vụ việc khắc phục sự cố hoặc thiết kế hệ thống. Một trong những bus kỹ thuật số phổ biến nhất là I²C, viết tắt của Inter-Integrated Circuit (mạch liên kết giữa các mạch tích hợp). Các chữ cái trong tên I²C chỉ đơn giản là chữ viết tắt và không đại diện cho bất kỳ phép toán nào.
I²C là gì?
Giao thức I²C, được Philips Semiconductor giới thiệu lần đầu vào năm 1982, là một bus nối tiếp đồng bộ, hỗ trợ nhiều thiết bị chủ và thiết bị phụ, truyền dữ liệu theo từng byte và hai chiều, được sử dụng để kết nối các mạch tích hợp (IC) với bộ xử lý. Thông thường, giao diện I²C bao gồm các đường mạch bằng đồng trên bảng mạch in (PCB), nhưng trong một số trường hợp, dây dẫn có thể được sử dụng để kết nối nhiều bảng mạch.
Từ năm 2006, các yêu cầu cấp phép liên quan đến việc triển khai I²C đã được nới lỏng, cho phép sử dụng giao thức này mà không phải trả phí cấp phép cho NXP, ngoại trừ một số vấn đề liên quan đến nhãn hiệu và việc cấp địa chỉ I²C cho thiết bị.
Đã có một sự chuyển đổi đáng kể từ truyền dữ liệu song song sang truyền dữ liệu nối tiếp, giúp giảm số lượng dây dẫn và cải thiện hiệu suất hệ thống. Tuy nhiên, một thách thức là việc khắc phục sự cố và tạo mẫu hệ thống truyền dữ liệu nối tiếp đòi hỏi quá trình tìm hiểu tương đối phức tạp. Một lý do là nhiều thiết bị chủ và thiết bị phụ có thể cần truyền dữ liệu trên cùng một bus, đòi hỏi các cơ chế phức tạp để quản lý và xác định thiết bị nào có thể truy cập bus.
Nguyên lý hoạt động của bus I²C hai dây.
Giao thức I²C dựa trên kết nối giữa thiết bị chủ và thiết bị phụ thông qua hai dây dẫn. Có thể có nhiều thiết bị chủ và thiết bị phụ trên cùng một bus nối tiếp hai dây. Tất cả các thiết bị chủ và thiết bị phụ được kết nối song song với hai dây dẫn này, tương tự như cách nhiều ổ cắm được kết nối vào cùng một mạch điện.
Hai đường dây được duy trì ở mức logic cao thông qua các điện trở kéo lên, và khi thiết bị chủ hoặc thiết bị phụ kéo một đường dây xuống mức thấp, điện áp trên đường dây đó sẽ giảm xuống mức logic thấp. Trong hai đường dây, một đường đóng vai trò là đường dữ liệu nối tiếp (SDA) và đường còn lại là đường xung nhịp nối tiếp (SCL). Bằng cách kéo đường dây xuống mức thấp hoặc nhả đường dây để điện trở kéo lên đưa nó về mức cao, mỗi thiết bị chủ hoặc thiết bị phụ có thể truyền dữ liệu mà các thiết bị khác trên bus có thể nhận biết.
Mỗi thiết bị chủ theo dõi trạng thái Bắt đầu hoặc Dừng của bus. Nếu một thiết bị chủ đang sử dụng bus, các thiết bị chủ khác phải chờ hoặc tham gia cơ chế phân xử nếu nhiều thiết bị chủ cùng bắt đầu truyền dữ liệu. Nếu hai thiết bị chủ bắt đầu gửi dữ liệu đồng thời, thiết bị chủ tiếp tục truyền được xác định thông qua cơ chế phân xử từng bit, chứ không chỉ dựa vào địa chỉ của thiết bị phụ.
Các đường dữ liệu I²C, tín hiệu xung nhịp và địa chỉ.
Giao thức I²C hoạt động thông qua một đường dữ liệu hai chiều gọi là SDA, được sử dụng để truyền và nhận dữ liệu I²C, cùng với một đường xung nhịp gọi là SCL. Mỗi thiết bị phụ thường được xác định bằng một địa chỉ 7 bit duy nhất, mặc dù I²C cũng hỗ trợ địa chỉ 10 bit.
Quá trình truyền dữ liệu sẽ bắt đầu bằng điều kiện Bắt đầu (START), được xác định bằng cạnh xuống của SDA khi SCL ở mức cao, và kết thúc bằng điều kiện Dừng (STOP), được xác định bằng cạnh lên của SDA khi SCL ở mức cao.
Dữ liệu được truyền qua SDA theo từng khối 1 byte, với bit đầu tiên là bit có trọng số cao nhất (MSB). Bit SDA phải giữ nguyên giá trị khi SCL ở mức cao và thường chỉ thay đổi khi SCL ở mức thấp. Nếu SDA thay đổi khi SCL đang ở mức cao, điều đó có thể được hiểu là điều kiện START hoặc STOP, tùy thuộc vào hướng thay đổi, và có thể gây ra lỗi truyền thông hoặc khiến quá trình truyền dữ liệu bị gián đoạn.
Không có giới hạn cố định về số byte tối đa có thể truyền trong một giao dịch I²C. Mỗi byte dữ liệu thường được theo sau bởi một bit xác nhận (ACK) hoặc không xác nhận (NACK) từ thiết bị nhận để cho biết byte đã được nhận hay chưa.
Thiết kế và kiểm thử mạch I²C.
Một phương pháp phổ biến để thiết kế mạch I²C là bắt đầu bằng việc phát triển thiết bị chủ trước, sau đó kiểm tra nó với một thiết bị phụ thử nghiệm. Thiết bị phụ thử nghiệm về cơ bản là một mạch mô phỏng cung cấp các điểm kết nối để kiểm tra. Thông thường, nền tảng được sử dụng để xây dựng thiết bị phụ thử nghiệm là cùng một loại vi điều khiển được sử dụng trong quá trình phát triển thiết bị phụ thực tế.
Việc kiểm tra mạch I²C thường tập trung vào ba lĩnh vực: đặc tính điện của bus, thời gian và xử lý các ngoại lệ.
Ví dụ, có thể xảy ra trường hợp độ trễ giữa SCL và SDA quá dài. Trong những trường hợp như vậy, các điều kiện START hoặc STOP không mong muốn có thể xuất hiện trong quá trình truyền tín hiệu I²C, dẫn đến việc thiết bị phụ nhận được thông điệp khác với dự định hoặc không nhận được tín hiệu xác nhận.
Tương tự, hoạt động không thành công có thể dẫn đến việc thiếu hoặc xuất hiện các xung SCL bất ngờ. Trong trường hợp xảy ra sự cố, việc tạo ra điều kiện START có thể giúp chấm dứt trạng thái truyền dữ liệu chưa hoàn chỉnh hoặc bị lỗi, giúp thiết bị sẵn sàng nhận các thông điệp mới.
Một vấn đề khác có thể xảy ra khi lượng dữ liệu truyền đi ít hơn 8 bit. Trong trường hợp này, thiết bị nhận có thể tiếp tục chờ các bit còn lại của byte, và nếu chưa nhận đủ 8 bit, thiết bị sẽ không phát ra bit xác nhận cho byte đó.
Khi thực hiện một giao dịch truyền dữ liệu theo khối, số byte cần gửi hoặc nhận có thể được xác định trước trong một thanh ghi khác. Nếu số byte được gửi hoặc nhận ít hơn dự kiến, máy trạng thái có thể tiếp tục chờ phần dữ liệu còn lại của thông điệp. Có thể tạo ra điều kiện START để thoát khỏi trạng thái chờ này, tùy thuộc vào cách triển khai của thiết bị.
Hơn nữa, thiết bị chủ phải có khả năng tương tác chính xác với các đặc tính phản hồi và thời gian của thiết bị phụ. Độ nhạy với những vấn đề này thường có thể được xác định thông qua thử nghiệm thay vì chỉ phân tích lý thuyết. Cụ thể, thiết bị phụ có thể yêu cầu thiết bị chủ xử lý các sự kiện khẩn cấp hoặc phát tín hiệu ngắt thông qua một đường tín hiệu riêng. Việc kiểm tra thời điểm các sự kiện này xảy ra và cách thiết bị chủ phản hồi có thể giúp phát hiện các vấn đề tiềm ẩn trong giao diện I²C.
Sử dụng trình giả lập thiết bị phụ để thử nghiệm.
Một phương pháp phổ biến là tạo ra một thiết bị phụ mô phỏng (surrogate slave) để hỗ trợ việc kiểm thử thiết bị chủ (master testing). Vai trò chính của thiết bị phụ mô phỏng là kiểm thử và xác nhận giao diện; do đó, thiết bị này có thể có nhiều chức năng hơn thiết bị chủ đang được kiểm thử, nhằm hỗ trợ quá trình kiểm tra.
Thiết bị và dụng cụ để kiểm tra giao thức I²C.
Có nhiều cách để kiểm tra mạch I²C. Một phương pháp là sử dụng bo mạch Tektronix Demo 1, được thiết kế để sử dụng với máy hiện sóng Tektronix MSO4000 nhưng cũng tương thích với MDO3000. Bo mạch này cung cấp một số loại tín hiệu bus nối tiếp, bao gồm cả đầu nối chuyên dụng cho I²C.
Bo mạch đi kèm với cáp USB loại chữ Y, có hai đầu nối USB loại A ở một đầu. Cả hai đầu nối phải được cắm vào các cổng USB riêng biệt trên máy hiện sóng để đảm bảo cung cấp đủ nguồn điện.
Một đèn LED đỏ và hai đèn LED xanh lá cây cho biết bo mạch đã được cấp nguồn và sẵn sàng sử dụng. Sau khi thu nhận thành công tín hiệu bus nối tiếp I²C từ bo mạch demo, bạn có thể kết nối các đầu dò với những điểm kiểm tra tương ứng trên thiết bị bị lỗi. Tham khảo sơ đồ mạch và bảng dữ liệu để biết cách kết nối và cấu hình các đầu dò nhằm thu nhận tín hiệu.
Bus Pirate
Một phương pháp chi phí thấp khác để kiểm tra mạch I²C là Bus Pirate, một giao diện bus đa năng có thể giao tiếp với hầu hết các chip thông qua thiết bị đầu cuối nối tiếp trên máy tính, hỗ trợ nhiều giao thức nối tiếp ở mức điện áp từ 0 đến 5,5 V, tùy thuộc vào phiên bản.
Bus Pirate cũng cung cấp nhiều chức năng hữu ích, chẳng hạn như đầu dò điện áp 0–6 V, đo tần số từ 1 Hz đến 40 MHz, bộ tạo PWM/tần số từ 1 kHz đến 4 MHz, các điện trở kéo lên có thể lựa chọn điện áp, macro cho các lệnh thường dùng, bộ phân tích lưu lượng bus, bộ nạp khởi động để cập nhật firmware thuận tiện, bộ phân tích logic hỗ trợ SUMP với tốc độ lấy mẫu từ 10 Hz đến 1 MHz, cùng nhiều tính năng hữu ích khác, tùy thuộc vào phiên bản thiết bị.
Arduino Leonardo
Một phương pháp mã nguồn mở khác để kiểm thử là userial, một cầu nối USB sang I²C/SPI/GPIO miễn phí sử dụng vi điều khiển Atmel trên bo mạch Arduino Leonardo. Ngoài I²C, nó còn hỗ trợ:
- 1 giao diện USB (mô phỏng cổng nối tiếp)
- 1 giao diện JTAG
- 1 giao diện SPI
- 8 chân vào/ra kỹ thuật số đa năng (GPIO)
- 4 kênh chuyển đổi tương tự sang số (ADC)
Bo mạch giao tiếp với máy tính chủ thông qua lớp thiết bị USB CDC (Communications Device Class), cho phép người dùng thao tác dễ dàng mà không cần cài đặt trình điều khiển thiết bị hoặc thư viện chuyên dụng trong các hệ điều hành có hỗ trợ sẵn. Việc sử dụng giao diện lệnh ASCII cho phép điều khiển thiết bị thủ công thuận tiện thông qua chương trình đầu cuối.




