Giao thức I2C yêu cầu thao tác ghi địa chỉ thanh ghi trước khi đọc nội dung của thanh ghi đó từ thiết bị slave. Việc đọc nội dung thanh ghi mà không ghi địa chỉ trước đó không tuân thủ giao thức I2C.
Để đọc nội dung của một thanh ghi cụ thể từ thiết bị slave, cần thực hiện thao tác ghi vào thiết bị slave với địa chỉ của thanh ghi muốn đọc trước khi thực hiện thao tác đọc.
Các bước để đọc nội dung của một thanh ghi trên thiết bị slave trong giao thức I2C như sau:
START -> Địa chỉ 7-bit của slave -> R/W=0 (Thao tác ghi) -> ACK -> Địa chỉ thanh ghi (1 byte) -> ACK -> Sr (Khởi động lại) -> Địa chỉ 7-bit của slave -> R/W=1 (Thao tác đọc) -> ACK -> Dữ liệu từ thanh ghi -> NACK (từ slave vì nó không còn dữ liệu để gửi) -> STOP.
Tham khảo tài liệu “Understanding the I2C Bus” của Texas Instruments để hiểu rõ hơn về giao thức I2C: Understanding the I2C Bus
Hàm readReg
được thiết kế để đọc 2 byte từ slave. Cần kiểm tra xem kích thước đã được thay đổi thành 1 byte hay chưa nếu chỉ muốn đọc 1 byte.
Thanh ghi Reg0 thường là thanh ghi EN/RESET. Cần kiểm tra các thao tác đã thực hiện trước khi đọc Reg0, ví dụ như đã ghi dữ liệu vào thanh ghi này hay chưa.
Nên thử truy cập nội dung của một thanh ghi khác, ví dụ Reg4, để kiểm tra xem có thể đọc được nội dung đã ghi vào thanh ghi đó hay không.
Ví dụ về việc truy cập thanh ghi có địa chỉ 0x05 để đọc byte nhiệt độ thô từ cảm biến nhiệt độ MCP9808 trên RA6M4: Đầu tiên thực hiện ghi, ghi vào slave 0x05 là địa chỉ của thanh ghi muốn đọc, sau đó khoảng 100ms (do có một số vòng lặp while kiểm tra timeout) sẽ thực hiện quá trình đọc nội dung từ thanh ghi này.