Significado de cmd param en write_i2c_block_data

12

Estoy probando la comunicación i2c entre Pi y Arduino.

El documento dice:

write_i2c_block_data(addr,cmd,vals)  Block Write transaction.    int addr,char cmd,long[]    None

Tengo esta prueba:

En Pi:

import smbus
bus = smbus.SMBus(0)
bus.write_i2c_block_data(address, 48, [49, 50, 51] )

En Arduino:

void receiveData(int byteCount){
    Serial.print("byte count=");
    Serial.println(byteCount);

    while(Wire.available()) {
        number = Wire.read();
        Serial.print((char)number);
     }
}

En el Arduino veo esta salida:

byte count=4
0123

Mi pregunta es: ¿para qué sirve el cmdparámetro? No veo una distinción en el Arduino de qué byte representa qué.
Supongo que puedo tratarlo como mejor me parezca. Tal vez quiero usar los primeros 2 bytes como comando.

Esta página no tiene mucha información sobre el método: http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc

Gus Smith
fuente
Es posible que desee definir cuál es el cmdparámetro ... Tuve que hacer un buen esfuerzo para averiguar qué quería decir. Sin embargo, no encontré una respuesta ... Solo puede ser utilizado por chips específicos como un expansor GPIO o algo así ...
Butters
Ok, agregué el enlace a la documentación (que no es mucho)
Gus Smith
66
No tengo tiempo para dar una respuesta completa en este momento (espero que alguien lo haga), pero en resumen: así es como funciona I²C. Master solo puede enviarle algunos bytes de datos (después de enviar la dirección correcta) y no hay una especificación sobre cuáles son esos bytes en realidad (su significado se define por dispositivo). Sucede que el primer byte suele ser un número de comando (o registro). Además, siempre debe enviar al menos un byte, por lo que vals, a diferencia de esto , cmdes obligatorio.
Krzysztof Adamski
1
@KrzysztofAdamski Eso me parece una respuesta bastante completa.
Butters

Respuestas:

8

I²CEl protocolo es muy simple. Realmente no define las estructuras de datos que se envían por cable. La trama consiste en una dirección esclava (con bit de dirección que indica si el maestro quiere leer o escribir) y (en caso de escritura) algunos bytes de datos. Como no tiene sentido iniciar la escritura con 0 bytes de datos, el primer byte es obligatorio.

Este primer byte a menudo se usa como dirección de registro esclavo o número de comando, pero no es necesario. Puede haber o no bytes adicionales después del primero. El protocolo de nivel superior que define qué significa cada byte es específico del dispositivo.

Esto puede explicar por qué hay dos argumentos separados: el primero ( cmd) es obligatorio y el segundo ( vals) es opcional. Si bien su ejemplo está en el Pythonlenguaje, la API utilizada aquí es en realidad una asignación muy cercana de la CAPI original donde no puede crear fácilmente argumentos opcionales.

Krzysztof Adamski
fuente
Esta es una explicación un poco más larga de lo que escribí en el comentario debajo de la pregunta.
Krzysztof Adamski
¡Me alegra que lo hayas hecho! Este tipo de simple, pero "¡ajá!" las explicaciones son realmente útiles algunas veces, como hoy :-)
uhoh
3

Cuando emite un bloque, escriba / lea desde el Pi con:

bus.write_i2c_block_data(address, 48, [49, 50, 51] )

o

bus.read_i2c_block_data(address, 48, [49, 50, 51] )

Dos cosas suceden (pueden) en el Arduino dependiendo de leer o escribir.

El byte cmd es el primer byte escrito en el bus I2C desde el Pi, siempre se envía como una solicitud de "escritura". Esto significa que si el Pi está emitiendo un

bus.read_i2c_block_data

o

bus.write_i2c_block_data

primero escribe

cmd

al bus I2C antes de que se lea .

Esta es una característica útil porque algunos hardware I2C requieren inicialización antes de poder realizar una lectura.

En el Arduino esto significa que:

Primero el,

Wire.onReceive(yourCallback)

Se llama a la función porque cmdfue escrita en el bus por el Pi. cmdserá el primer byte disponible en el autobús. Si el Pi envió una solicitud de escritura, Arduino permanecerá en la devolución de llamada Wire.onReceive hasta que se complete la función. Si el Pi envió una solicitud de lectura, el Arduino completará Wire.onReceive y luego llamará a la devolución de llamada Wire.onRequest.

Debe asegurarse de que el valor colocado en cmd no cause un comportamiento no deseado en su sistema al manejar adecuadamente su valor. Si, por ejemplo, su devolución de llamada Wire.onReceive apaga un LED cuando Wire.read = 0x30. Luego, incluso si envió una solicitud de lectura , primero APAGARÍA el LED escribiendo 0x30 y luego leería los bytes solicitados desde el bus.

deltatango
fuente
1

Estoy escribiendo en un LCD I2C, el Newhaven NHD ‐ 0216K3Z ‐ FL ‐ GBW ‐ V3. Su hoja de especificaciones se puede buscar en Google. En su caso, cuando el byte de comando es 0xfe, significa que el siguiente byte es un comando: hay aproximadamente 20 de ellos. Claro, luz de fondo, parpadeo del cursor, etc. Si cmd no es 0xfe, es solo un carácter para mostrar.

trineo de perros
fuente