|
| 1 | +================= |
| 2 | +Il protocollo I2C |
| 3 | +================= |
| 4 | + |
| 5 | +Questo documento è una panoramica delle transazioni di base I2C e delle API |
| 6 | +del kernel per eseguirli. |
| 7 | + |
| 8 | +Spiegazione dei simboli |
| 9 | +======================= |
| 10 | + |
| 11 | +=============== =========================================================== |
| 12 | +S Condizione di avvio |
| 13 | +P Condizione di stop |
| 14 | +Rd/Wr (1 bit) Bit di lettura/scrittura. Rd vale 1, Wr vale 0. |
| 15 | +A, NA (1 bit) Bit di riconoscimento (ACK) e di non riconoscimento (NACK). |
| 16 | +Addr (7 bit) Indirizzo I2C a 7 bit. Nota che questo può essere espanso |
| 17 | + per ottenere un indirizzo I2C a 10 bit. |
| 18 | +Dati (8 bit) Un byte di dati. |
| 19 | + |
| 20 | +[..] Fra parentesi quadre i dati inviati da dispositivi I2C, |
| 21 | + anziché dal master. |
| 22 | +=============== =========================================================== |
| 23 | + |
| 24 | + |
| 25 | +Transazione semplice di invio |
| 26 | +============================= |
| 27 | + |
| 28 | +Implementato da i2c_master_send():: |
| 29 | + |
| 30 | + S Addr Wr [A] Dati [A] Dati [A] ... [A] Dati [A] P |
| 31 | + |
| 32 | + |
| 33 | +Transazione semplice di ricezione |
| 34 | +================================= |
| 35 | + |
| 36 | +Implementato da i2c_master_recv():: |
| 37 | + |
| 38 | + S Addr Rd [A] [Dati] A [Dati] A ... A [Dati] NA P |
| 39 | + |
| 40 | + |
| 41 | +Transazioni combinate |
| 42 | +===================== |
| 43 | + |
| 44 | +Implementato da i2c_transfer(). |
| 45 | + |
| 46 | +Sono come le transazioni di cui sopra, ma invece di uno condizione di stop P |
| 47 | +viene inviata una condizione di inizio S e la transazione continua. |
| 48 | +Un esempio di lettura di un byte, seguita da una scrittura di un byte:: |
| 49 | + |
| 50 | + S Addr Rd [A] [Dati] NA S Addr Wr [A] Dati [A] P |
| 51 | + |
| 52 | + |
| 53 | +Transazioni modificate |
| 54 | +====================== |
| 55 | + |
| 56 | +Le seguenti modifiche al protocollo I2C possono essere generate |
| 57 | +impostando questi flag per i messaggi I2C. Ad eccezione di I2C_M_NOSTART, sono |
| 58 | +di solito necessari solo per risolvere problemi di un dispositivo: |
| 59 | + |
| 60 | +I2C_M_IGNORE_NAK: |
| 61 | + Normalmente il messaggio viene interrotto immediatamente se il dispositivo |
| 62 | + risponde con [NA]. Impostando questo flag, si considera qualsiasi [NA] come |
| 63 | + [A] e tutto il messaggio viene inviato. |
| 64 | + Questi messaggi potrebbero comunque non riuscire a raggiungere il timeout |
| 65 | + SCL basso->alto. |
| 66 | + |
| 67 | +I2C_M_NO_RD_ACK: |
| 68 | + In un messaggio di lettura, il bit A/NA del master viene saltato. |
| 69 | + |
| 70 | +I2C_M_NOSTART: |
| 71 | + In una transazione combinata, potrebbe non essere generato alcun |
| 72 | + "S Addr Wr/Rd [A]". |
| 73 | + Ad esempio, impostando I2C_M_NOSTART sul secondo messaggio parziale |
| 74 | + genera qualcosa del tipo:: |
| 75 | + |
| 76 | + S Addr Rd [A] [Dati] NA Dati [A] P |
| 77 | + |
| 78 | + Se si imposta il flag I2C_M_NOSTART per il primo messaggio parziale, |
| 79 | + non viene generato Addr, ma si genera la condizione di avvio S. |
| 80 | + Questo probabilmente confonderà tutti gli altri dispositivi sul bus, quindi |
| 81 | + meglio non usarlo. |
| 82 | + |
| 83 | + Questo viene spesso utilizzato per raccogliere le trasmissioni da più |
| 84 | + buffer di dati presenti nella memoria di sistema in qualcosa che appare |
| 85 | + come un singolo trasferimento verso il dispositivo I2C. Inoltre, alcuni |
| 86 | + dispositivi particolari lo utilizzano anche tra i cambi di direzione. |
| 87 | + |
| 88 | +I2C_M_REV_DIR_ADDR: |
| 89 | + Questo inverte il flag Rd/Wr. Cioè, se si vuole scrivere, ma si ha bisogno |
| 90 | + di emettere una Rd invece di una Wr, o viceversa, si può impostare questo |
| 91 | + flag. |
| 92 | + Per esempio:: |
| 93 | + |
| 94 | + S Addr Rd [A] Dati [A] Dati [A] ... [A] Dati [A] P |
| 95 | + |
| 96 | +I2C_M_STOP: |
| 97 | + Forza una condizione di stop (P) dopo il messaggio. Alcuni protocolli |
| 98 | + simili a I2C come SCCB lo richiedono. Normalmente, non si vuole essere |
| 99 | + interrotti tra i messaggi di un trasferimento. |
0 commit comments