Il bus I2C viene spesso utilizzato per la comunicazione tra circuiti integrati. Talvolta è utile sapere quali dati vengono inviati su tale canale. Il circuito qui descritto legge i dati I2C e li invia, tramite USB, a un PC che li visualizza sullo schermo in formato esadecimale. A richiesta, i dati possono essere filtrati per una selezione d'indirizzi specifici.
Introduzione
Il bus I2C è costituito da due linee di segnale: il clock SCL e la linea dati SDA. I dati vengono trasmessi serialmente. Un messaggio è composto da due o più byte, ognuno seguito da un bit di riconoscimento. Una sequenza di avvio indica l'inizio del messaggio, una sequenza di arresto lo chiude. La frequenza di clock nella "modalità standard" del bus I2C è di 100 kHz, con una velocità di trasmissione dati di 20 kB al secondo. In modalità veloce è di 80 kB al secondo. Nell'applicazione qui descritta, un pacchetto di 64 byte per millisecondo viene inviato tramite USB. Questo è sufficiente per leggere i dati dal bus I2C in modalità standard, ma non adatto per la modalità veloce.
L'hardware
La figura 1 mostra lo schema del lettore di bus di dati I2C. Si notano i due microcontrollori. Il PIC16F1455 (U2) è utilizzato per leggere i dati I2C e inviarli al PC via USB. Il modulo I2C di questo controller è configurato come RX slave per raccogliere tutti i dati da qualsiasi indirizzo. Tuttavia, ciò accade solo se è presente il bit di scrittura dei dati in entrata. Quando il bit di lettura è impostato, tutti i dati vengono ignorati. Inoltre, le informazioni di conferma non possono essere lette.
Il PIC16F15313 (U1) converte ogni bit "letto" in un bit "di scrittura". I bit di lettura e il riconoscimento vengono rimossi dal flusso di dati e passati separatamente al PIC16F1455. Quest'ultimo manda tali informazioni al PC tramite USB. U1 è un PIC dotato di quattro celle logiche configurabili (CLC). La figura 2 mostra come esse sono configurate per questo progetto.
Il microcontrollore PIC16F1455 include l'interfaccia USB completa. L'oscillatore interno è sufficientemente preciso e non risulta necessario un cristallo di quarzo esterno. Il microcontrollore memorizza tutti i byte ricevuti nelle posizioni di memoria corrette e dopo aver ricevuto un numero di dati sufficienti, essi vengono inviati al PC. Il firmware per entrambi i processori è scritto in assembly. Le temporizzazioni critiche sono, quindi, accuratamente sotto controllo. Anche la configurazione del modulo USB è scritta in linguaggio assembly. Questa parte del firmware è stata originariamente fornita dalla Microchip. Il circuito richiede poca energia elettrica. Attinge l'alimentazione direttamente dalla connessione USB del PC. Il circuito contiene componenti SMD su un piccolo PCB a doppia faccia, con una dimensione di 14 per 33 mm (vedi figura 3).
Firmware e software
Il "Timer0" di U1 genera un bit che azzera il read-bit (vedi figura 4). Nel listato 1 è mostrato come CLC2 e imposta il read-bit su '0'. Il segnale SDA modificato è collegato all'uscita RA4. Essa è un'uscita "open-drain" con resistenza di pull-up esterna. U2 restituisce sempre, infatti, un segnale di conferma (ACK) dopo aver ricevuto un byte. L'input di U2 diventa poi un'uscita.
Listato 1 banksel CLC2GLS0 ; TMR0 ANDed with SDA clears bit 8 movlw 2 movwf CLC2GLS0 movwf CLC2GLS1 movwf CLC2GLS2 movlw 4 movwf CLC2GLS3 movlw 1 ; SDA input signal movwf CLC2SEL0 movlw 0ch ; TMR0 overflow movwf CLC2SEL1 clrf CLC2SEL2 clrf CLC2SEL3 clrf CLC2POL movlw 82h movwf CLC2CON
L'informazione letta è disponibile all'uscita di CLC3 e viene instradata su RA0. Poiché il segnale SDA è leggermente ritardato dal CLC, per mantenere la sincronizzazione corretta, anche il segnale SCL deve essere ritardato con CLC4. Un piccolo programma controlla il timer e legge il bit di conferma per RA2.
La figura 5 mostra l'interfaccia utente grafica (GUI) del software per PC. La barra di stato indica se il lettore di bus dati I2C è collegato e riconosciuto o meno. Il pulsante "Avvia acquisizione" inizia a leggere i dati I2C. Il LED del lettore si illumina di verde. Il pulsante di avvio diventa ora la funzione di arresto. I dati del bus I2C vengono visualizzati nella finestra, dove "S" sta per Start, "R" per Read, "W" per Write, "A" per Acknowledge, "N" per "No Acknowledge" e "P" per "stoP". I byte dei dati sono visualizzati in formato esadecimale.
Il software consente di filtrare, in forma esadecimale o binaria, i primi due byte. Quando essi sono specificati, saranno visualizzati solo i dati che iniziano con questi byte. Se "Post Acquisition" è selezionato, l'acquisizione dei dati inizia solo dopo il ricevimento dei byte specificati. La dimensione del buffer è di circa 40 kbyte. Se esso sta per riempirsi, parte dei dati all'inizio sono cancellati. Il controllo "Arresta quando buffer pieno" impedisce d'interrompere l'acquisizione dei dati in quel momento. Il LED verde si spegne non appena l'acquisizione si interrompe. Se sono presenti troppi dati, l'acquisizione dei dati s'interrompe e il LED rosso si accende. Il software ritorna alla situazione di partenza. I dati nella finestra del registro rimangono intatti finché non vengono eliminati o finché il buffer non si riempie. Attraverso il menu "File" è possibile salvare i dati della finestra su disco rigido. La visualizzazione continua dei dati è pesante e carica un po' il sistema operativo Windows. Pertanto si raccomanda di non eseguire contemporaneamente altri programmi sul PC.
Utilizzo
Prima di poter utilizzare il lettore di bus dati I2C, è necessario installare il driver USB. Quando si collega il lettore al PC tramite il Cavo USB, il PC vede un nuovo dispositivo. Nel download dell'articolo [1], è incluso nella directory del driver un file .inf . Si deve selezionare questo file quando il PC lo richiede. Il driver verrà installato automaticamente. Per installare l'interfaccia utente, occorre fare doppio clic sul programma Setup.exe, che è anche disponibile nel download all'indirizzo [1] e si seguano le istruzioni sullo schermo.
Conclusioni
La particolarità del lettore di dati bus I2C descritto nell'articolo è la sua capacità di leggere i dati finché è necessario, cioè per un tempo illimitato . Questo consente di rilevare errori che si verificano raramente.
Web link
[1] Articolo: https://www.elektormagazine.com/magazine/elektor-88/42454