Para unirse al bus como maestro, no puede proporcionar una dirección de esclavo de 7 bits, por lo que su código tiene dos esclavos.
A continuación encontrará 2 bocetos que envían datos con éxito a un esclavo. Le sugiero que empiece a mirar el protocolo I2C y comprenda que hay 4 modos:
- Maestro-> Transmisor
- Maestro-> Receptor
- Esclavo -> Transmisor
- Esclavo-> Receptor
Todas las comunicaciones, independientemente de cómo se transfieran los datos, requieren un maestro. Es el maestro que controla los pulsos del reloj, por eso siempre es el maestro el que inicia la comunicación.
Los tutoriales de MasterReader / MasterWriter en el foro de arduino ahora posiblemente debería comenzar a tener un poco más de sentido al comprender esos modos.
Este código muestra cómo un maestro envía datos a un esclavo, y luego cómo solicita datos al esclavo. Si miramos este código desde el punto de vista maestro, puede ver que esencialmente dice, envíe este byte al cliente (m-> t & s-> r), luego solicite datos al esclavo (m-> r, s-> t)
Código maestro
#include <Wire.h> # define SLAVE_ADDRESS 0x60void setup () {Wire.begin ( ); randomSeed (analogRead (3)); Serial.begin (9600); } byte x = 0; bucle vacío () {x = aleatorio (0,255); Serial.print ("Enviado:"); Serial.print (x, HEX); Serial.print ("\ n"); Wire.beginTransmission (0x60); Wire.write (x); Wire.endTransmission (); retraso (500); Serial.println ("Solicitud de datos"); Wire.requestFrom (SLAVE_ADDRESS, 1); int bytes = Wire.available (); Serial.print ("Esclavo enviado"); Serial.print (bytes); Serial.print ("de información \ n"); para (int i = 0; i< bytes; i ++) {x = Wire.read (); Serial.print ("Esclavo enviado:"); Serial.print (x, HEX); Serial.print ("\ n"); } delay (500);}
Código esclavo
#include <Wire.h> # define SLAVE_ADDRESS 0x60byte x = 0x00; configuración vacía () {Wire.begin (SLAVE_ADDRESS);
Wire.onReceive (ReceiveEvent); Wire.onRequest (requestEvent); Serial.begin (9600);} void loop () {delay (100);} void requestEvent () {Serial.print ("Solicitud del maestro. Enviando:"); Serial.print (x, HEX); Serial.print ("\ n"); Wire.write (x);} void receiveEvent (int bytes) {if (Wire.available ()! = 0) {for (int i = 0; i< bytes; i ++) {x = Wire.read (); Serial.print ("Recibido:"); Serial.print (x, HEX); Serial.print ("\ n"); }}}