protocollo I2C

« Older   Newer »
  Share  
view post Posted on 5/1/2011, 18:32
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Allora, come ho accennato altrove, sto studiando lo standard di conunicazione I2C.

Praticamente questo protocollo, permette di mettere in comunicazione piu' dispositivi tra loro, per esempio eeprom, varie sonde ecc, usando solo 2 fili, uno per il clock, e uno per i dati.
La trasmissione, è di tipo seriale, come la RS232, ma alla velocità di 100khz o 400 khz.

Da come ho capito, questo protocollo, differenzia i dispositivi in 2 categorie: master e slave
Il master (padrone), si occupa di riconoscere i vari indirizzi degli slave sul bus, gli slave (schiavi) dal canto loro,obbediscono a quello che dice o fa il master
anche se in certi casi possono anche loro decidere di interrompere la comunicazione.

Sempre da come ho letto, per iniziare una trasmissione, bisogna generare una condizione di START che si ottiene portando il dato da alto a basso con la linea
di clock alta, mentre la condizione di STOP, si ottiene facendo il contrario.

Logicamente start e stop, sono l'inizio e la fine, mentre all'interno ci sta tutto il resto.
L'indirizzamento dei vari dispositivi slave può essere fatto a 7 o 10 bit, anche se non ho ben capito come si fa ad indirizzarli, cioè gli si da un indirizzo arbitrario univoco?

Oppure c'e' da consulatare il datasheet? Non lo so ancora.
Poi, l'indirizzamento presumo sia necessario nel caso ci siano più slave no? Indirizzare quando invece c'e' un solo dispositivo, lo vedrei superfluo, ma no so.

I dati, vengono trasmessi bit per bit, partendo dal bit più significativo, alla fine del byte lo slave, genera un segnale di ACK (acknowledge) che conferma l'avvenuta ricezione.

Per i vari tempi, c'e' a disposizione nei pic, il baud rate generator, come per la rs232, credo che venga usato come clock, per le varie temporizzazioni, che si usano per la condizione di start stop ecc...
Questi sono i dati che ho reperito fin'ora, molto vaghi lo so, ho tralasciato molte cose perchè sono registri specifici dei pic, ma vorrei fare un discorso generale, quindi per il momento tralascio.

Io l'unico dispositivo che ho per fare prove, è il DS1820, una sonda di tempertatura, che restituisce un codice a bit, lavora appunto in I2C, ed è molto comoda, ha la possibilità di gestire temperature anche negative fino a -55, inoltre ha un sistema per la minima e la massima, come avevo fatto io con lm35.

Credo che nei modelli vecchi di micro, la gestione vada fatta tutta via softawre, vome per la seriale, per esempio se non ricordo male, il pic16f84a, non aveva la risorsa hardware Usart, quindi le temporizzazioni e il baude rate, andavano fatte via software, credo che qui sia lo stesso discorso, ma il micro che uso io, o comunque abbastanza nuovi, abbiano tutti la parte hardware che gestisce il protocollo I2C.

Mi piacerebbe approfondire, perchè ho notato che molte sonde, accessori comunicano così...una volta imparato poi si potrebbero usare e fare molte prove con sensori di temperatura, umidità, accellerometri e chi ne ha più ne metta!

Edited by GILA75 - 18/6/2011, 08:04
 
Top
robo67
view post Posted on 5/1/2011, 20:00




Il bus I2C, come hai detto tu, è un bus di comunicazione seriale.
A differenza di quanto hai scritto l'I2C è molto diverso dal bus seriale RS232, dato che è un bus sincrono e non asincrono come la RS232 (e tutte le derivazioni, come RS422, RS485, ecc.).

Cosa significano asincrono e sincrono?
Nel bus asincrono il clock viene generato localmente sia dal trasmettitore che dal ricevitore, che devono quindi avere lo stesso baud-rate, ovvero le stesse temporizzazioni per decidere quando leggere il bit.

Praticamente quando il trasmettitore inizia a trasmettere, sulla linea il livello del segnale cambia di stato e questa variazione viene considerata come bit di start che sincronizza la ricezione con la trasmissione.
Da quel momento ogni tot tempo (dove tot è dipendente dal baud-rate impostato) il ricevitore legge lo stato del bit inviato dal trasmettitore e lo inserisce nel buffer di ricezione.
Quindi nelle porte seriali asincrone il clock viene generato localmente non solo dal "master" (trasmettitore), ma anche dallo "slave" (ricevitore).

Nei bus sincroni (come l'I2C) clock e dato vengono generati entrambi dal master e lo slave li riceve, usando il clock per sapere in quale momento deve leggere (campionare) il dato.
A parte casi molto particolari (che non interessano il bus I2C) la velocità di trasmissione (equivalente al baud-rate delle linee asincrone) non è importante: un dispositivo slave può lavorare anche a velocità inferiori a quella nominale, dato che il dato viene letto solo in concomitanza del fronte del clock, senza che intervengano temporizzazioni particolari.
Il limite semmai é nella velocità massima del bus, oltre la quale si rischia che i dati scambiati non siano interpretati correttamente.

Nell'I2C è il fronte di salita del segnale di clock ad essere usato per campionare il bit di dato.
Il bus I2C ha quindi bisogno di 2 segnali riferiti a massa, il clock (chiamato SCL) e il dato (chiamato SDA). Ogni dispositivo, sia master o slave, può generare solo un livello logico 0, chiudendo a massa (0V che nei chip è chiamato anche GND o Vss) la corrispondente linea, con la differenza che il master può agire sia su SCL che su SDA, mentre lo slave agisce solo su SDA, dato che il clock è sempre gestito dal master.
Come dicevo ogni dispositivo fornisce solo il livello logico 0, mentre il livello logico 1 è assicurato da una resistenza di pull-up su ognuna delle 2 linee del bus.
La resistenza di pull-up deve avere un valore non troppo basso per non sovraccaricare le uscite di master e slave (in questo caso il livello logico 0 potrebbe non essere riconosciuto correttamente) e neppure troppo alto, perché altrimenti i segnali impiegano troppo tempo a salire dallo 0 all'1, arrotondando i fronti e rischiando errori di comunicazione.
Generalmente il valore è compreso fra 1K e 10K.

CITAZIONE
L'indirizzamento dei vari dispositivi slave può essere fatto a 7 o 10 bit, anche se non ho ben capito come si fa ad indirizzarli, cioè gli si da un indirizzo arbitrario univoco?

Ogni slave ha un suo indirizzo dipendente sia dalla configurazione interna (base address), ricavabile dal data-sheet, sia da quella esterna, modificabile generalmente col livello logico di uno o più piedini di selezione indirizzo.
Prendendo ad esempio l'EEPROM 24C01 si nota che nella versione a 8 pin esistono 3 ingressi di selezione indirizzo (A0-A2) che, abbinati al base address interno (A0hex), permettono di avere indirizzi che variano da A0hex a AEhex con salti di 2 (A0, A2, A4,....AE).
Il bit 0 del byte di indirizzamento é invece quello che decide la direzione dei dati (se 0 l'operazione é una scrittura, se 1 l'operazione è una lettura).

Lo slave address non ha nulla a che vedere con l'indirizzo interno del dispositivo slave, quello, tanto per intenderci, dove si vuole scrivere o che si vuole leggere. Lo slave address serve solo per "svegliare" uno dei dispositivi slave collegati al bus (tutti i dispositivi sono collegati in parallelo).

La velocità massima di comunicazione può essere di 100Kbit/s, 400Kbit/s oppure 3,4Mbit/s, fermo restando che questa é appunto la velocità massima a cui i dati possono essere scambiati correttamente, mentre, come ho già detto, la velocità può essere rallentata a piacimento, col vantaggio di aumentare l'immunità del sistema ai disturbi elettrici.
Per decidere la posizione di scrittura/lettura del dispositivo slave occorre inviare, dopo il bit di start e lo slave address, 1 o 2 byte di indirizzamento (il numero dipende dallo slave collegato che può avere la necessità di indirizzare più di 256 byte come nel caso di eeprom dalla 24C04 in su).
Sullo stesso bus I2C possono essere collegati slave con indirizzamento sia a 7 che a 10bit, dato che in caso di mancato riconoscimento dello slave address un dispositivo slave ignora il resto dei dati inviati dal master, perché li considera diretti ad un altro slave.

<segue>

Edited by robo67 - 5/1/2011, 22:49
 
Top
robo67
view post Posted on 5/1/2011, 22:39




...segue

CITAZIONE
Poi, l'indirizzamento presumo sia necessario nel caso ci siano più slave no? Indirizzare quando invece c'e' un solo dispositivo, lo vedrei superfluo, ma no so.

L'indirizzamento é insito nel protocollo I2C e deve essere comunque gestito, anche se esiste un solo slave.

CITAZIONE
I dati, vengono trasmessi bit per bit, partendo dal bit più significativo, alla fine del byte lo slave, genera un segnale di ACK (acknowledge) che conferma l'avvenuta ricezione.

Grosso modo é così. In realtà l'ACK è una conferma che lo slave manda al master per indicare "ho capito, procedi pure col resto".
Normalmente è il master a dettare legge, gestendo sia il clock che il dato come uscite. Durante l'acknoledge il master continua a gestire il clock, mentre è lo slave a gestire il dato (il master, in questa fase, si mette in condizioni di "ascolto").

Il bus I2C, per come è fatto, è anche in grado di gestire la modalità multimaster, in cui uno qualsiasi degli slave può diventare master appena la linea viene lasciata libera dal dispositivo che fino a quel momento ha fatto da master.
Questo modo di funzionamento deriva dal fatto che uno qualsiasi dei dispositivi collegati al bus può vedere se la linea è già impegnata (in questo caso il clock SCL è a livello logico 0) oppure se è libera (SCL a livello logico 1) e in quest'ultimo caso può agire da master ed impegnare la linea.

CITAZIONE
Credo che nei modelli vecchi di micro, la gestione vada fatta tutta via softawre, vome per la seriale, per esempio se non ricordo male, il pic16f84a, non aveva la risorsa hardware Usart, quindi le temporizzazioni e il baude rate, andavano fatte via software, credo che qui sia lo stesso discorso, ma il micro che uso io, o comunque abbastanza nuovi, abbiano tutti la parte hardware che gestisce il protocollo I2C.

Il 16F84 non aveva nessuna periferica dedicata alla porta seriale (UART) e al bus I2C e tutto doveva effettivamente essere gestito a software.
Nei pic più nuovi, come i 16F87x, esiste la MSSP per gestire i protocolli di comunicazione seriale sincrona I2C e SPI (o microwire che è molto simile).
In realtà gestire l'I2C in modalità master tramite software non é poi così drammatico, anche se all'inizio è un po' macchinoso creare alcune routine base come quelle necessarie a serializzare lo slave address, l'indirizzo o i dati da scrivere e quelle per ricevere i byte provenienti dallo slave.
Io a suo tempo ci persi 2-3 giorni, ma ora che ho tutte le routine a disposizione continuo ad usarle anche con i micro che sono dotati della MSSP.
La gestione dell'I2C in modalità slave è invece preferibile che venga fatta tramite l'MSSP, perché altrimenti c'è da piangere, inoltre il micro può fare quasi solo quello, perché deve sempre stare in attesa dei dati per evitare di perdere qualche prezioso bit.
Usando l'MSSP si ha invece un interrupt ogni volta che viene terminata la ricezione di un byte, agevolando il tutto.
Se tu devi gestire degli slave ti consiglio di studiarti a fondo il protocollo e implementarlo via software, così ti fai le ossa e te lo "digerisci" bene.

Per il DS1820 un protocollo I2C master software é adeguato, così come praticamente qualsiasi altra periferica normalmente usata (tranne quelle realmente veloci che però sono usate solo in casi decisamente particolari).
Quando l'I2C l'hai digerito bene lo puoi usare per un'infinità di casi: eeprom, orologi (es. PCF8573), espansione dei pin di ingresso/uscita (PCF8574), driver per display LCD e a LED, ADC, DAC, potenziometri digitali, chip di modifica del segnale audio (equalizzatori, regolatori di tono, volume e bilanciamento) e per televideo, ecc.

Pur essendo stato ideato da Philips, il bus I2C è da qualche anno diventato uno standard usato da tantissimi costruttori di componenti, quindi si trovano chip per tantissima applicazioni diverse.
In caso di funzioni non implementate da qualche chip commerciale c'è poi sempre la possibilità di usare un secondo micro con I2C slave come supporto a quello principale con I2C master.
In questo caso al micro slave si faranno svolgere tutte le funzioni non trovabili nei chip commerciali e il master, tramite il bus I2C, comunicherà col micro slave per gestire tutte queste funzioni.
Io circa 10 anni fa realizzai un'apparecchiatura modulare in cui la scheda principale comunicava con quelle secondarie tramite bus I2C, su cui transitavano le informazioni dal master allo slave e viceversa.

Resta quindi solo da rimboccarsi le maniche per studiare qualcosa che comunque é veramente utilissimo.

Se avrai bisogno di una mano fatti pure avanti.


 
Top
view post Posted on 8/1/2011, 17:40
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ok, grazie mille Robo, in questi giorni, sono stato via, e non ho avuto tempo di provare nulla...

Appena posso, metto la sonda (ds1820) sulla scheda, e come prima prova sommaria, cerco di farla comunicare col pic, e stampare il relativo codice binario che mi restituisce...la conversione binario-umano, verrà poi, non è vitale per capire il protocollo I2C.

Ripeto, devo ancora leggere e documentarmi bene, prendere il datasheet del ds1820 e vedere il codice per l'indirizzamento.
Poi capire se le varie temporizzazioni per esempio per lo START e lo STOP me le devo gestire via software, o se posso usare il baud rate, o al limite timer, non so proprio.
Vedere inoltre come si fa a rilevare i vari stati dei bit flag, interrupt sicuramente, ma magari anche polling, come la seriale, o il convertitore ad...io avevo usato il polling, meno professionale,
ma andava bene per il mio impiego...non so, appena ho tempo, mi ci metto.
Senza l'I2C, ho idea che tutte le prove con i vari sensori, cioè un'infinità, risulterebbero impossibili, mi pare di aver capito che è un protocollo largamente usato...
Intanto grazie
 
Top
view post Posted on 13/1/2011, 10:43
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Sto iniziando a fare delle piccole prove, solo a livello software con mplab, ma già non ho chiare delle cose: le linee sda e scl vanno impostate alzando il livello dei relativi pin giusto?

Sto solo cercando di fare la condizione di start, e da quanto ho capito, la temporizzazione, viene impostata dal baud rate...cioè conta alla rovescia e una volta che giunge allo zero, setta dei vari bit, per segnalare che la condizione di start è finita.
Quindi grosso modo dovrei

ACCENDO PIN SDA
ACCENDO PIN SDL
IMPOSTO BAUDE RATE

ma per ora non sto ottenendo nulla...va bheì è la primissima prova, il tempo è quello che è...devo ribaltare il datasheet e provare ancora
 
Top
view post Posted on 13/1/2011, 11:02
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Bravi, bravi, continuate a sperimentare. Ci sono un sacco di periferiche I²C in giro, batterie dei computer comprese. Sarebbe interessante fare un'interfaccia che possa leggere e riprogrammare i chip che controllano le batterie da PC. Queste hanno la brutta abitudine di non considerare la corrente naturale di scarica delle batterie e quando le ricarichi durano sempre meno fino a quando le butti anche se sono sempre buone. Ricaricando la batteria e resettando i dati del chip la batteria ritorna ad essere utilizzabile. Ma occorre un'interfaccia I²C... :)
 
Web  Top
view post Posted on 13/1/2011, 11:47
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Si Law, io lo voglio studiare questo protocollo, perchè come dici tu, ci si può interfacciare a un sacco di periferiche e sensori. Purtroppo da mesi a sta parte, il tempo è quello che è, quindi le prove vanno a rilento. Mi sono letto un po' il concetto, e come funziona, ma tra la teoria e la pratica c'è un abisso. Ci sono molti registri coinvolti, che devo studiare per bene.

Ecco, questo è uno dei classici casi dove vorrei essere capace di usare il C, ho visto che le routine sono molto più corte, ma va bhe dai pazienza...bene o male ne uscirò....spero
 
Top
robo67
view post Posted on 13/1/2011, 22:40




CITAZIONE
Sto iniziando a fare delle piccole prove, solo a livello software con mplab, ma già non ho chiare delle cose: le linee sda e scl vanno impostate alzando il livello dei relativi pin giusto?

Innanzi tutto il bus I2C lavora con resistenze di pull-up e uscite open-drain.
Cosa significa?
Le normali uscite del PIC (ad eccezione di RA4) sono formate da 2 transistor MOS: uno con canale P che chiude il pin al positivo (VDD) e uno a canale N che lo chiude al negativo (VSS).
Queste uscite sono praticamente dei push-pull a MOS.
Non sono adatte a pilotare il bus I2C, soprattutto la linea SDA che deve essere bidirezionale in ogni caso (SCL, normalmente settata sempre come uscita del master, diventa bidirezionale solo in sistemi multimaster), perché quando forniscono un livello logico 1 chiudono a VDD il piedino di uscita, quindi quando uno degli slave connessi al bus vuole portare SDA a livello 0 mentre il master (pic) lo tiene già a 1 si crea una condizione anomala, che non è detto che possa creare guasti ai chip, ma che sicuramente porta ad anomalie.

Questo non significa che il pic non possa gestire l'I2C, ma che occorre usare un trucco.

Un'uscita open drain è formata da un MOS a canale N (o transistor BJT NPN) che si chiude quando occorre uno 0 e che resta aperto quando deve restare in condizioni di tristate (alta impedenza=disconnesso dalla linea), in modo da permettere alla resistenza di pull-up di portare la linea a 1.

Nel pic questa condizione la si ottiene facendo in modo che un pic passi da una condizione di uscita con livello logico 0 (per ottenere il livello 0) ad una condizione di ingresso (dato che un ingresso è un pin ad alta impedenza analoga ad un'uscita disconnessa dalla linea, quindi tristate).

Praticamente per usare RA0 come SCL e RA1 come SDA dovresti usare le seguenti istruzioni.
L'esempio è riferito a una EEPROM 24LC01 che ha una velocità di bus massima di 400KHz, mentre per dispositivi con velocità di bus più basse é sufficiente aumentare la durata delle pause, che comunque non è critica, dato che dispositivi veloci possono funzionare anche a velocità basse.

#DEFINE SCL TRISA,0
#DEFINE SDA TRISA,1
#DEFINE SCL_PIN PORTA,0
#DEFINE SDA_PIN PORTA,1

BCF SCL_PIN ;RA0 = livello logico 0
BCF SDA_PIN ;RA1 = livello logico 0
BSF SCL ;SCL=ingresso=open-drain
BSF SDA ;SDA=ingresso=open-drain

Quando tu devi generare il bit di start (che implica che SDA passi da 1 a 0 mentre SCL è a 1) dovrai scrivere:

BSF SDA ;SDA = open-drain = linea a livello logico 1 dato che SCL e SDA hanno le resistenze di pull-up
pausa 10uS ;La durata è poco importante.Dipende dalla velocità del dispositivo,ma se non si ha bisogno di velocità elevate si possono usare 10uS
BCF SCL ;SCL = 0
pausa >0,6uS
BCF SDA ;SDA = 0
pausa >0,6uS
BSF SCL ;SCL = 1
pausa >1,3uS

Segue poi l'invio del byte relativo allo slave address.
Come vedi non c'è nessun generatore di baud rate,perchè le pause possono essere realizzate con ritardi a loop di programma (dato che le pause servono ad eliminare le criticità date da una comunicazione troppo veloce possono tranquillamente avere durata molto maggiore di quella indicata da me, quindi anche eventuali allungamenti introdotti da interrupt caduti durante la gestione delle pause non alterano il funzionamento delle routine I2C ).



 
Top
view post Posted on 14/1/2011, 08:46
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ah ok, il datasheet, mi faceva riferimento invece al baud rate....copio pari pari:

Se SCL e SDA sono entrambi campionate alte quando BRG (baude r). finisce il conteggio, il pin SDA è portato basso.
L'azione dell'SDA portato basso mentre SCL è alto, rappresenta la condizione di START, e causa il settaggio del bit S (SSPSTAT <3>).
in seguito a questo, IL BAUDE RATE GENERATOR,è ricaricato con il contenuto di SSPADD<6:0>.....ecc


Forse il data, ti da la configurazione ottimale, ti fa sfruttare al massimo tutte le risorse hardware disponibili.
Ma se mi parli di pause di 10us e 1,3us, non servono nemmeno temporizzazione software a loop, ma molto più semplicemente dei NOP.

Adesso guardo il datasheet del DS1820, e vedo di capire dov'è scritto il suo indirizzo, in poche parole come si chiama, poi al limite posto il link..
 
Top
robo67
view post Posted on 14/1/2011, 09:16




Quello a cui fa riferimento il data sheet é l'utilizzo del modulo MSSP (modulo per comunicazione sincrona) in modalità master, situazione in cui occorre dire al pic a quale velocità vuole comunicare (settaggio della frequenza di SCL).

Io l'MSSP l'ho sempre usato in modo slave, mentre il master lo gestisco tramite software.
Questo perché avevo già le routine di comunicazione I2C implementate per pic senza MSSP.

Solo nei pic più recenti (serie 18F e 24F), quando hi iniziato ad usare il C per il quale non avevo nessun software già fatto, ho iniziato a sfruttare l'MSSP in modalità master.

Nel caso d'implementazione software la velocità é data proprio da ritardi a loop di programma (i NOP si possono usare. ma ce ne vorrebbero molti, se usi dispositivi con bus funzionante a 100KHz, quindi è meglio creare i soliti cicli DECFSZ timer,F e GOTO loop che danno una maggiore flessibilità).
 
Top
view post Posted on 14/1/2011, 09:23
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ah...ok, stavo vedendo ora il discorso dell'indirizzo. Considerando che si possono avere più sonde uguali sullo stesso bus, cioè più slaves, è logico che ognuno avrà il suo "nome"

Se non sbaglio, il data fa riferimento a una ROM. Praticamente mi sa che il master interroga lo slave e legge la rom, riuscendo a capire l'indirizzo.
Credo che questa operazione, vada fatta una volta sola, in fase di inizializzazione cioè:

INITH:

MASTER: chi sei?
SLAVE: sono pinco

fine INITH

poi, per tutte le altre operzaioni, il master saprà già chi e' pinco e chi pallino, avendo precedentemente memorizzato il rispettivo codice scritto nella ROM dello slave...giusto?

Un po' (grosso modo) come l'inizializzazione degli LCD, si fa una volta sola, no?
 
Top
view post Posted on 14/1/2011, 10:30
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
Quando tu devi generare il bit di start (che implica che SDA passi da 1 a 0 mentre SCL è a 1) dovrai scrivere:

BSF SDA ;SDA = open-drain = linea a livello logico 1 dato che SCL e SDA hanno le resistenze di pull-up
pausa 10uS ;La durata è poco importante.Dipende dalla velocità del dispositivo,ma se non si ha bisogno di velocità elevate si possono usare 10uS
BCF SCL ;SCL = 0
pausa >0,6uS
BCF SDA ;SDA = 0
pausa >0,6uS
BSF SCL ;SCL = 1
pausa >1,3uS

Segue poi l'invio del byte relativo allo slave address.

Quindi io la prima prova sommaria che potrei fare è questa, vediamo se l'idea è buona:

Faccio la sequenza di start, mando o leggo l'indirizzo dello slave (devo capire bene), se tutto è andato a buon fine
dovrei ricevere un ok dallo slave (ACK). A sto punto, dovrei testare il bit relativo, che devo vedere qual'è e in che registro, poi fare una condizione
una piccola prova hardware:
testa bit relativo a ACK: è andato tutto a buon fine? si: accendi un led

Devo usare questo stratagemma perchè con la mia scheda non mi è possibile vedere cosa succede nei registri se sto lavorando con l'hardware.
Potrei con l'icd3, ma è un po' che non lo uso.

E' sensato il discorso?
 
Top
robo67
view post Posted on 15/1/2011, 23:57




CITAZIONE
Se non sbaglio, il data fa riferimento a una ROM. Praticamente mi sa che il master interroga lo slave e legge la rom, riuscendo a capire l'indirizzo.

No,l'indirizzo slave del dispositivo è semplicemente la combinazione di un settaggio all'interno del chip unito alla configurazione (stato logico) di 1 o più piedini d'indirizzamento.
Il master teoricamente potrebbe andarsi ad analizzare tutti gli indirizzi possibili (da 00 a FF con passi di 2 unità), e vedere chi gli risponde, ma in realtà chi fa il software del microcontrollore master sa probabilmente anche quanti e quali slave sono collegati, quindi non ha bisogno di chiedere "chi sei?". Saprai, ad esempio che la tale EEPROM risponde all'indirizzo 0A0, che l'altro chip ha indirizzo 0F0, ecc.

CITAZIONE
E' sensato il discorso?

Il discorso è sensato, anche se in realtà, avendo a disposizione un oscilloscopio a 2 canali (meglio se digitale) e ripetendo il ciclo Start bit, Slave Address e Stop bit potresti controllare il bit di ACK senza dovere agire su un led, dato che al 9° impulso di clock su SCL (clock di ACK) SDA deve trovarsi a 0 se lo slave ha "capito" il master.
 
Top
view post Posted on 19/1/2011, 20:19
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ma mi viene un dubbio...sul manuale della mia scheda (easy pic6), si vede che la sonda DS1820 è connessa ai pin RE5 o RE2 (selezionabili). Ora, guardando il data dei pic 16xxx si nota che le linee SDA e SCL, fanno capo ai pin RC3 e RC4, quindi che significa? Che io con quella scheda non posso gestire l'i2c via hardware ma solo via software? I pin per il data e per il clock, sono appunto rc3 e rc4....quindi?

per quanto riguarda l'indirizzamento dello slave, ancora non ci sono, non riesco a trovare materiale chiaro....guardo ancora.
 
Top
robo67
view post Posted on 19/1/2011, 22:29




CITAZIONE
Ma mi viene un dubbio...sul manuale della mia scheda (easy pic6), si vede che la sonda DS1820 è connessa ai pin RE5 o RE2 (selezionabili). Ora, guardando il data dei pic 16xxx si nota che le linee SDA e SCL, fanno capo ai pin RC3 e RC4, quindi che significa? Che io con quella scheda non posso gestire l'i2c via hardware ma solo via software?

Proprio così: la tua scheda non è predisposta per il funzionamento I2C hardware (tramite la porta MSSP), che richiederebbe l'uso dei pin RC3 e RC4, ma solo software.

Proprio ora ho guardato il data sheet del DS1820 e mi sono accorto che non usa assolutamente il bus I2C, ma un bus messo a punto da Dallas/Maxim, chiamato 1Wire, che sfrutta un solo filo come dato e clock.
Il protocollo 1Wire non lo conosco (non ho mai avuto occasione di lavorarci), quindi non so aiutarti più di quanto non possa fare il data sheet.
Se vuoi sperimentare col bus 1Wire per comunicare col DS1820 é un discorso, se invece vuoi imparare ad usare l'I2C é un altro.

CITAZIONE
per quanto riguarda l'indirizzamento dello slave, ancora non ci sono, non riesco a trovare materiale chiaro....guardo ancora.

........forse é proprio per quello che non riuscivi a capire il discorso dello slave address: nel protocollo 1Wire i dati viaggiano in altro modo.
 
Top
118 replies since 5/1/2011, 18:32   3477 views
  Share