Cos'è l'interfaccia SPI a 4 fili. Come lavorare con SPI - Teoria. Diagramma temporale del segnale

Oggi iniziamo la nostra conoscenza con il pneumatico SPI (interfaccia periferica seriale).

Questo bus è molto utilizzato nell'elettronica. È molto conveniente, essendo sincrono e full duplex, quindi viene utilizzato in molti circuiti per la comunicazione tra vari dispositivi digitali: sensori, controller, driver e altri dispositivi.

Un altro fattore importante nella necessità di conoscerlo è che questo bus è organizzato hardware in controller AVR.

Inoltre, che lo vogliamo o no, comunichiamo con l'interfaccia SPI da molto tempo, non appena abbiamo iniziato a eseguire il flashing del nostro controller per la prima volta, poiché viene flashato tramite questa interfaccia.

Pertanto, vorrei conoscere meglio questo pneumatico.

Apriamo la documentazione tecnica del controller Atmega8, apriamo la pagina dove è mostrata la piedinatura di questo controller e vediamo che dai pin 16 al 19 ci sono i pin del bus SPI

Ora qualcosa in più su questi risultati

SS (selezione del chip)— questa è la fase di selezione del dispositivo. Se il dispositivo slave su questo pin diventa basso, allora questo dispositivo risponderà e scambierà informazioni tramite il bus SPI; se è alto, non lo farà.

MOSI (uscita master, ingresso slave)- Questo è il pin di uscita del dispositivo master e l'ingresso del dispositivo slave.

MISO (ingresso master, uscita slave)- al contrario, l'uscita dello slave, l'ingresso del master.

SCK— gamba di sincronizzazione. Tutti i dispositivi che partecipano allo scambio di informazioni su questo bus ricevono impulsi di clock ad una determinata frequenza.

Ecco uno schema dell'implementazione del bus SPI nel controller Atmega8

Come ogni autobus, esistono numerosi registri che memorizzano determinate informazioni.

A noi interessa il REGISTRO A TURNI, attraverso di esso si scambiano informazioni. Non appena sul pin di sincronizzazione si trova un certo fronte, discendente o ascendente, a seconda delle impostazioni, questi registri dei dispositivi slave e master si scambieranno informazioni, e non tutte le informazioni, ma solo un bit. Questi registri si sposteranno a sinistra ed i bit più significativi di ciascun registro andranno ai bit meno significativi dello stesso registro del dispositivo associato. Cioè, lo slave trasmetterà il suo bit più significativo attraverso il pin MOSI al leader, che lo scriverà nel bit di ordine basso lasciato libero a causa dello spostamento a sinistra, e lo slave trasferirà il suo bit di ordine alto spostato attraverso il MISO fissare al bit di ordine inferiore della direttrice. Ecco come avviene lo scambio, cioè in 8 cicli di clock completi si scambieranno completamente i byte

Non appena vengono trasmessi tutti gli 8 bit di un byte di informazioni, un determinato registro ce lo segnalerà questo processo finito. O meglio, un certo pezzo di un certo registro.

Sempre nello schema a blocchi vediamo un divisore, il cui ingresso riceve impulsi di clock e poi divisi per un certo valore, vengono inviati attraverso una catena alla gamba SCK e da lì vengono forniti al dispositivo slave sulla stessa gamba. Ciò garantisce il funzionamento sincronizzato dei dispositivi. La frequenza dell'orologio viene selezionata tra quella più bassa supportata da tutti i dispositivi partecipanti allo scambio.

Dico plurale perché possono esserci più di due dispositivi su un dato circuito. Come ciò viene garantito, a condizione che i dispositivi non abbiano indirizzi, te lo dirò ora.

Esistono diversi modi per scambiare informazioni tra più dispositivi, ovvero quando ci sono più slave per un dispositivo master. Ne esamineremo i due più comuni.

Il primo metodo è radiale (clicca sulla foto per ingrandire l'immagine)

Qui il master indirizza i dati ad un dispositivo specifico, attivando lo 0 logico sul pin SS. Con questo metodo è possibile selezionare un solo dispositivo inoltre saranno necessari più pin liberi delle porte del controller;

Esiste un altro metodo interessante: anello o cascata (clicca sull'immagine per ingrandirla)

Qui vediamo che le gambe di selezione sono tutte parallele e lo scambio avviene in cerchio. Pertanto, la velocità diminuisce a causa del fatto che il cerchio di trasmissione aumenta, ma le gambe portuali vengono salvate.

Studieremo tutto questo più in dettaglio nelle prossime lezioni, quando utilizzeremo alcuni dispositivi nei nostri progetti.

Ebbene, sembra con il circuito di trasmissione dei dati tramite il bus SPI l'abbiamo capito.

Ora scopriamo come controllare questo processo a livello dei registri hardware del controller AVR.

Vediamo questi registri nello schema a blocchi sopra nella pagina.

Atmega8 ha i seguenti registri per la manutenzione del bus SPI.

SPDR (registro dati SPI)- registro dati, nello schema a blocchi è DATA BUFFER. Inseriremo un byte in questo registro per la sua successiva trasmissione al dispositivo slave e da esso leggeremo il byte di informazioni proveniente dal dispositivo slave. Inoltre, non è necessario che il nostro controller sia il dispositivo principale. Successivamente assembleremo un circuito di due controller, uno dei quali sarà slave. Quindi è in questo registro che verrà posizionato il byte sia per l'invio che per la ricezione.

SPCR (registro di controllo SPI)- registro di controllo

Questo registro include i seguenti bit:

SPIE (abilitazione interruzione SPI)- un bit che abilita gli interrupt.

SPE (abilita SPI)— un bit che abilita il bus SPI.

DORD (Ordine dati)— un bit che imposta l'ordine in cui i bit vengono inviati. Se è impostato su 1, viene inviato per primo il bit meno significativo, se è impostato su 0, viene inviato il bit più significativo.

MSTR (selezione master/slave)— un bit che designa un dispositivo come master o slave. Quando questo bit è impostato su 1, il dispositivo sarà il master.

CPOL (polarità dell'orologio)— polarità di sincronizzazione, determina a quale fronte dell'impulso di sincronizzazione verrà avviata la modalità standby

Se questo bit è 1, avremo una modalità standby con un fronte ascendente e, se è 0, con un fronte discendente.

CPHA (fase orologio)— un bit responsabile della fase di clock, ovvero su quale fronte verrà trasmesso il bit.

Diamo un'occhiata ai diagrammi di trasferimento dati a seconda dell'installazione di CPOL e CPHA

Questa è una dipendenza davvero interessante. A volte a volte vediamo dentro specifiche tecniche di qualsiasi dispositivo che, ad esempio, può funzionare in modalità SPI 0:0 e SPI 1:1, questo è proprio ciò che riguarda l'impostazione di questi bit.

SPR1, SPR0 (selezione frequenza orologio SPI)- sono i bit responsabili del valore del divisore di frequenza di sincronizzazione e lavorano insieme al bit; SPI2X situato nel registro di stato. È anche di controllo, poiché otto bit nel registro di controllo non erano sufficienti per tutte le impostazioni e ce ne sono molti liberi nel registro di stato.

SPSR (registro di stato SPI)- registro di stato

SPI2X (Bit di velocità Doppio SPI)- un bit che raddoppia la velocità, lavorando in combinazione con i bit SPR1 e SPR0 del registro di controllo.

Vediamo la dipendenza della frequenza da questi tre bit

SPIF (flag di interruzione SPI)— Flag di interruzione. Stiamo aspettando che questo bit venga impostato su uno. quando riceviamo un byte. Non appena il byte di un altro dispositivo apparirà completamente nel nostro buffer, questo flag verrà impostato. Questo flag funziona solo se è impostato il bit che abilita gli interrupt, così come sono abilitati gli interrupt globali.

WCOL (Scrivi flag COLlision)— il flag di conflitto o collisione verrà impostato se si verifica un conflitto di bit durante il trasferimento dei dati, se durante il trasferimento dei dati si tenta di scrivere nel registro dati.

Bene, ora possiamo dire che abbiamo acquisito un po' di familiarità con l'interfaccia SPI.

Guarda il VIDEO TUTORIAL(clicca sull'immagine)

Visualizzazioni dei post: 6.294

SPI(Bus periferico seriale) - protocollo di scambio periferica seriale. Questo piercing è stato sviluppato da Motorola, ma è attualmente utilizzato da molti produttori. È progettato per collegare i microcontrollori tra loro e con tutti i tipi di periferiche: sensori, ADC, chip di memoria, orologi. Ma rimane ancora l'uso più comune SPI- Si tratta di scrivere un programma nella memoria del microcontrollore. Nei microcontrollori AVR con l'aiuto SPI puoi eseguire il flashing del microcontrollore senza dissaldarlo dalla scheda, viene chiamato questo metodo di flashing ISP (nella programmazione del sistema). Nonostante i nomi SPI E ISP molto consonanti, non sono la stessa cosa, in AVRSPI utilizzato come strato fisico ISP, cioè vengono utilizzate le linee SPI per il trasferimento dei dati, ma il protocollo stesso (a livello software) è diverso.

Per trasmettere i dati a SPI vengono utilizzate tre linee:

MISO (ingresso principale, uscita secondaria)– tramite questa linea il Master (master) riceve i dati dallo Slave (slave).

MOSI (ingresso slave di uscita principale)– il Master invia i dati allo Slave tramite questa linea.

SCK(Orologio seriale)– serve a trasmettere un segnale di clock al dispositivo slave.

Viene utilizzata anche la linea SS(Selezione slave), che definisce il dispositivo con cui Maestro scambieranno i dati.

Dato che molti produttori utilizzano SPI nei propri dispositivi, i nomi dei pin potrebbero differire leggermente. Di seguito è riportata una tabella con nomi alternativi.


Esistono due tipi di SPI: hardware e software. Quando si implementa il software SPI, dobbiamo impostare manualmente il segnale sulle gambe del corrispondente MISO, MOSI, SS mentre tira SCK. Con implementazione hardware SPI trasferiamo i dati in un registro speciale e il microcontrollore stesso esegue le manipolazioni sopra descritte, secondo le impostazioni preliminari.

Implementazione fisica SPI, rappresenta due registri a scorrimento collegati tra loro.


A seconda del livello del segnale logico SCK, viene eseguita la sincronizzazione Maestro E Schiavo e su quale fronte i dati vengono catturati e spostati, sono possibili 4 modalità SPI.

  • CPOL = 0 - il segnale di sincronizzazione inizia a livello basso;
  • CPOL = 1 - il segnale di sincronizzazione inizia a livello alto;
  • CPHA = 0 - i dati vengono campionati sul fronte di salita del segnale di sincronizzazione;
  • CPHA = 1: i dati vengono campionati sul fronte di discesa del segnale di sincronizzazione.
Gli oscillogrammi seguenti mostrano l'aspetto del pacco 0x17 nelle diverse modalità.
CPOL = 0 CPH = 0


CPOL = 1 CPH = 0


CPOL = 0 CPH = 1


CPOL = 1 CPH = 1

SPI- interfaccia sincrona, cioè per ricevere alcuni dati da Schiavo, Maestro dovrebbe inviare qualcosa. Tutto sembra chiaro, ma cosa succederebbe se? Maestro invia un byte e Schiavo dovrei restituirgliene due? In questo caso il Master dovrebbe inviargli qualcosa 2 volte, ad esempio 0x00.
//invia il comando, la risposta dovrebbe essere di due byte Spi_Master_Transmit(chx); //invia qualcosa per ricevere il primo byte Spi_Master_Transmit(0X00); tocco_x = SPDR; tocca_x<<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
Questo è tutto, l'esempio di codice sopra è tratto da un progetto funzionante.

Interfaccia periferica seriale O SPI- interfaccia periferica seriale, utilizzata per la comunicazione tra periferiche e microcontrollore. Ad esempio la periferica potrebbe essere: display, vari sensori, memoria FLASH, scheda SD (sì, sì, la scheda SD o "unità flash" utilizzata nei telefoni e nelle fotocamere comunica con mondo esterno utilizzando l'interfaccia SPI), ecc.

Sfortunatamente non esiste documentazione ufficiale per l'interfaccia SPI, quindi questo post si basa su vari articoli su Internet, sulla mia esperienza e sulla documentazione per i microcontrollori.

Leggi cos'è SPI negli articoli di Wikipedia

IN SPI C'è sempre un master e uno/più slave.

Il trasferimento dei dati viene sempre avviato dal master.

SPI utilizza quattro linee di comunicazione:

  • MOSI O S.I.- uscita master, ingresso slave (inglese) MaestroFuoriSchiavoIn). Serve per trasferire i dati dal dispositivo master allo slave.
  • MISO O COSÌ- ingresso master, uscita slave (inglese) MaestroInSchiavoFuori). Serve per trasferire i dati da un dispositivo slave a un dispositivo master.
  • SCLC O SCK- segnale orologio seriale SerialeOrologio). Serve per trasmettere un segnale di clock per i dispositivi slave.
  • C.S. O SS- scelta del microcircuito, scelta dello slave (eng. Selezione chip, selezione slave).

PS Per garantire una comunicazione unidirezionale con un dispositivo, è sufficiente utilizzarlo SCLC, MOSI(nel caso in cui il dispositivo slave riceva solo) o SCLC, MISO(nel caso in cui il dispositivo slave non riceva nulla, ma trasmette solo informazioni). All'entrata C.S. il dispositivo slave deve essere impostato su logico zero, altrimenti lo schiavo non funzionerà.

PS Se il dispositivo slave trasmette e riceve sia, puoi limitarti a tre fili: MISO, MOSI, SCLC, all'entrata C.S. Anche il dispositivo slave deve impostare la logica zero.

SPI può essere implementato in un microcontrollore hardware, quindi il compito di gestire l'interfaccia viene risolto separatamente per ciascun microcontrollore, perché le implementazioni possono variare. Ad esempio, per ATmega328Р(microcontrollore di Atmel) quando si lavora con SPI dobbiamo installarlo a livello di codice SS logico zero A inizio della ricezione/trasmissione e impostare logico unità torna a fine della trasmissione.

Per trasferire i dati su un dispositivo slave, è necessario registro a scorrimento MASTER (nell’immagine il registro a scorrimento del master è “ REGISTRO A SPOSTAMENTO A 8 BIT") scrivere byte di informazioni trasmesse. Allo stesso tempo, automaticamente SCK inizierà a generare segnale dell'orologio. Questa è l'implementazione dell'hardware.

Se non è presente supporto hardware per SPI nel microcontrollore, l'interfaccia SPI può sempre essere implementato nel software, cioè. creare un programma che controlla le gambe del controller secondo il protocollo di scambio SP.

Differenze nelle implementazioni dell'interfaccia SPI

I microcircuiti slave possono "interpretare" il segnale ricevuto tramite SPI in modo diverso, la differenza può risiedere nei seguenti punti:

  • nella quantità di dati trasmessi O dimensione del pacchetto, di solito questo 8 bit, ma c'è di più
  • in ordine sparso, All'inizio pezzo più significativo o prima bit meno significativo
  • Di a quale livello del segnale di clock vengono trasmessi i dati?(per unità logica (ALTA) o zero logico (BASSO))
  • Di su quale fronte dell'impulso avviene la sincronizzazione?(salita o discesa), chiamata brevemente “fase di sincronizzazione”

Combinazione " livello del segnale dell'orologio" E " fasi di sincronizzazione» è definito nelle specifiche come Modalità operative SPI. Ci sono solo :

Modalità Livello del segnale (CPOL) Fase (CPHA)
0 0 0
1 0 1
2 1 0
3 1 1

Nella colonna " Livello del segnale» , significa che bit di dati, accettato schiavo quando zero viene trasmesso lungo la linea di sincronizzazione, in altre parole: un dispositivo slave aspetta e non accetta dati quando è acceso SCK impostato su 1 logico.

Nella colonna " Fase» , significa che il segnale di sincronizzazione è determinato da fronte di discesa dell'impulso di clock e logico 0-l Di fronte di salita dell'impulso di clock.

PS Inoltre, se nella colonna “ Livello del segnale» installato , allora il fronte discendente e ascendente se raffigurati nel diagramma sarà “ sottosopra».

Sui grafici, sui dati 4 modalità può essere rappresentato come segue:

Puoi leggere ulteriori informazioni sui principi di funzionamento di SPI nell'articolo

http://www.kit-e.ru/articles/interface/2009_03_53.php

Implementazione di SPI sui microcontrollori ATmega della serie AVR (ATmega328P) e sui “primi” microcontrollori Motorola

In un microcontrollore ATmega328P(microcontrollore della serie Atmel AVR) è possibile controllare quanto segue parametri SPI:

Tre registri vengono utilizzati per configurare e controllare l'interfaccia SPI:

  • Registro di controllo - SPCR
  • Registro di stato - SPSR
  • Registro dati - SPDR

Leggi di più su ciascuno di essi...

Registro di controllo – « SPCR» 0x2C, indirizzo per la registrazione 0x4C

— Unità logica in 7a parte(nome del pezzo SPIE) – abilitare gli interrupt SPI(Si verificherà un'interruzione se è impostato il bit di abilitazione dell'interruzione del registro globale SREG(7° bit)). Una volta completato il trasferimento dei byte, verrà generato un interrupt.

— Unità logica in 6a parte(nome del bit - SPE) - inserire SS, MOSI, MISO E SCK alle porte del microcontrollore ATmega328P - PB2,PB3,PB4,PB5.

— Unità logica in 5a parte(nome del pezzo DORD) – lo determinerà in base a SPI trasmesso per primo grado junior, UN poi il maggiore– Modalità “LSB”. Lo zero logico, invece, significa che viene trasmesso prima il bit più significativo e poi quello meno significativo - modalità “MSB”.

— Unità logica in 4a parte(nome del bit - MSTR) — abilitare la modalità presentatore, zero – abilita la modalità slave

— Unità logica in 3a parte(nome del pezzo CPOL) (polarità del segnale di sincronizzazione o livello di sincronizzazione) – sincronizzazione viene effettuato secondo mancanza di impulso(zero logico) o il segnale dell'orologio nello stato di standby è uguale a 1. Zero logico: la sincronizzazione viene effettuata dalla presenza di un impulso (da uno logico) o il segnale dell'orologio nello stato di standby è uguale a 0. Viene determinato in quale fronte (discendente o ascendente) viene effettuata la sincronizzazione morso ( CPH).

— Unità logica in 2a parte(nome del pezzo CPH) (fase di sincronizzazione) – determina il segnale di sincronizzazione determinato dal fronte di discesa di SCK e zero logico sul fronte di salita SCK. Inoltre, se CPOL è impostato su 1, i fronti discendente e ascendente possono essere rappresentati “capovolti” sul diagramma.

E 0 un po' con un po' SPI2x nel registro SPSR determinare Velocità dati SPI(o velocità di clock tramite SCK). Questi pezzi hanno significato solo per il padrone; per lo schiavo sono privi di significato, perché La velocità di ricezione dipende dalla frequenza SCK del master.

Dove fosc la frequenza di clock dell'oscillatore master SPI (di solito è uguale alla frequenza di clock del processore).

Registro di stato - "SPSR"(indirizzo in ATmega328P per la lettura 0x2D, indirizzo per la registrazione 0x4D, se hai un MK diverso, puoi trovare gli indirizzi nella documentazione)

bit di registro " SPIF": Flag di interruzione SPI

Il bit è impostato unità, Quando trasferimento di byte dati su MOSI ha finito. Se è impostato il bit di abilitazione dell'interruzione SPI (bit SPIE) nel registro SPCR, l'impostazione del flag SPIF provoca la generazione di una richiesta di interruzione.

bit di registro " WCOL": Scrivi il flag COLlisione

Morso scrivere conflitto al registro SPDR. Il bit è impostato unità, se dentro tempo di trasmissione i dati sono in esecuzione tentativo di scrittura V registro dati SPDR.

- Con Di bit – bit riservati, il loro valore è sempre uguale a 0

0 morso " SPI2X": Bit di velocità SPI doppio

Morso " doppia velocità trasmissione dati" Se il bit è scritto unità, Quello velocità trasferimenti i dati sono raddoppiati. Usando una combinazione di questo bit e E 0 morso ( SPR1, SPR0) Registrati SPCR, determinare velocità di trasmissione Dati SPI. .

Registro dati - "SPDR"(indirizzo in ATmega328P per la lettura 0x2E, indirizzo per la registrazione 0x4E, se hai un MK diverso, puoi trovare gli indirizzi nella documentazione)

La dimensione del registro è la stessa di sopra: 8 bit. Questo registro viene utilizzato per trasmettere e leggere i dati tramite SPI. Inserendo i dati al suo interno, avvii il processo di trasferimento.

Diamo un'occhiata a 3 esempi di lavoro con l'interfaccia SPI su ATmega328P in ambienti:

—Arduino

#includere bytex=B11000000; //bitbyte trasmesso y= B00000000; //il bit di ricezione verrà scritto nella variabile y void setup() ( SPI.begin(); /* Inizializzazione SPI */ /* inizializzazione in Arduino questo significa - impostarne uno in SS - impostare sull'uscita SS (Slave Select o selezione slave) - 10 pin - impostare 1 nei seguenti bit del registro di controllo SPCR: nel 4° bit (nome bit - MSTR) - abilitare la modalità master nel 6° bit (nome bit - SPE) - collegare SS, MOSI, MISO e SCK alle porte PB4,PB5,PB6,PB7 (10,11,12,13 pin in Arduino) - configurare i seguenti pin di uscita: SCK (Serial Clock o segnale di clock) - MOSI a 13 pin (Master Out Slave In o dati da master) - 11 pin A seguito dell'inizializzazione tramite SPI.begin(), la configurazione dell'interfaccia SPI è la seguente: - l'ordine dei bit “MSB”, cioè viene trasmesso prima il bit più significativo e poi quello quello meno significativo - la sincronizzazione viene effettuata dalla presenza di un impulso o di un segnale di clock nello stato wait è 0 - il segnale di sincronizzazione è determinato dal fronte di salita di SCK (due punti sopra indicano che la modalità SPI in questo caso è 0 ) - baud rate fosc/4 */ // POSSIAMO REINIZIALIZZARE ALCUNI PARAMETRI DI COMUNICAZIONE SPI noi stessi // ordinare sequenze di bit //SPI.setBitOrder(MSBFIRST); /* LSBFIRST - prima junior, poi senior MSBFIRST - prima senior, poi junior (valore predefinito da SPI.begin) */ // frequenza di scambio dati //SPI.setClockDivider(SPI_CLOCK_DIV4); /* è definito come il rapporto tra fosc e il coefficiente, i cui valori possibili sono: SPI_CLOCK_DIV2 SPI_CLOCK_DIV4 SPI_CLOCK_DIV8 SPI_CLOCK_DIV16 SPI_CLOCK_DIV32 SPI_CLOCK_DIV64 SPI_CLOCK_DIV128 */ //Modalità operativa SPI //SPI.setDataMode(SPI_MODE0); /* SPI_MODE0 - modalità zero SPI_MODE1 - prima modalità SPI_MODE2 - seconda modalità SPI_MODE3 - terza modalità */ ) void loop() ( /* IMPLEMENTAZIONE DEL TRASFERIMENTO DATI TRAMITE SPI */ digitalWrite(10, HIGH); /* dobbiamo impostare it noi stessi in SS 1-tsu */ y=SPI.transfer(x); /* trasmettendo un argomento bit per bit (byte) e ricevendo una risposta dal dispositivo slave, il trasferimento viene effettuato assegnando il valore del byte al registro SPDR e in questo momento automaticamente a SCK (13 pin) viene generato un segnale di clock */ digitalWrite(10, LOW); /* dobbiamo impostare SS su 0 */ SPI.end( /* si disconnette). il bus SPI dai pin 10,11,12,13 */ /* Cioè imposta da 0 al 6° bit (SPE) del registro SPCR */ )

#includere

byte x = B11000000 ; //bit trasmesso

byte y = B00000000 ; //il bit di ricezione verrà scritto nella variabile y

configurazione nulla() (

SPI. inizio(); /* Inizializzazione SPI */

/* inizializzazione in Arduino questo significa

Imposta l'unità su SS

Impostato su uscita SS (Slave Select o selezione slave) - 10 pin

Impostare i seguenti bit del registro di controllo SPCR su 1:

Nel 4° bit (nome bit - MSTR) - abilita la modalità master

B 6° bit (nome bit - SPE) - connetti

SS, MOSI, MISO e SCK

Alle porte PB4,PB5,PB6,PB7

(10,11,12,13 pin in Arduino)

Configura i seguenti pin di uscita:

SCK (orologio seriale o segnale orologio) - 13 pin

MOSI (Master Out Slave In o dati dal master) - 11 pin

Come risultato dell'inizializzazione tramite SPI.begin()

La nostra configurazione dell'interfaccia SPI è la seguente:

L'ordine dei bit è "MSB", cioè Viene trasmessa prima la cifra più significativa e poi quella meno significativa

La sincronizzazione si basa sulla presenza di un impulso

Oppure il segnale dell'orologio nello stato inattivo è 0

Il segnale di clock è determinato dal fronte di salita di SCK

(i due punti sopra indicano che la modalità SPI in questo caso è 0)

Baud rate fosc/4

// POSSIAMO REINIZIALIZZARE ALCUNI PARAMETRI DI COMUNICAZIONE SPI noi stessi

// ordine dei bit

//SPI.setBitOrder(MSBFIRST);

// frequenza di scambio dati

//SPI.setClockDivider(SPI_CLOCK_DIV4);

/* definita come una relazione

Fosc ad un coefficiente i cui possibili valori sono:

SPI_CLOCK_DIV2

SPI_CLOCK_DIV4

SPI_CLOCK_DIV8

SPI_CLOCK_DIV16

SPI_CLOCK_DIV32

SPI_CLOCK_DIV64

SPI_CLOCK_DIV128

//Modalità operativa SPI

//SPI.setDataMode(SPI_MODE0);

SPI_MODE0: modalità zero

SPI_MODE1 - prima modalità

SPI_MODE2 - seconda modalità

SPI_MODE3 - terza modalità

ciclo vuoto()

/* IMPLEMENTAZIONE DEL TRASFERIMENTO DATI TRAMITE SPI */

scrittura digitale(10, ALTA); /* dobbiamo installare noi stessi 1-tsu in SS */

y =SPI. trasferimento(x); /* trasmette un argomento bit a bit (byte) e riceve una risposta dal dispositivo slave

Il trasferimento viene effettuato assegnando al registro SPDR il valore del byte

E in questo momento automaticamente su SCK (13 pin)

Viene generato un segnale di clock */

scrittura digitale(10, BASSO); /* dobbiamo impostare SS a 0 */

SPI. FINE(); /* disabilita il bus SPI dai pin 10,11,12,13 */

/* Questo è imposta da 0 al bit 6 (SPE) del registro SPCR */

-Atmel Studio (AVR GCC)

#includere #includere void init_spi() ( DDRB=(1<

#includere

#includere

void init_spi() (

DDRB = (1<< PB0 ) | (1 << PB1 ) | (1 << PB2 ) | (0 << PB3 ) ;

//configura i pin per SPI (SS, SCK, MOSI - uscita, ingresso MOSI)

// Inizializzazione SPI

// Tipo SPI: Master

// Frequenza di clock SPI: 2000.000 kHz

// Fase orologio SPI: inizio ciclo

// Polarità dell'orologio SPI: bassa

// Ordine dati SPI: prima MSB

SPCR = (0<< SPIE ) | (1 << SPE ) | (0 << DORD ) | (1 << MSTR ) | (0 << CPOL ) | (0 << CPHA ) | (1 << SPR1 ) | (1 << SPR0 ) ;

Interfacce di trasferimento.

Sono state sviluppate molte interfacce di trasferimento dati per trasferire dati da un dispositivo a un altro o da un chip a un altro. Ogni interfaccia ha lati positivi e negativi, quindi è necessario sapere quali interfacce esistono, i loro pro e contro e utilizzare l'interfaccia giusta per trasferire i dati in una determinata situazione.

Le interfacce sono dotate di trasferimento dati asincrono e sincrono. Con la trasmissione dati sincrona, un segnale di clock viene trasmesso simultaneamente ai dati, consentendo la sincronizzazione del ricevitore e del trasmettitore. Un esempio di tale protocollo è l'interfaccia SPI.

Nella trasmissione dati asincrona non c'è segnale di clock. In tali linee esiste il pericolo di una mancata corrispondenza tra ricevitore e trasmettitore, per cui ulteriori dati non verranno ricevuti correttamente. Per evitare ciò, le interfacce asincrone eseguono la sincronizzazione periodica lungo le linee dati. Il vantaggio di tali interfacce è il minor numero di conduttori necessari per la trasmissione.

Diamo uno sguardo più da vicino ad alcune delle interfacce più popolari.

Interfaccia USART.

L'interfaccia USART è un ricetrasmettitore sincrono-asincrono seriale universale. I dati vengono trasferiti all'USART a intervalli regolari. Questo periodo di tempo è determinato dalla velocità USART specificata ed è specificato in baud (per i caratteri che possono assumere solo valori pari a zero o uno, baud equivale a bit al secondo). Esiste una gamma generalmente accettata di velocità standard: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 baud.

Oltre ai bit di dati, l'USART inserisce automaticamente nel flusso segni di sincronizzazione, i cosiddetti bit di inizio e di fine. Alla ricezione, questi bit extra vengono rimossi. In genere, i bit di inizio e di fine separano un byte di informazioni (8 bit), ma esistono implementazioni USART che consentono la trasmissione di 5, 6, 7, 8 o 9 bit. I bit separati dai segnali di avvio e arresto rappresentano l'invio minimo. USART consente di inserire due bit di stop durante la trasmissione per ridurre la probabilità di desincronizzazione del ricevitore e del trasmettitore nel traffico intenso. Il ricevitore ignora il secondo bit di stop, trattandolo come una breve pausa sulla linea.

La convenzione è che lo stato passivo (in assenza di dati) dell'ingresso e dell'uscita USART è un "1" logico. Il bit di inizio è sempre uno "0" logico, quindi il ricevitore USART attende una transizione da "1" a "0" e conta da esso un intervallo di tempo pari alla metà della durata del bit (la metà della trasmissione del bit di inizio) . Se in questo momento l'input è ancora "0", inizia il processo di ricezione del pacco minimo. Per fare ciò, il ricevitore conta 9 durate di bit di seguito (per dati a 8 bit) e registra lo stato dell'ingresso in ogni momento. I primi 8 valori sono dati ricevuti, l'ultimo valore è un valore di test (bit di stop). Il valore del bit di stop è sempre “1” se il valore effettivo ricevuto è diverso, l'USART registra un errore.

Per formare intervalli di tempo, gli USART trasmittenti e riceventi dispongono di una fonte di tempo preciso (clocking). La precisione di questa sorgente deve essere tale che la somma degli errori (ricevitore e trasmettitore) nell'impostazione dell'intervallo di tempo dall'inizio dell'impulso di start alla metà dell'impulso di stop non superi la metà (o meglio ancora almeno un quarto) dell'intervallo di bit. Per un messaggio a 8 bit 0,5/9,5 = 5% (in realtà non più del 3%). Poiché questa è la somma degli errori del ricevitore e del trasmettitore più la possibile distorsione del segnale sulla linea, la tolleranza consigliata per la precisione del clock USART non è superiore all'1,5%.

Poiché i bit di clock occupano parte del flusso di bit, il throughput UART risultante non è uguale alla velocità di connessione. Ad esempio, per le trasmissioni in formato 8-N-1 a 8 bit, i bit di clock occupano il 20% del flusso, che per una velocità fisica di 115.200 baud fornisce una velocità in bit di dati di 92.160 bps o 11.520 byte/s.

Controllo di parità

Il protocollo USART ha la capacità di monitorare automaticamente l'integrità dei dati utilizzando il metodo della parità di bit. Quando questa funzione è abilitata, l'ultimo bit di dati (il "bit di parità") è sempre 1 o 0, in modo che il numero di uno in un byte sia sempre pari.

Controllo del flusso

In passato, i dispositivi USART potevano essere così lenti da non riuscire a tenere il passo con il flusso di dati in entrata. Per risolvere questo problema, i moduli USART sono stati dotati di uscite e ingressi separati per il controllo del flusso. Quando il buffer di ingresso era pieno, la logica dell'USART ricevente impostava il livello di inibizione sull'uscita corrispondente e l'USART trasmittente sospendeva la trasmissione. Successivamente, il controllo del flusso è stato trasferito ai protocolli di comunicazione e la necessità di linee di controllo del flusso separate è gradualmente scomparsa.

Implementazione fisica.

USART è un protocollo di scambio, cioè determina il metodo di formazione dei bit, i parametri di trasmissione dei byte, la velocità di trasmissione, ecc.

Ma l’implementazione fisica di USART potrebbe essere diversa. Ad esempio, per trasmettere dati all'interno di una scheda, i segnali vengono trasmessi ai livelli +5 V e 0 V. Per trasferire dati su lunghe distanze e tra dispositivi, vengono utilizzati altri livelli e standard di tensione fisica, come: loop di corrente (4-20 mA), RS-232 (porta COM), RS-485 e simili.

Per convertire i livelli "controller" di 0-5 V in livelli "standard", esiste un numero enorme di microcircuiti specializzati, ad esempio ADM202 per RS-232.

Interfaccia seriale SPI

Il nome SPI è l'abbreviazione di "Serial Peripheral Bus", che riflette il suo scopo: un bus per il collegamento di dispositivi esterni. Il bus SPI è organizzato secondo il principio master-slave. Il master del bus è solitamente un microcontrollore, ma può anche essere una logica programmabile, un controller DSP o un ASIC. I dispositivi collegati al master sono slave. Il loro ruolo è svolto da vari tipi di microcircuiti, incl. dispositivi di memorizzazione (EEPROM, memoria flash, SRAM), orologio in tempo reale (RTC), ADC/DAC, potenziometri digitali, controller specializzati, ecc.

L'elemento costitutivo principale dell'interfaccia SPI è un registro a scorrimento convenzionale, la cui sincronizzazione e i segnali di ingresso/uscita bitstream formano i segnali di interfaccia. Pertanto, è più corretto chiamare il protocollo SPI non un protocollo di trasferimento dati, ma un protocollo di scambio dati tra due registri a scorrimento, ciascuno dei quali svolge contemporaneamente sia la funzione di ricevitore che di trasmettitore. Il presupposto per la trasmissione dei dati sul bus SPI è la generazione di un segnale di sincronizzazione del bus. Solo il leader ha il diritto di generare questo segnale e il lavoro dello schiavo dipende completamente da questo.

Connessione.

Esistono tre tipi di connessione al bus SPI, ciascuno dei quali coinvolge quattro segnali. Lo scopo dei segnali SPI è descritto nella Tabella 7.1.

La connessione più semplice, che coinvolge solo due microcircuiti, è mostrata nella Figura 7.2. Qui, il master del bus trasmette i dati lungo la linea MOSI in modo sincrono con il segnale SCLK da esso generato e lo slave cattura i bit di dati trasmessi su determinati fronti del segnale di sincronizzazione ricevuto. Contemporaneamente lo slave invia il suo pacchetto dati. Il circuito presentato può essere semplificato eliminando la linea MISO nel caso in cui l'IC slave utilizzato non preveda la trasmissione dei dati di risposta o non ce ne sia necessità. Il trasferimento dati unidirezionale può essere trovato in chip come DAC, potenziometri digitali, amplificatori e driver programmabili. Pertanto, l'opzione considerata per il collegamento di un IC slave richiede 3 o 4 linee di comunicazione.

Affinché l'IC slave possa ricevere e trasmettere dati, oltre ad avere un segnale di clock, anche la linea SS deve essere abbassata. Altrimenti, l'IC slave sarà inattivo. Quando viene utilizzato un solo circuito integrato esterno, si potrebbe essere tentati di eliminare la linea SS portando l'ingresso selezionato del circuito integrato slave al livello completamente basso. Questa soluzione è estremamente indesiderabile e può portare a guasti o addirittura all'impossibilità di trasferire i dati, perché L'ingresso di selezione del chip serve a ripristinare il circuito integrato al suo stato iniziale e talvolta avvia l'output del primo bit di dati.

Se è necessario collegare più microcircuiti al bus SPI, viene utilizzata una connessione indipendente (parallela) (Fig. 7.3) o una connessione in cascata (seriale) (Fig. 7.4). La connessione indipendente è più comune, perché ottenuto quando si utilizza qualsiasi chip compatibile con SPI. Qui tutti i segnali, ad eccezione della selezione dei microcircuiti, sono collegati in parallelo e il master del bus, trasferendo l'uno o l'altro segnale SS allo stato basso, specifica con quale IC slave scambierà dati. Lo svantaggio principale di questa connessione è la necessità di linee aggiuntive per indirizzare i chip slave (il numero totale di linee di comunicazione è 3+n, dove n è il numero di chip slave).

Se non ci sono abbastanza gambe del microcontrollore, è possibile utilizzare un chip demultiplexer. Il demultiplexer collega un singolo segnale di ingresso a uno dei segnali di uscita, a seconda del codice sui pin di controllo. La Figura 7.4 mostra lo schema di collegamento del demultiplexer. Al suo ingresso viene fornito il segnale SS, che assume un valore pari a 0 se è necessario selezionare uno dei microcircuiti. Il numero del microcircuito richiesto in codice binario viene fornito alle gambe Am-A0. Ciò consente di ridurre il numero di gambe utilizzate nel microcontrollore a m=log 2 n. Dove n è il numero di chip slave. Quelli. per collegare 128 dispositivi sono necessari 8 pin del microcontrollore. Uno per impostare il segnale di abilitazione e 7 per impostare il numero del chip da accendere. Va notato che deve essercene uno logico sulle gambe non collegate del demultiplexer. Altrimenti viene utilizzato un invertitore di segnale che converte uno zero logico in uno zero logico.

La commutazione in cascata è esente da questo inconveniente, perché qui più chip formano un grande registro a scorrimento. Per fare ciò, l'uscita dei dati di trasmissione di un circuito integrato è collegata all'ingresso di ricezione dei dati dell'altro, come mostrato nella Figura 3. Gli ingressi di selezione del chip qui sono collegati in parallelo e, quindi, il numero totale di linee di comunicazione viene mantenuto uguale a 4. Tuttavia, l'utilizzo del collegamento in cascata è possibile solo se il suo supporto è indicato nella documentazione dei chip utilizzati. Per scoprirlo è importante sapere che tale connessione in inglese si chiama "daisy-chaining".

Protocollo di trasferimento

Il protocollo di trasmissione sull'interfaccia SPI è essenzialmente identico alla logica del registro a scorrimento (Figura 7.6), che consiste nell'eseguire un'operazione di spostamento e, di conseguenza, nell'input e nell'output di dati su determinati fronti del segnale di sincronizzazione. L'impostazione dei dati durante la trasmissione e il campionamento durante la ricezione vengono sempre eseguiti sui fronti opposti del clock. Ciò è necessario per garantire che i dati vengano campionati una volta stabiliti in modo affidabile. Se consideriamo che il primo fronte nel ciclo di trasmissione può essere un fronte di salita o di discesa, allora ci sono quattro possibili opzioni logiche per il funzionamento dell'interfaccia SPI. Queste opzioni sono chiamate modalità SPI e sono descritte da due parametri:

· CPOL - livello iniziale del segnale di sincronizzazione (se CPOL=0, allora la linea di sincronizzazione prima dell'inizio del ciclo di trasmissione e dopo la sua fine ha un livello basso (cioè il primo fronte è in salita e l'ultimo in discesa), altrimenti, se CPOL=1, - alto (cioè il primo fronte è in calo e l'ultimo in aumento));

· CPHA - fase di sincronizzazione; Questo parametro determina la sequenza in cui i dati vengono installati e recuperati. Se CPHA=0, sul fronte di salita del ciclo di clock i dati verranno campionati e quindi sul fronte di discesa i dati verranno impostati. Se CPHA=1, l'installazione dei dati verrà eseguita sul fronte di salita nel ciclo di sincronizzazione e il campionamento verrà eseguito sul fronte di discesa.

Le informazioni sulle modalità SPI sono presentate nelle Figure 7.7 e 7.8.

I chip master e slave che operano in diverse modalità SPI sono incompatibili, pertanto, prima di scegliere i chip slave, è importante chiarire quali modalità sono supportate dal bus master. I moduli SPI hardware integrati nei microcontrollori, nella maggior parte dei casi, supportano la possibilità di selezionare qualsiasi modalità e, pertanto, è possibile collegare ad essi qualsiasi chip SPI slave (si applica solo a un'opzione di connessione indipendente). Inoltre, il protocollo SPI in qualsiasi modalità è facilmente implementabile nel software.

Interfaccia RS-485

L'interfaccia RS-485 (un altro nome è EIA/TIA-485) è uno degli standard del livello di comunicazione fisica più comuni. Lo strato fisico è un canale di comunicazione e un metodo di trasmissione del segnale (livello 1 del modello di interconnessione dei sistemi aperti OSI).

Una rete costruita sull'interfaccia RS-485 è composta da ricetrasmettitori collegati tramite un doppino intrecciato, ovvero due fili intrecciati. L'interfaccia RS-485 si basa sul principio della trasmissione dati differenziale (bilanciata). La sua essenza è trasmettere un segnale su due fili. Inoltre, un filo (condizionatamente A) trasporta il segnale originale e l'altro (condizionatamente B) trasporta la sua copia inversa. In altre parole, se su un filo c'è un “1”, sull'altro c'è uno “0” e viceversa. Pertanto, esiste sempre una differenza di potenziale tra i due fili di un doppino intrecciato: a “1” è positivo, a “0” è negativo (Figura 7.9).

È questa differenza di potenziale che trasmette il segnale. Questo metodo di trasmissione fornisce un'elevata immunità alle interferenze di modo comune. L'interferenza di modo comune è un'interferenza che colpisce equamente entrambi i fili della linea. Ad esempio, un'onda elettromagnetica che attraversa una sezione di una linea di comunicazione induce potenziale in entrambi i fili. Se il segnale viene trasmesso dal potenziale in un filo rispetto al comune, come in RS-232, l'interferenza su questo filo può distorcere il segnale rispetto al comune (massa) che assorbe bene le interferenze. Inoltre, la differenza di potenziale di terra diminuirà attraverso la resistenza di un lungo filo comune, un'ulteriore fonte di distorsione. E con la trasmissione differenziale, non si verifica alcuna distorsione. Infatti, se due fili sono vicini l'uno all'altro e sono addirittura intrecciati, la ricezione su entrambi i fili è la stessa. Il potenziale in entrambi i fili ugualmente caricati cambia allo stesso modo, mentre la differenza di potenziale informativa rimane invariata.

Implementazione hardware dell'interfaccia RS485.

Implementazione hardware dell'interfaccia: chip ricetrasmettitore con ingressi/uscite differenziali (alla linea) e porte digitali (alle porte UART del controller). Sono disponibili due opzioni per questa interfaccia: RS-422 e RS-485.

RS-422 è un'interfaccia full duplex. La ricezione e la trasmissione avvengono su due coppie di cavi separate. Può esserci un solo trasmettitore su ciascuna coppia di fili.

RS-485 è un'interfaccia half-duplex. La ricezione e la trasmissione avvengono su una coppia di fili con una separazione temporale. Possono esserci molti trasmettitori in una rete, poiché possono essere spenti in modalità di ricezione (Figura 7.10).

Spiegazione dei simboli in Fig. 7.10

D (conducente) - trasmettitore;
R (ricevitore) - ricevitore;
DI (ingresso driver) - ingresso digitale del trasmettitore;
RO (uscita ricevitore) - uscita digitale del ricevitore;
DE (abilitazione conducente) - permesso di utilizzare il trasmettitore;
RE (abilitazione ricevitore) - autorizzazione a utilizzare il ricevitore;
A - ingresso/uscita differenziale diretto;
B - ingresso/uscita differenziale inverso;
Y - uscita differenziale diretta (RS-422);
Z - uscita differenziale inversa (RS-422).

Diamo uno sguardo più da vicino al ricetrasmettitore RS-485. L'uscita digitale del ricevitore (RO) è collegata alla porta UART del ricevitore (RX). Ingresso digitale del trasmettitore (DI) alla porta del trasmettitore UART (TX). Poiché il ricevitore e il trasmettitore sono collegati sul lato differenziale, il trasmettitore deve essere spento durante la ricezione e il ricevitore deve essere spento durante la trasmissione. A questo scopo vengono utilizzati gli ingressi di controllo: autorizzazione del ricevitore (RE) e autorizzazione del trasmettitore (DE). Poiché l'ingresso RE è inverso, può essere collegato a DE e commutare il ricevitore e il trasmettitore con un segnale da qualsiasi porta del controller. Al livello "0" - lavorare per la ricezione, a "1" - per la trasmissione (Fig. 7.11).

Il ricevitore, ricevendo la differenza di potenziale (UAB) agli ingressi differenziali (AB), la converte in un segnale digitale all'uscita RO. La sensibilità del ricevitore può essere diversa, ma i produttori dei chip del ricetrasmettitore scrivono nella documentazione l'intervallo di soglia garantito per il riconoscimento del segnale. Tipicamente queste soglie sono ±200 mV. Cioè, quando UAB > +200 mV, il ricevitore rileva "1" quando UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Tutti i dispositivi sono collegati a un cavo a doppino intrecciato allo stesso modo: uscite dirette (A) a un filo, uscite inverse (B) all'altro.

L'impedenza di ingresso del ricevitore lato linea (RAB) è generalmente di 12 KΩ. Poiché la potenza del trasmettitore non è illimitata, ciò crea un limite al numero di ricevitori collegati alla linea. Secondo la specifica RS-485, tenendo conto delle resistenze terminali, il trasmettitore può pilotare fino a 32 ricevitori. Tuttavia, esistono numerosi microcircuiti con maggiore impedenza di ingresso, che consente di collegare molto più di 32 dispositivi alla linea.

La velocità massima di comunicazione secondo la specifica RS-485 può raggiungere 10 Mbaud/sec. La distanza massima è di 1200 metri. Se è necessario organizzare la comunicazione a una distanza superiore a 1200 metri o collegare più dispositivi di quanto consentito dalla capacità di carico del trasmettitore, vengono utilizzati ripetitori speciali.

Interfaccia I2C.

Questa interfaccia è stata proposta da Philips, che la ha utilizzata per organizzare la comunicazione tra i chip dei suoi televisori. I 2 C (abbreviazione di Inter-Integrated Circuit) è un bus seriale asincrono bidirezionale. Fisicamente il bus I 2 C è costituito da due linee di segnale, una delle quali (SCL) è destinata alla trasmissione del segnale di clock e la seconda (SDA) allo scambio di dati. Per il controllo delle linee vengono utilizzati stadi di uscita con collettore aperto, quindi le linee bus devono essere collegate ad una fonte di alimentazione +5 V tramite resistori con una resistenza di 1...10 kOhm, a seconda della lunghezza fisica delle linee e la velocità di trasferimento dei dati. La lunghezza delle linee di collegamento in modalità standard può raggiungere i 2 metri, la velocità di trasferimento dati è di 100 kbit/s.

Tutti gli abbonati al bus sono divisi in due classi: "Leader" e "Slave". Il dispositivo master genera un segnale di clock (SCL). Può accedere in modo indipendente al bus e indirizzare qualsiasi dispositivo slave allo scopo di trasmettere o ricevere informazioni. Tutti i dispositivi slave “ascoltano” il bus per rilevare il proprio indirizzo e, dopo averlo riconosciuto, eseguono l'operazione prescritta. Inoltre, è possibile la cosiddetta modalità "MultiMaster", quando sul bus sono installati più dispositivi master, che condividono congiuntamente dispositivi slave comuni, oppure agiscono alternativamente come master quando essi stessi avviano lo scambio di informazioni, o come slave quando stanno aspettando l'accesso da un altro dispositivo master. La modalità "MultiMaster" richiede un monitoraggio costante e il riconoscimento dei conflitti. A questo proposito, questa modalità è più difficile da implementare (ovvero l'implementazione del software) e, di conseguenza, viene utilizzata meno spesso nei prodotti reali.

Nel momento iniziale - in modalità standby - entrambe le linee SCL e SDA si trovano nello stato logico (il transistor dello stadio di uscita a collettore aperto è chiuso). Nella modalità di trasmissione (Figura 7.12), il bit di dati SDA viene sincronizzato dal fronte di salita di SCL. Le informazioni sulla linea SDA vengono modificate quando la linea SCL è nello stato zero. Il dispositivo slave può "mantenere" la linea SCL nello stato zero, ad esempio, durante l'elaborazione del successivo byte ricevuto, mentre il dispositivo master deve attendere fino a quando la linea SCL viene liberata prima di continuare a trasmettere informazioni.

Per sincronizzare i pacchetti bus I 2 C, si distinguono due condizioni: "START" e "STOP", che limitano l'inizio e la fine del pacchetto di informazioni (Figura 7.13). Per codificare queste condizioni viene utilizzata una modifica dello stato della linea SDA con un unico stato della linea SCL, il che non è accettabile durante la trasmissione dei dati. La condizione di "START" si forma quando appare un fronte di discesa sulla linea SDA, quando la linea SCL è in un unico stato, e viceversa, la condizione di "STOP" si forma quando appare un fronte di salita sulla linea SDA quando la linea SCL la linea è in un unico stato.

La trasmissione dei dati inizia sul primo fronte di salita sulla linea SCL, che sincronizza il bit più significativo del primo byte di informazione. Ogni byte di informazione (8 bit) contiene 9 periodi di clock della linea SCL. Nel nono ciclo, il dispositivo ricevente emette una conferma (ACK) - un fronte di discesa che indica la ricezione dei dati. È opportuno notare che qualsiasi utente del bus, sia master che slave, può in momenti diversi essere sia trasmettitore che ricevitore e, a seconda della modalità, è tenuto a ricevere o emettere un segnale ACK, la cui assenza viene interpretata come errore.

Per avviare un'operazione di scambio dati, il dispositivo master invia una condizione di "START" sul bus. La condizione “START” è seguita da un byte con l'indirizzo del dispositivo slave (Figura 7.14), costituito da un indirizzo del dispositivo a sette bit (bit 1...7) e un flag di operazione di lettura-scrittura a un bit - “ R/W” (bit 0). Il bit R/W determina la direzione dello scambio, dove 0 indica il trasferimento dei dati dal master allo slave (Figura 7.14a) e 1 la lettura dallo slave (Figura 7.14b). Tutti i bit sul bus I 2 C vengono trasmessi in ordine dal più alto al più basso, ovvero il 7° bit viene trasmesso per primo, lo 0 per ultimo. L'indirizzo può essere seguito da uno o più byte di informazione (nella direzione specificata dal flag R/W), i cui bit vengono temporizzati dal master sul bus SCL.

Quando esegue un'operazione di lettura, l'host deve ACK del byte letto se vuole leggere il byte successivo, e non emettere un ACK se sta per finire la lettura del pacchetto (vedi Figura 7.14b).

È consentito riprendere l'indirizzo del dispositivo slave più volte in un ciclo di trasmissione, ovvero trasmettere una condizione di “START” ripetuta senza una precedente condizione di “STOP” (Figura 7.14c).

È necessario notare alcune caratteristiche dei chip di memoria che operano tramite l'interfaccia I 2 C e le procedure per lo scambio di dati con essi. Innanzitutto, la memoria dati non volatile di questi microcircuiti è divisa in pagine di memoria, quindi quando viene scritto un byte, l'intera pagina viene prima copiata nella RAM interna del microcircuito, dove viene modificata la cella desiderata. Successivamente la vecchia pagina viene cancellata e al suo posto ne viene scritta una nuova. Un'altra caratteristica è che i quattro bit più significativi dell'indirizzo slave devono essere sempre uguali a 1010. Questo requisito è regolato dalla stessa Philips.

Il bus 1-Wire utilizza un solo conduttore per la comunicazione e l'alimentazione. La modalità di comunicazione è asincrona e half-duplex, che segue rigorosamente lo schema master-slave. Allo stesso bus possono essere collegati contemporaneamente uno o più dispositivi slave. È possibile collegare un solo dispositivo master a un bus.

Lo stato inattivo del bus corrisponde ad un livello alto, generato da una resistenza pull-up. Il valore della resistenza pull-up è riportato nella documentazione dell'IC slave. Tutti i chip collegati al bus devono essere in grado di produrre un livello basso. Se l'uscita del microcontrollore non supporta tre stati, è necessario fornire un driver dotato di uscita a collettore aperto o drain aperto

La trasmissione del segnale sul bus 1-Wire è suddivisa in intervalli di tempo della durata di 60 µs. Viene trasmesso un solo bit di dati per intervallo di tempo. I dispositivi slave possono presentare differenze significative rispetto ai ritardi nominali. Tuttavia, ciò richiede tempistiche più precise da parte del leader per garantire una corretta comunicazione con i subordinati che hanno basi temporali diverse.

Segnali bus di base.

Il master avvia ogni comunicazione a livello di bit. Ciò significa che la trasmissione di ogni bit, indipendentemente dalla direzione, deve essere avviata dal master. Ciò si ottiene impostando il bus su un livello basso, che sincronizza la logica di tutti gli altri dispositivi. I comandi principali per la comunicazione tramite bus 1-Wire sono 5: “Scrivi log. 1”, “Scrivi registro. 0”, “Leggi”, “Reset” e “Presenza”.

Segnale “Scrivi log. 1"

Segnale “Scrivi log. 1" è mostrato in Fig. 7.15. Il master imposta il livello basso per 1...15 µs. Successivamente libera l'autobus per il resto della fascia oraria.

Riso. 7.15 – Segnale “Scrivi log. 1"

Segnale “Scrivi log. 0"

Segnale “Scrivi log. 0" è mostrato nella Figura 7.16. Il master genera un livello basso per almeno 60 μs, ma non più di 120 μs.

Fig 7.16 – Segnale “Scrivi log. 0"

Leggi il segnale

Il segnale “Leggi” è mostrato in Fig. 7.17. Il master imposta il livello basso per 1...15 µs. Lo slave quindi tiene il bus basso se desidera trasmettere un log. 0. Se è necessario trasferire il registro. 1, quindi rilascia semplicemente la linea. La scansione del bus deve essere eseguita entro 15 µs dal momento in cui il bus si abbassa. Se visto dal lato del master, il segnale “Leggi” è, in sostanza, un segnale “Scrivi registro”. 1". Lo stato interno effettivo dello slave sarà determinato dal segnale “Registra registro”. 1" o "Lettura".

Figura 7.17 – Segnale “Leggi”.

Segnale di Reset/Presenza

I segnali di “Reset” e “Presenza” sono mostrati in Figura 7.18. Si prega di notare che gli intervalli di tempo degli impulsi sono diversi. Il master si abbassa per 8 intervalli di tempo (480 µs) e quindi rilascia il bus. Questo lungo periodo di condizione bassa è chiamato segnale di "Reset".

Se sul bus è presente uno slave, entro 60 µs dopo che il master ha rilasciato il bus deve impostare un livello basso per almeno 60 µs. Questa risposta si chiama “Presenza”. Se tale segnale non viene rilevato, il master deve presumere che non vi siano dispositivi collegati al bus e che non sia possibile alcuna ulteriore comunicazione.

USB (Universal serial bus) è stato sviluppato per collegare rapidamente dispositivi esterni a un personal computer e quindi trovare e installare il software necessario. I dispositivi a basso consumo vengono alimentati direttamente tramite l'interfaccia.

Lo standard USB implica la presenza di un solo dispositivo Master (Host) sulla rete. Inoltre, lo standard supporta fino a 127 dispositivi slave sulla rete. Per distinguere tra dispositivi master e slave sono stati sviluppati diversi tipi di connettori (Figura 7.19): Tipo A per il master e Tipo B per lo slave. Si accetta che la tensione di 5 V sia presente solo sul connettore di tipo A, che è il connettore principale. Il resto dei dispositivi viene alimentato direttamente da esso.

Lo standard USB utilizza 4 fili schermati, due dei quali trasmettono alimentazione (+5 V e GND) (Figura 7.19 e Tabella 7.2). Gli altri due rappresentano segnali di dati differenziali a doppino intrecciato. Schema di codifica utilizzato NRZI(Non Return to Zero Invert) per la trasmissione dati con campo di sincronizzazione per sincronizzare gli orologi master e slave.

Lo standard USB 2.0 ha introdotto lo standard On-The-Go (OTG), che ha introdotto il protocollo Host Negotiation, che consente a due dispositivi USB di concordare chi fungerà da master. Ciò è previsto e limitato a singole connessioni punto-punto, ad esempio da un telefono cellulare a un personal computer.

USB supporta la connessione "a caldo" (plug'n'play) con driver caricati e scaricati dinamicamente. L'utente collega semplicemente il dispositivo, collegandolo così al bus. L'host rileva la connessione, interroga il dispositivo appena inserito e carica il driver appropriato, indicando il momento del caricamento con una clessidra sullo schermo (se il driver per il dispositivo USB è già installato sul sistema). L'utente finale non si preoccupa della risoluzione o IRQ(interruzioni) e indirizzi di porta, né sul riavvio del computer (non è richiesto il riavvio). Quando l'utente ha finito con il dispositivo USB, lo rimuove semplicemente (o scollega il cavo), l'host rileverà l'assenza del dispositivo e scaricherà automaticamente il driver.

La versione 1.1 di SB supporta due velocità: la modalità a piena velocità con una velocità di 12 Mbit/s e la modalità a bassa velocità con una velocità di 1,5 Mbit/s. La modalità da 1,5 Mbit/s è più lenta e meno sensibile alle EMI (interferenze), il che riduce il costo delle sfere di ferrite e riduce i requisiti di qualità dei componenti.

Il cavo bus a piena velocità è un cavo a doppino intrecciato, protetto da uno schermo e può essere utilizzato anche per il funzionamento a bassa velocità. Un cavo per il funzionamento solo alla velocità minima (ad esempio per collegare un mouse) può essere qualsiasi e non schermato.

Lo standard USB 2.0 introduce una modalità High Speed ​​con una velocità di trasferimento dati di 480 Mbit/s.

Trasferimento dati.

Tutti i trasferimenti di dati tramite l'interfaccia vengono avviati dall'host. I dati vengono trasmessi sotto forma di pacchetti. L'interfaccia USB utilizza diversi tipi di pacchetti:

A) firmare il pacchetto (pacchetto di token) descrive il tipo e la direzione del trasferimento dei dati, l'indirizzo del dispositivo e il numero di serie del punto finale (CT è la parte indirizzabile del dispositivo USB); Esistono diversi tipi di pacchetti di funzionalità: IN, FUORI, SOF, IMPOSTARE;

B) pacchetto dati (pacchetto di dati) contiene i dati trasmessi;

B) pacchetto di approvazione (pacchetto di stretta di mano) ha lo scopo di riportare i risultati del trasferimento dei dati; Esistono diversi tipi di pacchetti di coordinamento: RICONOSCI, N.A.K., STALLA.

Il trasferimento dei dati tramite USB viene effettuato come segue:

Il primo pacchetto, il cosiddetto token, viene generato dal dispositivo master per descrivere il tipo di dati trasferiti, l'operazione di trasferimento (lettura o scrittura), l'indirizzo del dispositivo e l'endpoint. Quello successivo solitamente trasmesso è un pacchetto di dati che trasporta informazioni utili, seguito da un pacchetto di handshake che indica che i dati o il token sono stati ricevuti con successo oppure che l'endpoint è bloccato o non disponibile per accettare i dati.

Gli endpoint nello standard USB sono le sorgenti e i sink dei dati. Tutti i dispositivi devono supportare l'endpoint 0. Questo è l'endpoint che accetta tutte le richieste di controllo e di stato durante l'enumerazione (una richiesta di handle per determinare il tipo di dispositivo collegato) e finché il dispositivo rimane operativo sul bus.

Gli endpoint numerati da 1 vengono utilizzati per trasmettere le informazioni dell'utente. Diamo un'occhiata a un paio di esempi.

Il driver del dispositivo trasmette all'endpoint del dispositivo master EP1. Perché Questo dispositivo è il master, quindi i dati vanno nel buffer OUT EP1. In questo caso viene inviato un token OUT, che indica che i dati sono pronti per essere inviati. Dopo aver ricevuto questo token, il dispositivo slave può leggere i dati dal buffer OUT.

Se il dispositivo slave deve trasferire dati al master, li inserisce nel buffer IN. Questo buffer manterrà i dati finché il master non invierà un token IN richiedendo dati dall'endpoint. Tutti i buffer endpoint hanno un nome relativo al master, ad es. Il buffer di uscita del dispositivo slave si chiama IN perché è il buffer di input per il dispositivo master.

Il trasferimento dei dati da un endpoint all'altro avviene tramite flussi. Flusso: una connessione logica tra un host e uno o più endpoint.

I flussi hanno anche una serie di parametri come il tipo di trasmissione (Control, Bulk, Iso o Interrupt), la direzione del flusso di dati e le dimensioni massime dei pacchetti/buffer.

Ad esempio, il flusso predefinito è un flusso bidirezionale composto dall'endpoint IN 0 e dall'endpoint OUT 0 con controllo del tipo di trasferimento.

USB definisce due tipi di tubi

A) Tubi di flusso non hanno un formato USB predefinito, quindi puoi inviare qualsiasi tipo di dati attraverso lo stream pipe e recuperare i dati all'altra estremità. I flussi di dati sono sequenziali e hanno una direzione predeterminata: IN o OUT. I pipe di flusso supportano i tipi di trasferimento in blocco, isocrono e di interruzione. I tubi di flusso possono essere controllati dall'host o dal dispositivo.

B) Tubi di messaggio avere un formato USB predefinito. Sono controllati dall'host, avviati da una richiesta inviata dall'host. I dati vengono inviati nella direzione desiderata specificata nella richiesta. Pertanto, le pipe dei messaggi consentono il trasferimento dei dati in entrambe le direzioni, ma supportano solo i trasferimenti di controllo.

Lo standard USB descrive quattro tipi di trasferimento dati:

A) Controllo dell'inoltro (trasferimento di controllo) viene utilizzato per la configurazione del dispositivo e per altri scopi specifici del dispositivo.

B) Trasmissione in streaming (trasferimento in blocco) viene utilizzato per trasmettere una quantità relativamente grande di informazioni.

B) Interrompere l'inoltro (interrompere il trasferimento) viene utilizzato per trasmettere una quantità relativamente piccola di informazioni, per cui la sua trasmissione tempestiva è importante. Ha una durata limitata e una priorità più alta rispetto ad altri tipi di trasferimenti.

D) Inoltro isocrono (trasferimento isocrono) è chiamato anche streaming in tempo reale. Le informazioni trasmesse in tale trasferimento richiedono una scala temporale reale quando vengono create, inviate e ricevute.

Trasferimenti in streaming caratterizzato da un trasferimento dati garantito senza errori tra l'host e la funzione rilevando errori durante la trasmissione e richiedendo nuovamente le informazioni. Quando l'host è pronto a ricevere dati da una funzione, invia un pacchetto flag alla funzione IN-sacchetto di plastica. In risposta a ciò, la funzione trasmette in fase di trasferimento dati un pacchetto di dati all'host o, se esso

Con valori nominali da 10 Ohm a 1 MOhm);

  • cavi di collegamento (ad esempio, questo è un buon set);
  • personal computer con ambiente di sviluppo IDE Arduino.
  • 1 Descrizione del seriale Interfaccia SPI

    SPI - Interfaccia periferica seriale o “Interfaccia periferica seriale”è un protocollo di trasferimento dati sincrono per l'accoppiamento dispositivo principale Con periferiche (Slave). Il dispositivo master è spesso un microcontrollore. La comunicazione tra i dispositivi avviene su quattro fili, motivo per cui SPI viene talvolta chiamata "interfaccia a quattro fili". Queste sono le gomme:

    Sono disponibili quattro modalità di trasferimento dati ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), causato dalla combinazione della polarità degli impulsi di clock (lavoriamo al livello ALTO o BASSO), Polarità dell'orologio, CPOL e la fase degli impulsi di clock (sincronizzazione sul fronte di salita o di discesa dell'impulso di clock), Fase orologio, CPHA.

    La figura spiega questa tabella.

    L'interfaccia SPI offre diverse opzioni per il collegamento di dispositivi slave: indipendente E cascata. Quando è collegato in modo indipendente al bus SPI, il dispositivo master accede individualmente a ciascun dispositivo slave. Nel collegamento in cascata i dispositivi slave funzionano uno per uno, come in cascata.


    Tipologie di collegamento dei dispositivi per il funzionamento tramite interfaccia SPI: indipendente e in cascata

    2 Implementazione dell'interfaccia SPI sulle schede della famiglia Arduino

    In Arduino, i bus di interfaccia SPI si trovano su porte specifiche. Ogni scheda ha la propria assegnazione dei pin. Per comodità, le conclusioni vengono duplicate e anche inserite in una pagina separata Connettore ICSP(Nella Programmazione seriale di circuito, programmare un dispositivo incluso in un circuito utilizzando un protocollo seriale). Si prega di notare che il connettore ICSP non ha un pin di selezione slave - SS, perché si presuppone che Arduino venga utilizzato come dispositivo master nella rete. Ma se necessario, puoi assegnare qualsiasi pin digitale di Arduino come SS.

    La figura mostra la corrispondenza standard dei pin ai bus SPI per Arduino UNO e Nano.


    3 Biblioteca per il lavoro con interfaccia SPI

    Per Arduino è stata scritta una libreria speciale che implementa il protocollo SPI. Si collega in questo modo: all'inizio del programma aggiungiamo #include SPI.h.

    Per iniziare a utilizzare il protocollo SPI, è necessario configurare le impostazioni e quindi inizializzare il protocollo utilizzando la procedura SPI.beginTransaction(). Puoi farlo con un'istruzione: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    Ciò significa che inizializziamo il protocollo SPI alla frequenza di 14 MHz, la trasmissione dei dati avviene a partire da MSB (bit più significativo), in modalità SPI_MODE0.

    Dopo l'inizializzazione, selezionare il dispositivo slave spostando il pin SS corrispondente sullo stato BASSO.

    Quindi trasferiamo i dati al dispositivo slave con il comando SPI.trasferimento().

    Dopo il trasferimento riportiamo le SS alla statale ALTO.


    Il lavoro con il protocollo viene completato con il comando SPI.endTransaction().

    Si consiglia di ridurre al minimo il tempo di trasferimento tra le istruzioni SPI.beginTransaction() e SPI.endTransaction() per evitare problemi se un altro dispositivo tenta di avviare un trasferimento dati utilizzando impostazioni diverse.

    4 Collegamento di un registro a scorrimento ad Arduino

    Consideriamo l'applicazione pratica dell'interfaccia SPI. Accenderemo i LED controllando un registro a scorrimento a 8 bit tramite il bus SPI. Colleghiamoci ad Arduino registro a scorrimento 74HC595. Collegheremo un LED con valore nominale di 220 Ohm a ciascuna delle 8 uscite del registro tramite un resistore limitatore. Il diagramma è mostrato in figura.


    5 Schizzo per il controllo di un registro a scorrimento tramite interfaccia SPI

    Scriviamo uno schizzo come questo.

    #includere const int pinSelect = 8; // registra il pin selezionato configurazione nulla() ( SPI.inizio(); // inizializza l'interfaccia SPI pinMode(pinSelect, OUTPUT); // digitalWrite(pinSelect, LOW); // seleziona i dispositivi slave (registro) SPI.transfer(0); // cancella il contenuto del registro digitalWrite(pinSelect, HIGH); // fine della trasmissione Serial.begin(9600); } ciclo vuoto() ( for (int i=0; i )

    Per prima cosa colleghiamo la libreria SPI e inizializziamo l'interfaccia SPI. Definiamo il pin 8 come pin di selezione dello slave SS. Cancellamo il registro a scorrimento inviandogli il valore "0". Inizializzare la porta seriale.

    Per accendere un LED specifico utilizzando un registro a scorrimento, è necessario applicare un numero a 8 bit al suo ingresso. Ad esempio, affinché il primo LED si accenda, forniamo il numero binario 00000001, per il secondo - 00000010, per il terzo - 00000100, ecc. Questi numeri binari, quando convertiti nel sistema numerico decimale, formano la seguente sequenza: 1, 2, 4, 8, 16, 32, 64, 128 e sono potenze di due da 0 a 7.

    Di conseguenza, nel ciclo ciclo continuo() In base al numero di LED, ricalcoliamo da 0 a 7. Funzione pow(base, grado) Eleva 2 alla potenza del contatore del loop. I microcontrollori non funzionano in modo molto accurato con numeri di tipo "doppio", quindi utilizziamo la funzione di arrotondamento per convertire il risultato in un numero intero girare(). E trasferiamo il numero risultante al registro a scorrimento. Per chiarezza il monitor della porta seriale visualizza i valori ottenuti durante questa operazione: L'unità “corre” attraverso le scariche: i LED si illuminano in un'onda.

    6 "Onda che corre" dai LED

    I LED si accendono uno per uno e osserviamo un'“onda” di luci che scorre. I LED sono controllati tramite un registro a scorrimento, al quale ci siamo collegati tramite l'interfaccia SPI. Di conseguenza, vengono utilizzati solo 3 pin Arduino per controllare 8 LED. Se collegassimo i LED direttamente alle porte digitali di Arduino, dovremmo utilizzare una porta separata per ciascun LED.

    Abbiamo studiato l'esempio più semplice di Arduino che funziona con il bus SPI. Considereremo più in dettaglio il funzionamento di diversi registri a scorrimento con connessioni indipendenti e in cascata in un articolo separato.