Hi, I've been working today on a protocol to send data between a master and many slaves, the thing is that, I cannot receive the data properly, I mean, the slave, won't answer properly, these are my codes.
Master Code:
#include <Wire.h>
// Global Variables and definitions
#define DataRefreshSpeed 1000000
uint32_t Time;
uint32_t LastDataRefreshTime;
// Device Structure
struct Device_Structure
{
bool Ready;
uint8_t DeviceIdentifier;
uint8_t Adress;
};
Device_Structure Device[16];
// I2C////
// Protocol Data Definitions
#define I2C_MaxBuffSize 256
#define I2C_Header1 246
#define I2C_Header2 254
#define I2C_MessageEnd1 250
#define I2C_MessageEnd2 232
//byte 1
#define SystemRequest 0
#define DataRequest 1
//System Request Messages
#define Handshake 0
//Device Id Definitions
#define CLOCK_DEVICE_ID 1
//Clock Request Messages
#define PlayData 0
struct I2C_Request
{
bool Ready;
uint8_t Message[10];
uint8_t Size;
};
struct I2C_Struct
{
bool H1;
bool H2;
bool EF1;
bool DataRecieved;
uint8_t Pointer;
uint8_t Buffer[I2C_MaxBuffSize];
I2C_Request Request;
};
I2C_Struct I2C;
void setup()
{
Serial.begin(115200);
Wire.begin();
DeviceStructures_Setup();
I2C_Handshake(1);
}
void loop()
{
Time = micros();
RefreshAllData(Time);
}
// Setup Functions
void DeviceStructures_Setup()
{
Device[ 0].Adress = 1;
Device[ 1].Adress = 2;
Device[ 2].Adress = 3;
Device[ 3].Adress = 4;
Device[ 4].Adress = 5;
Device[ 5].Adress = 6;
Device[ 6].Adress = 7;
Device[ 7].Adress = 8;
Device[ 8].Adress = 9;
Device[ 9].Adress = 10;
Device[10].Adress = 11;
Device[11].Adress = 12;
Device[12].Adress = 13;
Device[13].Adress = 14;
Device[14].Adress = 15;
Device[15].Adress = 16;
}
// Loop Functions
void RefreshAllData(uint32_t t)
{
if( t - LastDataRefreshTime > DataRefreshSpeed)
{
for(uint8_t i = 0; i< 16; i++)
{
if(Device[i].Ready)
{
switch(Device[i].DeviceIdentifier)
{
case CLOCK_DEVICE_ID: RequestClockData( PlayData, i); break;
default: break;
}
}
}
LastDataRefreshTime = t;
}
}
// I2C Functions
void I2C_Handshake(uint8_t x)
{
uint8_t FailCount = 0;
uint8_t MessageSize = 7;
I2C_HandshakeRetry:
uint8_t Message[7];
Message[0] = I2C_Header1; // Header1
Message[1] = I2C_Header2; // Header2
Message[2] = SystemRequest; // Type of Message
Message[3] = Handshake; // MessageNumber
Message[4] = 0; // xxxxx
Message[5] = I2C_MessageEnd1; // First End Of message Flag
Message[6] = I2C_MessageEnd2; // Second End Of message Flag
Wire.beginTransmission(Device[x].Adress);
Wire.write(Message,MessageSize);
Wire.requestFrom(Device[x].Adress,5);
if(Wire.available())
{
uint8_t Message[5];
Message[0] = Wire.read();
Message[1] = Wire.read();
Message[2] = Wire.read();
Message[3] = Wire.read();
Message[4] = Wire.read();
if(Message[0] == I2C_Header1 & Message[1] == I2C_Header2 & Message[3] == I2C_MessageEnd1 & Message[4] == I2C_MessageEnd2)
{
String str;
switch(Message[2])
{
case CLOCK_DEVICE_ID: str = "Clock"; Device[x].DeviceIdentifier = CLOCK_DEVICE_ID; Device[x].Ready = 1; break;
}
Serial.print("Device ");Serial.print(Device[x].Adress);Serial.print(" - Properly Ennumerated as: ");
Serial.print(str); Serial.println(".");
}
}
else
{
delay(100);
FailCount ++;
if(FailCount>5)
{
Serial.print("Handshake Timeout: Device - "); Serial.print(Device[x].Adress); Serial.println(".");
return;
}
goto I2C_HandshakeRetry;
}
Wire.endTransmission();
}
void RequestClockData(uint8_t Message, uint8_t x)
{
switch(Message)
{
case PlayData:
uint8_t MessageASize = 7;
uint8_t MessageA[7];
MessageA[0] = I2C_Header1; // Header 1
MessageA[1] = I2C_Header2; // Header 2
MessageA[2] = DataRequest; // Type of Message
MessageA[3] = PlayData; // MessageNumber
MessageA[4] = 0; // xxxx
MessageA[5] = I2C_MessageEnd1; // First End Of message Flag
MessageA[6] = I2C_MessageEnd2; // Second End Of message Flag
Wire.beginTransmission(Device[x].Adress);
Wire.write(MessageA,MessageASize);
Wire.requestFrom(Device[x].Adress,7);
if(Wire.available())
{
uint8_t Message[7];
Message[0] = Wire.read();
Message[1] = Wire.read();
Message[2] = Wire.read();
Message[3] = Wire.read();
Message[4] = Wire.read();
Message[5] = Wire.read();
Message[6] = Wire.read();
Serial.println(Message[0]);
Serial.println(Message[1]);
Serial.println(Message[2]);
Serial.println(Message[3]);
Serial.println(Message[4]);
Serial.println(Message[5]);
Serial.println(Message[6]);
Serial.println();
Serial.println();
if(Message[0] == I2C_Header1 & Message[1] == I2C_Header2 & Message[5] == I2C_MessageEnd1 & Message[6] == I2C_MessageEnd2)
{
Serial.println("Succesfully Recieved Clock Data");
}
}
break;
}
}