Go Down

Topic: Bus I2C - MultiMaster + RTC + EEPROM (Read 2427 times) previous topic - next topic

zoroastre

Jan 14, 2012, 09:20 am Last Edit: Jan 19, 2012, 10:55 pm by zoroastre Reason: 1
Yep!

Je commence à penser et réunir les composants pour construire une carte bi-processeur à base de AT644 (dip), alias "core2duino". Le premier proc pour les applications rapides et le second pour le reste.
Il existe déjà des sujets pour faire communiquer des microcontrolleurs sur le bus I2C en maitre/esclave.
Mon projet incluera un module RTC (I2C ?) et probablement une EEPROM (en I2C aussi ?).

Mon problème se situe sur le choix des composants et sur la méthode de communication entre plusieurs péripheriques sur un bus I2C, il faut un adressage pour chacun des composants et certainement une détection/libération du bus lors des appels.
Le module RTC n'a pas besoin d'être présenté, quant à l'EEPROM, elle me servirait de mémoire tampon et au stockage de données statiques.

J'aimerais faire communiquer tout ce petit monde via le bus I2C (2 atmel + RTC + EEPROM). Mes compétences en électroniques sont ce qu'elles sont, plutôt faible...

Alors, est-ce possible et comment ?

@+

Zoroastre.
Gné! ;)

al1fch

#1
Jan 14, 2012, 11:47 am Last Edit: Jan 14, 2012, 12:15 pm by al1fch Reason: 1
Bonjour

Le plus simple serait de pouvoir arriver à rester dans le 'classique' = Un seul maître.
Le second micro , esclave, en 'coprocesseur' en quelque sorte. Eventuellement en coprocesseur qui peut  se manifester au maître par interruptions externes.......

Ce que tu as en vue relève peut être par contre du fonctionnement en multi-maître.
Ton EEPROM doit peut être être accessible aux deux micros ('boite aux lettres ?)
Sur le papier le multi-maître  est à priori possible
Le 644 integre quelques fonctionnalités hard pour ça (arbitrage) dans son module TWI.
Est-ce que ça (multi maître) été déjà exploité avec succès sous Arduino ?
Il y a sans doute du défrichage à faire, peut être même une librairie à développer.

Un fin connaisseur de la librairie wire saura dire ses limites et ses astuces.
Dans le 'playground' il y a un exemple de communication entre deux micros (1 maitre , 1 escclave)

zoroastre

Yep!

Merci pour ta réponse al1fch ;)

Quote
Ton EEPROM doit peut être être accessible aux deux micros

Oui, ce serait ideal.

Il est tout à fait possible de faire communiquer 2 arduino par le bus I2C. (maitre/esclave)
Il est tout à fait possible d'avoir 1 arduino et 1 RTC + 1 EEPROM sur bus I2C. Les modules devront être adressés et adressables.

Quant à mixer tout cela ???

Le bus I2C me semble être le protocole fait pour çà. Je regarderais ce qui existe en module I2C...J'ai pour l'instant l'essentiel des composants, sauf l'eeprom.

@+

Zoroastre.
Gné! ;)

zoroastre

#3
Jan 14, 2012, 07:19 pm Last Edit: Jan 14, 2012, 07:25 pm by zoroastre Reason: 1
Yep!

Apparement la librairie Wire.h possède bien les specs "multimaster". C'est pas super bien documenté.

Je pense tester d'abord la solution la plus simple : maitre/esclave

@+

Zoroastre.
Gné! ;)

skywodd

Salut,

Pour avoir plusieurs maitre I2C avec wire il faut que chacun est un Wire.begin(xx) avec xx une adresse différente, ensuite il suffit d'utiliser les interruptions Wire.onRequest et Wire.onReceive pour gérer les données/requêtes qui arrive.

Faudrait aussi faire une liaison entre les deux arduino sur une broche digital pour que les deux arduino ne rentre pas en conflit, par exemple si D2 == HIGH tu attend, des que D2 == LOW tu peut parler, ... dés que l'arduino n communique en I2C il placerait sa broche D2 à HIGH pour bloquer l'autre arduino, puis la replacerai à LOW pour libérer le bus I2C.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

zoroastre

#5
Jan 19, 2012, 10:08 pm Last Edit: Jan 19, 2012, 10:20 pm by zoroastre Reason: 1
Yep!

Je me documente, je me documente.

A priori, le mode multimaitre accepte jusqu'à 8 maitres simultanément.
2 arduino communiquent en maitre/esclave, au delà il faut utiliser le mode multimaitre.

Pour utiliser le mode multimaitre, il suffit, si j'ai bien compris, de ne pas déclarer son adresse --> Wire.begin().

"The documentation as currently written states that for Wire.begin(address), the address is optional and 'if not specified, join the bus as a master'" http://digitalcave.ca/resources/avr/arduino-i2c.jsp
& http://blog.unthinkmedia.com/2010/05/05/multi-master-arduino-setup-using-i2c/

Il faut également considérer qu'il y a des règles de priorité. Le péripherique qui a écrit le plus de zero est prioritaire. Le péripherique le plus lent a la priorité. De plus, détection de collision si au moins deux maitres. Le protocole I2C semble robuste et gère parfaitement le multimaitre.

Faut que je regarde comment gérer la reception en cas de communication entre maitres !!!

Quote
Wire.onReceive(handler)
semble adapté...

@+

Zoroastre.


Gné! ;)

Go Up