I2C là gì?
TWI (Two-Wire Serial Intereafce) là một module truyền thông nối tiếp đồng bộ trên các chip AVR dựa trên chuẩn truyền thông I2C. I2C là viết tắc của từ Inter-Integrated Circuit là một chuẩn truyền thông do hãng điện tử Philips Semiconductor sáng lập và xây dựng thành chuẩn năm 1990.
TWI (I2C) là một truyền thông nối tiếp đa chip chủ (tạm dịch của cụm từ multi-master serial computer bus). Khái niệm “multi-master” (tôi sẽ dùng từ tiếng anh multi-master thay vì dùng “đa chip chủ”) được hiểu là trong trên cùng một bus có thể có nhiều hơn một thiết bị làm Master, đồng thời một Slave có thể trở thành một Master nếu nó có khả năng. Ví dụ trong một mạng TWI của nhiều AVR kết nối với nhau, bất kỳ một AVR nào đều có thể trở thành Master ở một thời điểm nào đó. Tuy nhiên nếu một mạng dùng một AVR điều khiển các chip nhớ (như EEPROM AT24C1024 chẳng hạn) thì khái niệm “multi-master” không tồn tại vì các chip nhớ được thiết kế sẵn là Slave, không có khả năng trở thành master. TWI (I2C) được thực hiện trên 2 đường SDA (Serial DATA) và SCL (Serial Clock) trong đó SDA là đường truyền/nhận dữ liệu và SCL là đường xung nhịp. Căn cứ theo chuẩn I2C, các đường SDA và SCL trên các thiết bị có cấu hình “cực góp mở” (open-drain hoặc open-collector, tham khảo các mạch số dùng transistor để hiểu thêm), nghĩa là cần có các “điện trở kéo lên” (pull-up resistor) cho các đường này. Ở trạng thái nghỉ (Idle), 2 chân SDA và SCL ở mức cao. Hình 1 mô tả một mô hình mạng TWI (I2C) cơ bản.
Tiếp theo chúng ta tìm hiểu một số khái niệm và đặc điểm của TWI. Các khái niệm và đặc điểm tôi đề cập dưới đây được dùng cho cả TWI và I2C, nếu có sự khác biệt tôi sẽ giải thích thêm.
Master: là chip khởi động quá trình truyền nhận, phát đi địa chỉ của thiết bị cần giao tiếp và tạo xung giữ nhịp trên đường SCL.
Slave: là chip có một địa chỉ cố định, được gọi bởi Master và phục vụ yêu cầu từ Master.
SDA- Serial Data: là đường dữ liệu nối tiếp, tất cả các thông tin về địa chỉ hay dữ liệu đều được truyền trên đường này theo thứ tự từng bit một. Chú ý là trong chuẩn I2C, bit có trọng số lớn nhất (MSB) được truyền trước nhất.
Master: là chip khởi động quá trình truyền nhận, phát đi địa chỉ của thiết bị cần giao tiếp và tạo xung giữ nhịp trên đường SCL.
Slave: là chip có một địa chỉ cố định, được gọi bởi Master và phục vụ yêu cầu từ Master.
SDA- Serial Data: là đường dữ liệu nối tiếp, tất cả các thông tin về địa chỉ hay dữ liệu đều được truyền trên đường này theo thứ tự từng bit một. Chú ý là trong chuẩn I2C, bit có trọng số lớn nhất (MSB) được truyền trước nhất.
SCL –Serial Clock: là đường giữ nhịp nối tiếp. TWI (I2C) là chuần truyền thông nối tiếp đồng bộ, cần có 1 đường tạo xung giữ nhịp cho quá trình truyền/nhận, cứ mỗi xung trên đường giữ nhịp SCL, một bit dữ liệu trên đường SDA sẽ được lấy mẫu (sample). Dữ liệu nối tiếp trên đường SDA được lấy mẫu khi đường SCL ở mức cao trong một chu kỳ giữ nhịp, vì thế đường SDA không được đổi trạng thái khi SCL ở mức cao (trừ START và STOP condition). Chân SDA có thể được đổi trạng thái khi SCL ở mức thấp.
START Condition-Điều kiện bắt đầu: từ trạng thái nghỉ, khi cả SDA và SCL ở mức cao nếu Master muốn thực hiện một “cuộc gọi”, Master sẽ kéo chân SDA xuống thấp trong khi SCL vẫn cao. Trạng thái này gọi là START Condition (chúng ta gọi tắt là S).
STOP Condition-Điều kiện kết thúc: sau khi thực hiện truyền/nhận dữ liệu, nếu Master muốn kết thúc quá trình nó sẽ tạo ra một STOP condition. STOP condition được Master thực hiện bằng cách kéo chân SDA lên cao khi đường SCL đang ở mức cao. STOP condition chỉ được tạo ra sau khi địa chỉ hoặc dữ liệu đã được truyền/nhận.
REPEAT START – Bắt đầu lặp lại: khoảng giữa START và STOP condition là khoảng bận của đường truyền, các Master khác không tác động được vào đường truyền trong khoảng này. Trường hợp sau khi kết thúc truyền/nhận mà Master không gởi STOP condition lại gởi thêm 1 START condition gọi là REPEAT START. Khả năng này thường được dùng khi Master muốn lấy dữ liệu liên tiếp từ các Slaves. Hình bên dưới mô tả các Master tạo ra START, STOP và REPEAT START.
STOP Condition-Điều kiện kết thúc: sau khi thực hiện truyền/nhận dữ liệu, nếu Master muốn kết thúc quá trình nó sẽ tạo ra một STOP condition. STOP condition được Master thực hiện bằng cách kéo chân SDA lên cao khi đường SCL đang ở mức cao. STOP condition chỉ được tạo ra sau khi địa chỉ hoặc dữ liệu đã được truyền/nhận.
REPEAT START – Bắt đầu lặp lại: khoảng giữa START và STOP condition là khoảng bận của đường truyền, các Master khác không tác động được vào đường truyền trong khoảng này. Trường hợp sau khi kết thúc truyền/nhận mà Master không gởi STOP condition lại gởi thêm 1 START condition gọi là REPEAT START. Khả năng này thường được dùng khi Master muốn lấy dữ liệu liên tiếp từ các Slaves. Hình bên dưới mô tả các Master tạo ra START, STOP và REPEAT START.
Address Packet Format – Định dạng gói địa chỉ: trên mạng TWI (I2C), tất cả các thiết bị (chip) đều có thể là Master hay Slave. Mỗi thiết bị có một địa chỉ cố định gọi là Device address. Khi một Master muốn giao tiếp với một Slave nào đó, nó trước hết tạo ra một START condition và tiếp theo là gởi địa chỉ Device address của Slave cần giao tiếp trên đường truyền, vì thế xuất hiện khái niệm “gói địa chỉ” (Address Packet). Gói địa chỉ trong TWI (I2C) có định dạng 9 bits trong đó 7 bit đầu (gọi là SLA, được gởi liền sau START condition) chứa địa chỉ Slave, một bit READ/WRITE và một bit ACK-Ackknowledge (xác nhận). Do bit địa chỉ có độ dài 7 bits nên về mặt lý thuyết, trên 1 mạng TWI (I2C) có thể tồn tại tối đa 2^7=128 thiết bị có địa chỉ riêng biệt. Tuy nhiên, có một số địa chỉ không được sử dụng như các địa chỉ có định dạng 1111xxx (tức các địa chỉ lớn hơn hoặc bằng 120 không được dùng). Riêng địa chỉ 0 được dùng cho “cuộc gọi chung” (General call). Bit READ/WRITE (R/W) được truyền tiếp sau 7 bit địa chỉ là bit báo cho Slave biết Master muốn “đọc” hay “ghi” vào Slave. Nếu bit này bằng 0 (gọi là W) thì quá trình “Ghi” dữ liệu từ Master đến Slave được yêu cầu, nếu bit này bằng 1 (gọi là R) thì Master muốn “đọc” dữ liệu từ Slave về. Tám bits trên (SLA+R/W) được Master phát ra sau khi phát START condition, nếu một Slave trên mạng nhận ra rằng địa chỉ mà Master yêu cầu trùng khớp với Device address của chính mình, nó sẽ “đáp trả” lại Master bằng cách phát ra 1 tín hiệu “xác nhận” ACK bằng cách kéo chân SDA xuống thấp trong xung thứ 9. Ngược lại, nếu không có Slave đáp ứng lại, chân SDA vẫn ở mức cao trong xung giữ nhịp thứ 9 thì gọi là tín hiệu “không xác nhận” – NOT ACK, lúc này Master cần có những ứng xử phù hợp tùy theo mỗi trường hợp cụ thể, ví dụ Master có thể gởi STOP condition và sau đó phát lại địa chỉ Slave khác…Như vậy, trong 9 bit của gói địa chỉ thì chỉ có 8 bit được gởi bởi Master, bit còn lại là do Slave. Ví dụ Master muốn yêu cầu “đọc” dữ liệu từ Slave có địa chỉ 43, nó cần phát đi một byte như sau trên đường truyền: (43<<1)+1, trong đó (43<<1) là dịch số 43 về bên trái 1 vị trí vì 7 bit địa chỉ nằm ở các vị trí cao trong gói địa chỉ, sau đó cộng giá trị này với “1” tức là quá trình “đọc” được yêu cầu.
General call – Cuộc gọi chung: khi Master phát đi gói địa chỉ có dạng 0 (thực chất là 0+W) tức nó muốn thực hiện một cuộc gọi chung đến tất cả các Slave. Tất nhiên, cho phép hay không cho phép cuộc gọi chung là do Slave quyết định. Nếu các Slave được cài đặt cho phép cuộc gọi chung, chúng sẽ đáp lại Master bằng ACK. Cuộc gọi chung thường xảy ra khi Master muốn gởi dữ liệu chung đến các Slaves. Chú ý là cuộc gọi chung có dạng 0+R là vô nghĩa vì không thể có chuyện Master nhận dữ liệu từ tất cả các Slave cùng thời điểm.
Data Packet Format – Định dạng gói dữ liệu: sau khi địa chỉ đã được phát đi, Slave đã đáp lại Master bằng ACK thì quá trình truyền/nhận dữ liệu sẽ diễn ra giữa cặp Master/Slave này. Tùy vào bit R/W trong gói địa chỉ, dữ liệu có thể được truyền theo hướng từ Master đến Slave hay từ Slave đến Master. Dù di chuyển theo hướng nào, gói dữ liệu luôn bao gồm 9 bits trong đó 8 bits đầu là dữ liệu và 1 bit cuối là bit ACK. Tám bits dữ liệu do thiết bị phát gởi và bit ACK do thiết bị nhận tạo ra. Ví dụ khi Master thực hiện quá trình gởi dữ liệu đến Slave, nó sẽ phát ra 8 bits dữ liệu, Slave nhận và phát lại ACK (kéo SDA xuống 0 ở xung thứ 9), sau đó Master sẽ quyết định gợi tiếp byte dữ liệu khác hay không. Nếu Slave phát tín hiệu NOT ACK (không tác động SDA ở xung thứ 9) sau khi nhận dữ liệu thì Master sẽ kết thúc quá trình gởi bằng cách phát đi STOP condition. Hình bên dưới mô tả định dạng gói dữ liệu trong TWI (I2C).
Data Packet Format – Định dạng gói dữ liệu: sau khi địa chỉ đã được phát đi, Slave đã đáp lại Master bằng ACK thì quá trình truyền/nhận dữ liệu sẽ diễn ra giữa cặp Master/Slave này. Tùy vào bit R/W trong gói địa chỉ, dữ liệu có thể được truyền theo hướng từ Master đến Slave hay từ Slave đến Master. Dù di chuyển theo hướng nào, gói dữ liệu luôn bao gồm 9 bits trong đó 8 bits đầu là dữ liệu và 1 bit cuối là bit ACK. Tám bits dữ liệu do thiết bị phát gởi và bit ACK do thiết bị nhận tạo ra. Ví dụ khi Master thực hiện quá trình gởi dữ liệu đến Slave, nó sẽ phát ra 8 bits dữ liệu, Slave nhận và phát lại ACK (kéo SDA xuống 0 ở xung thứ 9), sau đó Master sẽ quyết định gợi tiếp byte dữ liệu khác hay không. Nếu Slave phát tín hiệu NOT ACK (không tác động SDA ở xung thứ 9) sau khi nhận dữ liệu thì Master sẽ kết thúc quá trình gởi bằng cách phát đi STOP condition. Hình bên dưới mô tả định dạng gói dữ liệu trong TWI (I2C).

Phối hợp gói địa chỉ và dữ liệu: một quá trình truyền/nhận TWI (I2C) thường được bắt đầu từ Master, Master phát đi một START condition sau đó gởi gói địa chỉ SLA+R/W trên đường truyền. Tiếp theo nếu có một Slave đáp ứng lại, dữ liệu có thể truyền/nhận liên tiếp trên đường truyền (1 hoặc nhiều byte liên tiếp). Khung truyền thông thường được mô tả như hình bên dưới.
Multi-Master Bus –Đường truyền đa chip chủ: TWI (I2C) là chuẩn truyền thông đa chip chủ, nghĩa là tại một thời điểm có thể có nhiều hơn 1 chip làm Master nếu các chip này phát ra START condition cùng lúc. Nếu các Master có cùng yêu cầu và thao tác đối với Slave thì chúng có thể “cùng tồn tại” và quá trình truyền/nhận có thể thành công. Tuy nhiên, trong đa số trường hợp sẽ có một số Master bị “thất lạc” (lost). Một Master bị lost khi nó truyền/nhận 1 mức cao trên SDA trong khi các Master khác truyền/nhận 1 mức thấp. Truyền thông đa chip chủ tương đối phức tạp và vì thế tôi sẽ không đề cập trường hợp này trong lúc thực hiện ví dụ giao tiếp trong bài học này.





Comments
Post a Comment