62 lines
1.6 KiB
C++
62 lines
1.6 KiB
C++
#define TAILLE_MEMOIRE_I2C 256
|
|
#define TAILLE_MESSAGE_ENVOI_MAX 32
|
|
byte memoire_I2C[TAILLE_MEMOIRE_I2C];
|
|
byte memoire_I2C_index=0;
|
|
|
|
bool nouveau_message=false;
|
|
|
|
uint8_t * get_i2c_data(){
|
|
return memoire_I2C;
|
|
}
|
|
void onRequest(){
|
|
uint32_t taille_envoi;
|
|
taille_envoi = min (TAILLE_MEMOIRE_I2C-memoire_I2C_index, TAILLE_MESSAGE_ENVOI_MAX);
|
|
|
|
Wire.write(&memoire_I2C[memoire_I2C_index], taille_envoi);
|
|
memoire_I2C_index += taille_envoi;
|
|
if(memoire_I2C_index>=TAILLE_MEMOIRE_I2C){
|
|
Serial.printf("memoire_I2C_index>=TAILLE_MEMOIRE_I2C\n");
|
|
}
|
|
}
|
|
|
|
void onReceive(int len){
|
|
memoire_I2C_index = Wire.read();
|
|
while(Wire.available()){
|
|
nouveau_message=true;
|
|
memoire_I2C[memoire_I2C_index] = Wire.read();
|
|
memoire_I2C_index++;
|
|
}
|
|
//Serial.printf("I2C reg: %d, val %d\n", memoire_I2C_index, memoire_I2C[memoire_I2C_index]);
|
|
}
|
|
|
|
void I2C_Slave_init(int addr){
|
|
Wire.onReceive(onReceive);
|
|
Wire.onRequest(onRequest);
|
|
Wire.begin(addr);
|
|
}
|
|
|
|
bool I2C_Slave_nouveau_message(){
|
|
if(nouveau_message){
|
|
nouveau_message=false;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void I2C_envoi_8bits(byte value, char adresse){
|
|
//printf("I2C_envoi_8bits a:%d v:%d %x %b\n",adresse, value, value, value);
|
|
memoire_I2C[adresse] = value;
|
|
}
|
|
|
|
void I2C_envoi_16bits(int16_t value, char adresse){
|
|
memoire_I2C[adresse] = (value >> 8) & 0xFF;
|
|
memoire_I2C[adresse+1] = value & 0xFF;
|
|
}
|
|
|
|
void I2C_envoi_32bits(int32_t value, char adresse){
|
|
memoire_I2C[adresse] = value >> 24;
|
|
memoire_I2C[adresse+1] = (value >> 16) & 0xFF;
|
|
memoire_I2C[adresse+2] = (value >> 8) & 0xFF;
|
|
memoire_I2C[adresse+3] = value & 0xFF;
|
|
}
|