i limiti di I2C

salve ragazzi, dovrei connettere alcune MCU tramite I2C. il problema che mi sorge è che dovrebbero essere gli slave a "decidere" quando inviare i dati al master e non viceversa, ma dando uno sguardo a Wire mi pare che il master possa leggere i dati sul bus solo dopo aver inviato la richiesta allo slave specifico con requestFrom(). ho fatto una prova, facendo scrivere qualcosa dallo slave sul bus, ma il master con .available() non rileva nulla. c'è qualche scappatoia da questo vicolo cieco?

Mi pare debba usare OnReceive() --> http://playground.arduino.cc/Main/WireLibraryDetailedReference#onReceive C'è anche una funzione OnReceiveService ma dovresti guardare il codice della libreria per capire come funziona.

uhm... non credo sia così. dal reference:

onReceive(handler) Sets a function ("handler") to be called after the ATmega has received data as an I2C slave

il mio inglese non è egregio, e a dire il vero ho qualche dubbio sul significato di questa frase, ma credo di aver capito che: onReceive() imposta una funzione che viene richiamata dopo che l'MCU (slave) ha ricevuto dei dati. non è questo il caso che mi interessa.

mi viene il dubbio che questo possa essre un "limite fisico" dell'I2C. ovvero che il bus può essere abilitato soltanto dal master :relaxed:

Esatto, è il master, o i master (in una configurazione multi-master) che comandano il colloquio.

Purtroppo non se se esiste una libreria per Arduino per gestire il multi-master ... :roll_eyes:

Guglielmo

…come temevo.

quindi…
potrei usare un pin di controllo per far sì che lo slave dica al master: “Chiamami!”
però a questo punto si potrebbe anche far fare al master una scansione di tutti gli slave ad ogni loop.

mi sa che più o meno è uguale.

nel frattempo ho trovato qualche post sul multi-master. ora me li leggo.

EDIT
per una applicazione multi-MCU cosa mi consigliate I2C o seriale?
al momento sono solo due, ma per lasciare spazio a future espansioni mi sono orientato sull’I2C, ma forse la seriale è più indicata e facile da gestire?

Se devi usare un pin, a quel punto usa il bus SPI che è ancora più veloce ... ed il pin che usi, lo usi come CS ...

Per "cosa usare" tra i vari sistemi, dipende molto ... a che distanze ???

Guglielmo

gpb01:
… a che distanze ???

sulla stessa basetta. pochi cm.

Ah bé ... allora, se sei disposto a sacrificare dei pin ... SPI è velocissimo ... altrimenti l'idea del "poll" ciclico dei vari devices in I2C va ugualmente bene e risparmi tutti i pin di CS ...

Guglielmo

con SPI avrei lo stesso problema: lo slave non può parlare senza il consenso (CS) del master. forse mi affido alla seriale, i dati sono pochi e poco frequenti, in più ho il serialEvent() che mi semplifica molto.

E sulla seriale ... come connetti più devices "master" senza una gestione delle collisioni ???

Guglielmo

per ora abbandono l'idea di eventuali espansioni future. con due device non ci sono problemi. eventualmente le espansioni potrei farle usando SPI o I2C di uno dei due micro principali.