Che cosa è cmd param in write_i2c_block_data


12

Sto testando la comunicazione i2c tra Pi e Arduino.

Il documento dice:

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

Ho questo test:

Su Pi:

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

Su Arduino:

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

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

Su Arduino vedo questo output:

byte count=4
0123

La mia domanda è: a che serve questo cmdparametro? Non vedo una distinzione su Arduino di quale byte rappresenta cosa.
Immagino di poterlo gestire come si vede. Forse voglio usare i primi 2 byte come comando.

Questa pagina non contiene molte informazioni sul metodo: http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc


Potresti voler definire qual è il cmdparametro ... Ho dovuto fare un bel po 'di cercare di capire cosa volevi dire. Non ho trovato una risposta però ... Può essere utilizzato solo da chip specifici come un espansore GPIO o qualcosa del genere ...
Butters

Ok, ho aggiunto il link alla documentazione (che non è molto)
Gus Smith il

6
Non ho tempo per dare una risposta completa in questo momento (spero che qualcuno lo farà) ma in breve: ecco come funziona I²C. Il master può semplicemente inviargli alcuni byte di dati (dopo aver inviato l'indirizzo corretto) e non esiste alcuna specifica su cosa siano effettivamente quei byte (il loro significato è definito per dispositivo). Accade solo che il primo byte sia spesso un numero di comando (o registro). Inoltre devi sempre inviare almeno un byte in modo diverso vals, cmdè obbligatorio.
Krzysztof Adamski il

1
@KrzysztofAdamski Mi sembra una risposta abbastanza completa.
Butters,

Risposte:


8

I²Cil protocollo è molto semplice. In realtà non definisce le strutture di dati che vengono inviate via cavo. Il frame è costituito da un indirizzo slave (con bit di direzione che indica se il master desidera leggere o scrivere) e (in caso di scrittura) alcuni byte di dati. Poiché non ha senso avviare la scrittura con 0 byte di dati, il primo byte è obbligatorio.

Questo primo byte viene spesso utilizzato come indirizzo del registro slave o numero di comando, ma non è necessario. Potrebbero esserci o meno byte aggiuntivi dopo il primo. Il protocollo di livello superiore che definisce cosa significa ogni byte è specifico del dispositivo.

Questo può spiegare perché ci sono due argomenti separati: il primo ( cmd) è obbligatorio e il secondo ( vals) è facoltativo. Mentre il tuo esempio è in Pythonlingua, l'API utilizzata qui è in realtà una mappatura molto stretta Cdell'API originale in cui non è possibile creare facilmente argomenti opzionali.


Questa è una spiegazione un po 'più lunga di ciò che ho scritto nel commento sotto la domanda.
Krzysztof Adamski,

Sono contento che tu l'abbia fatto! Questo tipo di semplice, ma "aha!" le spiegazioni sono davvero utili alcune volte, come oggi :-)
uhoh

3

Quando si emette un blocco scrivere / leggere dal Pi con:

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

o

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

Due cose possono accadere (possono) su Arduino a seconda della lettura o della scrittura.

Il byte cmd è il primo byte scritto sul bus I2C dal Pi, viene sempre inviato come richiesta di "scrittura". Ciò significa che se il Pi sta emettendo un

bus.read_i2c_block_data

o

bus.write_i2c_block_data

prima scrive

cmd

al bus I2C prima che legga .

Questa è una funzione utile perché alcuni hardware I2C richiedono l'inizializzazione prima di poter effettuare una lettura.

Su Arduino questo significa che:

Prima il,

Wire.onReceive(yourCallback)

la funzione viene chiamata perché è cmdstata scritta sul bus dal Pi. cmdsarà il primo byte disponibile sul bus. Se il Pi ha inviato una richiesta di scrittura rispetto ad Arduino rimarrà nel callback Wire.onReceive fino al completamento della funzione. Se il Pi ha inviato una richiesta di lettura, Arduino completerà Wire.onReceive, quindi chiamerà il callback Wire.onRequest.

È necessario assicurarsi che il valore inserito in cmd non provochi comportamenti involontari nel sistema gestendo in modo appropriato il suo valore. Se, ad esempio, la richiamata Wire.onReceive spegne un LED quando Wire.read = 0x30. Quindi, anche se si invia una richiesta di lettura , si spegne innanzitutto il LED scrivendo 0x30, quindi si leggono i byte richiesti dal bus.


1

Sto scrivendo su un LCD I2C, il Newhaven NHD ‐ 0216K3Z ‐ FL ‐ GBW ‐ V3. La scheda tecnica può essere cercata su Google. Nel suo caso, quando il byte di comando è 0xfe significa che il seguente byte è un comando - ce ne sono circa 20. Cancella, retroilluminazione, cursore lampeggiante e così via. Se cmd non è 0xfe è solo un carattere da visualizzare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.