I2C-protokollen kræver, at registeradressen skrives, før indholdet af det pågældende register læses fra slaveenheden. Det er ikke i overensstemmelse med I2C-protokollen at læse registerindhold uden forudgående adreseskrivning.
For at læse indholdet af et specifikt register fra slaveenheden skal der udføres en skriveoperation til slaveenheden med adressen på det register, der skal læses, før en læseoperation udføres.
Trinene til at læse indholdet af et register på en slaveenhed i I2C-protokollen er som følger:
START -> Slave 7-bit adresse -> R/W=0 (Skriveoperation) -> ACK -> Registeradresse (1 byte) -> ACK -> Sr (Genstart) -> Slave 7-bit adresse -> R/W=1 (Læs operation) -> ACK -> Data fra register -> NACK (fra slave, da den ikke har mere data at sende) -> STOP.
Se Texas Instruments’ dokument “Understanding the I2C Bus” for en dybere forståelse af I2C-protokollen: Understanding the I2C Bus
Funktionen readReg
er designet til at læse 2 bytes fra slaven. Kontroller, om størrelsen er ændret til 1 byte, hvis du kun ønsker at læse 1 byte.
Register Reg0 er typisk EN/RESET registeret. Kontroller de handlinger, der er udført før læsning af Reg0, f.eks. om der er skrevet data til dette register.
Prøv at få adgang til indholdet af et andet register, f.eks. Reg4, for at kontrollere, om det er muligt at læse det indhold, der er skrevet til det register.
Eksempel på adgang til register med adresse 0x05 for at læse rå temperaturbyte fra MCP9808 temperatursensor på RA6M4: Først udføres en skrivning, skriv til slave 0x05, som er adressen på det register, der skal læses, derefter efter ca. 100ms (på grund af nogle while-løkker, der kontrollerer timeout) udføres læsning af indholdet fra dette register.