Table of Contents
Introduzione a I2C e SPI con microcontroller PIC
I microcontrollori della famiglia PIC di Microchip sono ampiamente utilizzati nei sistemi incorporati, dai semplici nodi dei sensori ai controller industriali complessi. Una chiave per qualsiasi sviluppatore incorporato è la capacità di interfacciare le periferiche utilizzando protocolli di comunicazione seriale. Due dei più comuni sono I2C (Inter‐Integrated Circuit) e SPI (Serial Peripheral Interface).
Questo articolo fornisce una guida pratica e approfondita per implementare I2C e SPI sui microcontroller PIC. Copriremo l'installazione hardware, la configurazione del registro, le sequenze di codice tipiche e le tecniche di debug comuni.
Panoramica di I2C e SPI
Entrambi i protocolli sono bus seriali sincroni, ma differiscono in architettura, velocità e applicazione.
I2C (Inter‐Integrated Circuit)
I2C utilizza solo due fili: SDA] (Dati seriali) e SCL (Serial Clock). Ogni dispositivo sull'autobus ha un indirizzo unico a 7 bit o 10 bit, e la comunicazione è master-slave. Il master genera l'orologio e avvia le transazioni.
Poiché sono necessari solo due fili, I2C salva i perni I/O, rendendolo attraente per i piccoli PIC. Tuttavia, il protocollo è più complesso di SPI a causa di indirizzare, riconoscere i bit e l'allungamento dell'orologio.
SPI (interfaccia periferica seriale)
SPI-Sput-Tourt: ] MSI (Master Out Slave In), MISO (Master In Slave Out), SCLK (Serial Clock), e SS
SPI è più semplice da implementare in hardware ma richiede più pin – una linea SS dedicata per slave. Molti microcontrollori PIC includono un modulo dedicato Master Synchronous Serial Port (MSSP) che può essere configurato per I2C o SPI.
Considerazioni hardware per I2C e SPI
Prima di immergersi in codice, devi avere il giusto hardware.
I resistori di sollevamento:[] Le linee di I2C sono a profilo aperto; richiedono resistenze esterne di pull-up (di solito 4.7 kΩ a 10 kΩ) per tirare SDA e SCL a VDD[]]. Il valore dipende dalla capacità di bus e dalla velocità necessaria per i valori di salita più lunghi o di velocità.
Livelli di tensione:[] Assicurare che il PIC e la periferica funzionino con la stessa tensione logica (ad esempio, 3.3 V o 5 V). Se differiscono, utilizzare i turnisti di livello come il [SparkFun BOB‐12009]] o un semplice circuito MOSFET.
Acquista la lunghezza e il carico capacitivo: Per i fili più lunghi (sopra alcuni pollici), mantenere la capacità del bus sotto il massimo specificato nella scheda dati PIC ([PIC16F1xxx datasheet[]] spesso afferma 400 pFFFFF per I2C).Per SPI, le linee più lunghe possono causare riflessi dei segnali di scherm;
Condensatori di decoupling: Posizionare i condensatori di 0,1 μF vicino ai perni di alimentazione di ogni IC per sopprimere il rumore che può corrompere i dati.
Configurazione di I2C su microcontrollori PIC
La maggior parte dei PIC moderni includono il modulo Master Synchronous Serial Port (MSSP)[] che supporta sia I2C che SPI. Ci concentreremo sulla MSSP in modalità master I2C per un PIC a 8 bit tipico (ad esempio, PIC16F18877).
Registrazioni chiave per I2C
- SSPxADD[[] – Valore di ricarica del generatore di frequenza di Baud. La frequenza dell'orologio I2C deriva dall'orologio di sistema utilizzando una formula: F[]SCL = F]]OSC[] / (4 * (SSPxADHz + 1) 16] per 100 kDHz]
- SSPxSTAT[] – Registrazione di stato. I bit indicano collisione di autobus, collisione di scrittura e se è stata rilevata una condizione di avvio/arresto.
- SSPxCON1[ – Control Register 1. Seleziona la modalità I2C (master, slave) e abilita il modulo.
- SSPxCON2[] – Controllo della modalità Master. Comandi per l'invio di Start, Riavvia, Stop e riconoscimento.
- SSPxBUF[] – Data buffer. Scrivi per inviare, leggere per ricevere.
Sequenza di inizializzazione master I2C
- Disattivare il modulo MSSP cancellando il bit SSPEN (SSPxCON1<5>).
- Impostare la modalità master I2C (tipicamente 0x08 in bit SSPxCON1 <3:0>).
- Configurare il tasso di baud caricando SSPxADD con il valore corretto.
- Impostare i pin SDA e SCL come input con pull-up deboli (o utilizzare resistenze esterne).
- Abilitare il modulo impostando SSPEN.
- Attivare a scelta interrotti per il MSSP.
Esempio: lettura da un sensore di temperatura LM75
L'LM75 ha un indirizzo a 7 bit (tipicamente 0x48 per i pin A0‐A2 a terra). Per leggere il registro di temperatura (punto 0x00), è necessario prima scrivere il puntatore, poi generare un'avvio e una lettura ripetuti.
]]Sequenza di puntatore di scrittura: Inizia → indirizzo byte (0x90) → aspettare ACK → puntatore byte (0x00) → aspettare ACK → Stop.
]][FACK:5]]Leggi la sequenza di temperatura:] Inizio →
Ogni scambio di byte richiede l'inquinare il registro SSPxSTAT per il bit BF (Buffer Full) e la bandiera di SSPxIF interrompe.Un errore comune si dimentica di inviare il ACK/NACK dopo aver ricevuto i dati.
Pitfalls comuni di I2C
- Cloccare stretching:[[] Alcuni schiavi tengono SCL basso per rallentare il master. Abilitare il supporto di allungamento dell'orologio nel MSSP (impostare il ]CKP[ bit appropriatamente).
- Bus collision:[] Se un altro padrone cerca di guidare l'autobus, il MSSP imposta la bandiera BCLIF.
- Brucca bus:[] Se uno schiavo non rilascia SDA dopo una trasmissione, l'autobus può appendere.Attuazione di un timeout che invia nove impulsi di orologio per recuperare.
Configurazione SPI su microcontrollori PIC
Il MSSP può anche operare in modalità master SPI o slave. Copriamo la modalità master, che è più comune.
Registrazione chiave per SPI
- SPIxBRG[[] – Generatore di frequenza di Baud. Per SPI, la frequenza di clock è F[OSC[] / (2 * (SPIxBRG + 1).
- SPIxSTAT[] – Registrazione di stato. Contiene il bit BF, collisione di scrittura, ricevere le bandiere di troppopieno.
- SPIxCON1[[] – Controllo del registro 1. Seleziona master/slave, polarità dell'orologio (CKP), fase dell'orologio (CKE), e punto del campione (SMP).
- SPIxCON2[ – Controllo aggiuntivo (ad esempio, modalità frame, abilitare SS2).
- SPIxBUF[[] – buffer dati per la trasmissione e la ricezione (buffered).
Sequenza di inizializzazione del master SPI
- Disattivare il modulo SPI (SSPEN chiaro).
- Impostare la polarità e la fase desiderata dell'orologio. Mode 0 (CKP=0, CKE=1) è il più comune: i dati vengono campionati sul bordo in salita e spostati sul bordo in caduta.
- Configurare la velocità di baud in SPIxBRG. Per 1 MHz con un orologio 16 MHz, SPIxBRG = 7.
- Selezionare la modalità master (SSPM bit = 0b0000 per SPI master, clock = FOSC/4).
- Per la selezione degli schiavi, è necessario attivare un pin GPIO separato collegato al chip-select dello schiavo.
- Abilita' il modulo.
Esempio: Interfaccia con un ADC 8 canali MCP3008
Il MCP3008 è un ADC a 10 bit che comunica tramite SPI in modalità 0. Per leggere un canale (ad esempio, canale 0), il master invia tre byte: un bit di partenza, un bit single-ended/differenziale e l'indirizzo del canale. Lo schiavo restituisce simultaneamente due byte di dati.
[LT][FLT]][[FLT]]]]][[FLT]]]]] 1. Guidare la SS bassa.[
2. Scrivere 0x01 (punto di partenza) a SPIxBUF – attendere che la conversione BF sia chiara
3. Scrivere (cancellare il bit 0x80) a SPIxBUF
Si noti che ogni scrittura a SPIxBUF attiva una ricezione simultanea. È necessario leggere il buffer dopo ogni scrittura per evitare il trabocco.
Gestione di slave SPI multipli
Ogni slave richiede un unico perno di chip-select. Usa un GPIO per slave. Assicurarsi che vi sia un piccolo ritardo tra il cambio del pin SS e l'avvio dell'orologio per soddisfare i requisiti di tempo di configurazione dello schiavo. Molti PIC consentono di utilizzare il pin hardware SS per la generazione automatica di slave solo in modalità slave; in modalità master è necessario farlo manualmente.
Debug I2C e comunicazione SPI
Quando le cose non funzionano, seguire un approccio metodologico:
- Utilizza un analizzatore di logica o un oscilloscopio. Questo è il singolo strumento di debug più efficace. Controlla che l'orologio è presente, si verificano transizioni di dati e gli indirizzi sono corretti. Per I2C, verifica le condizioni di avvio/arresto e riconosce i bit.
- Controllare resistenze pull-up. Se SDA o SCL rimangono a basso, si può avere un dispositivo che tiene l'autobus. Scollegare tutti gli schiavi tranne uno e riprovare.
- Verificare la frequenza di baud.[] Misurare il segnale dell'orologio con un campo di applicazione. Per I2C, la frequenza dell'orologio deve essere all'interno delle specifiche dello schiavo.
- Esaminare l'indirizzo e i byte di comando.
- Per SPI, controllare polarità e fase dell'orologio.[ Molti schiavi sono sensibili alla modalità esatta. Consultare la scheda dati dello schiavo. Assicurarsi inoltre che la linea di selezione del chip sia attiva a basso e guidata di conseguenza.
Se il debug hardware rivela le forme d'onda corrette, il problema può essere nel firmware. Utilizzare i LED debug o una console seriale per stampare i registri di stato. Molte schede di sviluppo PIC includono un programmatore/debugger di bordo (ad esempio, MPLAB PICkit 4) che può aiutarti a passare attraverso il codice.
Software Bit‐Banging come un backup
Se la periferica hardware non è disponibile o se è necessario utilizzare un PIC che non ha un MSSP, è possibile implementare I2C o SPI in software utilizzando pin GPIO. Per I2C bit-banging, si attiva SDA e SCL direttamente, rispettando i ritardi di tempo. Per SPI, si spostano i bit attraverso un GPIO e si leggono simultaneamente il pin di ingresso. Bit-banging è flessibile ma consuma i cicli di CPU e si impara in modo lento.
Argomenti avanzati
Tuning multi-Master e velocità dell'orologio I2C
Quando più master condividono l'autobus, è necessario gestire con attenzione l'arbitrato. Il MSSP in PIC supporta la modalità multi-master; monitora l'autobus e rilinquish controllo se un altro padrone invia i dati.
Per un controllo più veloce del livello I2C (ad esempio, 400 kHz), abilitare il controllo del livello di pressione sui perni di uscita (se disponibili) e utilizzare resistenze pull-up più forti (ad esempio, 2.2 kΩ). Alcuni PIC hanno un apposito SSPxADD] che può essere impostato su valori più piccoli dello zero utilizzando un prescaler.
SPI Daisy-Chaining e DMA
Alcuni dispositivi SPI supportano la distribuzione di margheriti, dove l'uscita di dati (MISO) di un dispositivo alimenta l'ingresso (MOSI) del successivo, permettendo a più slave di una singola linea di selezione chip.
Per SPI ad alta velocità, prendere in considerazione l’utilizzo del controller di accesso diretto alla memoria PIC (DMA) (disponibile su molti PIC più recenti). DMA può trasferire i dati da/per il buffer SPI senza intervento della CPU, liberando il core per altre attività. La periferica DMA è configurata con sorgente, destinazione e conteggio, quindi attivata dall’interruzione SPI.
Conclusioni
I2C e SPI sono strumenti essenziali in qualsiasi kit di progettisti incorporati. Con il modulo MSSP flessibile trovato nella maggior parte dei microcontrollori PIC, l'implementazione di questi protocolli è semplice una volta che si capisce i parametri di configurazione del registro e di tempismo.
I fogli di dati rimangono il vostro migliore amico: Microchip Schede di dati ufficiali[] fornire mappe e diagrammi di registro esatti. Note di applicazione come AN734 (I2C suggerimenti) e [PILT:4]]AN1009] (SPI progetti di fiducia in rapida) sono risorse di valore.