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 cmd
pará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
cmd
pará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í ...vals
, a diferencia de esto ,cmd
es obligatorio.Respuestas:
I²C
El 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 elPython
lenguaje, la API utilizada aquí es en realidad una asignación muy cercana de laC
API original donde no puede crear fácilmente argumentos opcionales.fuente
Cuando emite un bloque, escriba / lea desde el Pi con:
o
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
o
primero escribe
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,
Se llama a la función porque
cmd
fue escrita en el bus por el Pi.cmd
será 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.
fuente
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.
fuente