Giới thiệu về giao tiếp I2C

Giới thiệu

I²C, viết tắt của từ tiếng Anh “Inter-Integrated Circuit”, là một loại bus nối tiếp được phát triển bởi hãng sản xuất linh kiện điện tử Philips. Ban đầu, loại bus này chỉ được dùng trong các linh kiện điện tử của Philips. Sau đó, do tính ưu việt và đơn giản của nó, I²C đã được chuẩn hóa và được dùng rộng rãi trong các mô đun truyền thông nối tiếp của vi mạch tích hợp ngày nay.

Cấu tạo và nguyên lý hoạt động

I²C sử dụng hai đường truyền tín hiệu:

  • Một đường xung nhịp đồng hồ(SCL) chỉ do Master phát đi ( thông thường ở 100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz).
  • Một đường dữ liệu(SDA) theo 2 hướng.
  • Sơ đồ kết nối như hình dưới.

Có một lưu ý nhỏ về xung clock. Bản chất của I2C là dữ liệu trên đường SDA chỉ được ghi nhận ở sườn lên của chân CLK. Do vậy xung clock có thể không cần chính xác tốc độ là 1MHz hay 3.4Mhz. Lợi dụng điểm này có thể sử dụng 2 chân GPIO để làm chân giao tiếp I2C mềm mà không nhất thiết cần một chân CLK tạo xung với tốc độ chính xác (có thể chỉ cần dùng delay và bật tắt mức logic, tham khảo phần code ở cuối bài :D)

SCL và SDA luôn được kéo lên nguồn bằng một điện trở kéo lên có giá trị xấp xỉ 4,7 KOhm (tùy vào từng thiết bị và chuẩn giao tiếp, có thể dao động trong khoảng 1KOhm đến 4.7 Kohm. Chú ý rằng theo cấu hình này, một thiết bị có thể ở mức logic LOW hay cao trở nhưng ko thể ở dạng HIGH => Chính trở pull up tạo ra mức logic HIGH).

Lý do là các chân này có dạng opendrain để có thể hoạt động ở các mức điện áp logic khác nhau. Việc lựa chọn trở pull up phù hợp sẽ được trình bày ở phần sau.

Các chế độ hoạt động của I²C

Dựa vào tốc độ ta chia làm 2 loại

  • Chế độ chuẩn (standard mode) hoạt động ở tốc độ 100 Kbit/s.
  • Chế độ tốc độ thấp (low-speed mode) hoạt động ở tốc độ 10 Kbit/s.

Nếu chia theo quan hệ chủ tớ:

  • Một chủ một tớ.
  • Một chủ nhiều tớ.
  • Nhiều chủ nhiều tớ.

Quá trình truyền dữ liệu

  • Thiết bị A (chủ) xác định đúng địa chỉ của thiết bị B (Tớ), cùng với việc xác định địa chỉ, thiết bị A sẽ quyết định đọc hay ghi vào thiết bị tớ.
  • Thiết bị A gửi gữi liệu tới thiết bị B
  • Thiết bị A kết thúc quá trình truyền dữ liệu.
  • Khi A muốn nhận dữ liệu từ B, quá trình diễn ra tương tự, chỉ khác A sẽ nhận dữ liệu từ B.
  • Tần số xung nhịp đồng hồ có thể xuống 0 Hz.

Cách đánh địa chỉ

I²C sử dụng 7 bit để định địa chỉ, do đó trên một bus có thể định địa chỉ tới 112 nút, 16 địa chỉ còn lại được sử dụng vào mục đích riêng. Bit còn lại quy định việc đọc hay ghi dữ liệu (1 là write, 0 là read).
Ví dụ:
– Địa chỉ của một thiết bị là 0x20. Khi cần đọc vào thiết bị này thì thanh ghi sẽ có giá trị 0x40 (thêm bit 0) còn khi ghi thì giá trị là 0x41 (thêm vào 0).
Điểm mạnh của I²C chính là hiệu suất và sự đơn giản của nó: một khối điều khiển trung tâm có thể điều khiển cả một mạng thiết bị mà chỉ cần hai lối ra điều khiển.
Ngoài ra I2C còn có chế độ 10bit địa chỉ:

Định dạng dữ liệu truyền

Dữ liệu được truyền trên bus I2C theo từng bit, bit dữ liệu được truyền đi tại mỗi sườn lên của xung clock trên SCKL , Quá trình thay đổi bit dữ liệu xảy ra khi SCL ở mức thấp.

  • Start = HIGH to LOW on SDA when SCL is HIGH
  • Stop = LOW TO HIGH on SDA when SCL is HIGH
  • Other when SCL low => Data!


Mỗi byte dữ liệu được truyền có độ dài là 8 bits. Số lượng byte có thể truyền trong một lần là không hạn chế.
Mỗi byte được truyền sẽ chờ tín hiệu phản hồi là một bit ACK để báo hiệu đã
nhận dữ liệu. => Mỗi lần I2C sẽ truyền 8bit và nhận 1bit.

Bit có trọng số cao nhất (MSB) sẽ được truyền đi đầu tiên, các bít sẽ được truyền đi lần lượt. Sau 8 xung clock trên dây SCL, 8 bit dữ liệu đã được truyền đi. Lúc này thiết bị nhận, sau khi đã nhận đủ 8 bít dữ liệu sẽ kéo SDA xuống mức thấp tạo một xung ACK ứng với xung clock thứ 9 trên dây SDA để báo hiệu đã nhận đủ 8 bit. Thiết bị truyền khi nhận được bit ACK sẽ tiếp tục thực hiện quá trình truyền hoặc kết thúc.

Thuật toán truyền nhận dữ liệu:

  • B1: Host xác định thiết bị cần giao tiếp và chế độ giao tiếp là read hay là write.

việc này được thực hiện bằng cách gửi 7bit địa chỉ thiết bị và thêm bit cuối cùng, 0 nếu read và 1 nếu write.

  • B2: Reset chế độ bằng cách thực hiện liên tiếp việc start và stop.

  • B3: Gửi địa chỉ thanh ghi cần truy nhập của thiết bị cũng như chế độ read hay write.
  • B4: Gửi hoặc nhận 1byte dữ liệu. Sau khi truyền 1byte dữ liệu, bên nhận đc dữ liệu sẽ gửi lại 1bit ACK để xác nhận đã nhận được dữ liệu và tiếp tục truyền hoặc bit NACK để báo nhận đc dữ liệu nhưng kết thúc quá trình truyên.


Chú ý: ASK là bit do slave truyền chứ ko phải do master truyền

Một byte truyền đi có kèm theo bit ACK là điều kiên bắt buộc, nhằm đảm bảo cho quá trình truyền nhận được diễn ra chính xác. Khi không nhận được đúng địa chỉ hay khi muốn kết thúc quá trình giao tiếp, thiết bị nhận sẽ gửi một xung Not‐ACK (SDA ở mức cao) để báo cho thiết bị chủ biết, thiết bị chủ sẽ tạo xung STOP để kết thúc hay lặp lại một xung START để bắt đầu quá trình mới.
Chọn trở Pullup I2C – I2C Bus pullup resistor Calculation

Giá trị trở pull up phù hợp cần đảm bảo 2 yếu tố:

  • Thỏa mãn phù hợp mức logic
  • Đảm bảo rise time của tín hiệu.

Để IC nhận ra đúng mức logic thì giá trị điện áp tại chân phải lớn hơn VOL. Ta có công thức tính trở min như sau:

Ngoài ra, do đặc thù của I2C có thêm phần rise time. Nếu giá trị trở quá lớn sẽ dẫn đến việc rise time cao.
Xem kết nối như một mạch RC (C là tụ kháng sinh) thì ta có điện áp theo thời gian tính theo công thức sau:

Thông thường, VIH và VIL thường tính lần lượt bằng 0.7*VCC và 0.3*VCC nên ta có:

Từ đó ta có RMAX là

các giá trị trên thường cho theo bảng trong datasheet

Tiến Anh

Xin chào, tôi là Tiến Anh. Nội dung trên blog này là những chia sẽ kiến thức của tôi với hy vọng sẽ hữu ích cho mọi người.

3 Responses

  1. Huy Huy says:

    cám ơn bạn

  2. Tươi says:

    Cảm ơn bạn , rất hữu ích

Bình luận