Problema con i2c arduino <--> RPI4 [SOLUCIONADO]

Muy buenas;
antes de nada decir que no soy nuevo en el foro pero se me olvido mi otra cuenta.

Bueno al lio
el tema es que tengo un proyecto realizado con varios arduinos que se comunican entre ellos via i2c.
Es decir uno me actua como maestro y el resto esclavos. el tema es que el maestro se me está quedando corto para manejar los datos del resto de arduinos y me interesaria ademas meterle mas funcionalidades por lo que he optado por hacer un "upgrade" del maestro a RPI4. el tema es que con python soy nuevo asi que voy empezando las cosas poco a poco. A fin de ir familiarizandome con la conexion arduino <--> RPI4 he creado un programilla muy simple.

en el lado del arduino

#include <Wire.h>

byte Datos_recibidos[]={0,0,0,0}; //array donde guardo lo que recibo de la RPI
byte Datos_enviar[]={210,25,36,285}; //array que mando a la RPI



const byte esclavo=0x08; //Dirección i2c del arduino

void setup {
    
   Wire.begin(esclavo); //me uno al bus i2c como esclavo en direccion 0x08
   Serial.begin(9600); // para ver el monitor Serial
   
   Wire.onRequest(RequestData); //Si el maestro pide datos se llama a esta funcion
   Wire.onReceive(ReceiveData); //Si el maestro manda datos se llama a esta funcion

}

void ReceiveData(int Datos_recibir){

   Serial.println("Recibiendo datos");
   Serial.println();
   While(Wire.available()){ //mientras haya datos...
      for (int i = -1; i <= 3; i++){
         Datos_recibidos[i] = Wire.read(); //leelos byte a byte y vete cargando el array
      }
   }
   Serial.print("El array recibido es: [") //Mostramos el array por monitor Serial para verificar
   Serial.print(Datos_recibidos[0]);
   Serial.print(", ");
   Serial.print(Datos_recibidos[1]);
   Serial.print(", ");
   Serial.print(Datos_recibidos[2]);
   Serial.print(", ");
   Serial.print(Datos_recibidos[3]);
   Serial.println("]");
   Serial.println();
}

void RequestData(){

   Serial.println("Enviando datos a RPI");
   Serial.println();
   Wire.write(Datos_enviar); //Enviamos los datos a la RPI
   Serial.println("Datos enviados");
   Serial.println();
}

void loop(){
}

en el lado de la RPI4 uso python3

import smbus #importamos el modulo
import time

bus = smbus.SMBus(1) #Creamos el objeto usando el bus 1 de la RPI

Datos_para_enviar = [125,154,201,65]
Datos_para_recibir = [0x00,0x00,0x00,0x00]

escalvo = 0x08 #direccion del esclavo con el que queramos comunicar

try:
    print("vamos a enviar datos")
    bus.write_i2c_block_data(0x08,0x00,Datos_para_enviar)
    # el 0x08 es la direccion del esclavo con la que comunico
    # el 0x00 es la direccion del registro, no entiendo muy bien como va esto pero poniendo esto funciona
    # el tercer parametro es la lista que envio
    sleep(2)
    print("Datos enviados")
except:
    print("fallo comunicacion enviando")

try:
    print("Vamos a recibir datos")
    Datos_para_recibir=bus.read_i2c_block_data(0x08,0x00,4)
    # el 0x08 es la direccion del esclavo con la que comunico
    # el 0x00 es la direccion del registro, no entiendo muy bien como va esto pero poniendo esto funciona
    # el tercer parametro es la cantidad de bytes que espero recibir
    sleep(2)
    print("Datos recibidos")
    print(Datos_para_recibir)
except:
    print("fallo comunicacion recibiendo")

Como veis es sencillito para empezar. Pues el tema es que no funciona el la RPI me da continuamente "fallo comunicacion enviando". he probado a comentar trozos de codigo con los siguientes resultados:

He realizado las siguientes pruebas:

  1. en la RPI he comentado el trozo para el envio, en el arduino he comentado el trozo para la recepcion; el resultado: si la RPI pide datos el arduino los manda correctamente.
  2. en la RPI he comentado el trozo para la recepcion, en el arduino he comentado el trozo para el envio; resultado: si la RPI manda datos el arduino los recibe correctamente.
  3. en la RPI he comentado el trozo para el evio, en el arduino he dejado el CODIGO COMPLETO; el resultado: al pedir la RPI datos se ve en el monitor serial que se ha llamado a la funcion para recibir datos y luego se llama a la de enviar datos a la RPI y los datos se envian correctamente.

La verdad es que no sé en que estoy fallando lo he repasado una y otra vez y siento que algo se me escapa pero no acierto a saber ni donde ni como

por otro lado tambien he visto por ahi investigando acerca de esto que en python

.write_i2c_block_data y .read_i2c_block_data solo mandan bloques de hasta 32 bytes, ¿sabeis si existe alguna forma de "tunearlo" para que admita cualquier tamaño de bloques? necesito mandar unos 100 bytes y en arduino lo habia logrado tocando un poco la libreria wire.
muchas gracias por su tiempo
un saludo

Hola @ erikblade9 bienvenido de regreso al foro Arduino.

Tengo una consulta antes de analizar el código del RPi.
La consulta es si tienes level shifter para la comunicación Arduino <=> RPi.
RPi trabaja a 3.3V y como los Arduinos no sean de 3.3V necesitas usar adaptadores de nivel.

gracias por su respuesta;

si efectivamente tengo level_shifter para la conexión.

buenas parece que he podido solucionarlo;

no se muy bien el porque ocurria el problema pero usando en python la libreria smbus2 en vez de la smbus e i2c_rdwr lo he logrado echar a andar