Je suis actuellement sur une aplication avec 5 ARDUINO UNO, qui communiquent en I2C.
Mes commandes du Maitre vers les esclaves marche bien.
Et les retours vers le maitre en utilisant => Wire.write("ABCD")
fonctionne aussi.
Mais je n'arrive pas à récupérer plus de 1 octet de valeurs (en 8bits) avec la fonction: Wire.requestFrom(slave_adress, 4) // Par exemple.
Voici mes bouts de code pour récupérer des valeurs. Avez vous une solution? MERCI
MAITRE:
void setup(){
Wire.begin(0); // le Maitre est sur l'adresse #0
}
-Standby:
Peut être que la question est mal comprise mais la tu récupère 4 * 8bits donc 4 octets.
En fait avec ce code je ne récupère que la DATA4 du SLAVE, qui est atribué à s_DAT1 sur le MAITRE.
Avant je faisait du Microship (PIC16 et PIC18), et je n'avais pas de problème de ce genre, car je maitrisais l'arrivé des octets avec les "Acknoledge".
Mais sur Arduino avec la Librairie, je ne vois pas ce qu'il se passe pendant la transmission, mais le resulat du cas présenté, donne que seul le dernier Wire.write du SLAVE remonte et est stocker par le premier Wire.read du Maitre.
Je cherche donc une solution pour que la data 1 du SLAVE arrive dans la variable 1 du MAITRE, la 2 avec la 2... ect...
En principe, côté maître tout se joue dans la fonction requestFrom, qui attend l'arrivée de la quantité d'octets demandée ou bien l'expiration d'un time out.
Cette fonction retourne la valeur 0 si la quantité reçue ne correspond pas à celle demandée.
Il pourrait être utile de vérifier ce que retourne requestFrom
Je pense que ta fonction slave n'envoie pas un paquet de 4 octets mais 4 paquets de 1 octet. Ce qui du point de vue protocolaire n'est pas la même chose.
Essaye ça:
fdufnews:
Je pense que ta fonction slave n'envoie pas un paquet de 4 octets mais 4 paquets de 1 octet. Ce qui du point de vue protocolaire n'est pas la même chose.
Essaye ça:
En fait le problème est dans la librairie twi qui est en-dessous de Wire.
La fonction write écrase le tampon à chaque nouveau write. Lorsque tu envoies 4 write consécutifs, seul le dernier "survit". Alors que lorsque tu passes un tableau en argument, celui-ci est copié dans le tampon d'émission.
Peu importe que l'appel soit Wire.write(octet) ou Wire.write(buffer,longueur)
Si on est esclave, la fonction write() déclenche immédiatement la primitive twi d'envoi
Si on est maître, la fonction write() ne fait qu'alimenter un buffer interne à la librairie Wire, et c'est la fonction endTransmission() qui déclenche la primitive twi d'envoi