Ecco il mio post dal forum dedicato alla Polo 9N; magari può essere utile a qualcuno.
@Utente originale: Come hai fatto a controllare i singoli pixel? Nella grafica del navigatore della Polo c'è un punto, ma in questo modo il carico sul bus sarebbe molto alto e la costruzione dell'immagine sarebbe molto lenta.
Ecco come appare l'immagine sul display LCD:
https://www.youtube.com/watch?v=eoAqhVP7CjE
Un analizzatore CAN e delle prove effettuate in auto sono essenziali per familiarizzare con la materia. Questo tutorial fornisce un aiuto per comprendere i messaggi presenti sul bus CAN relativi al protocollo di trasporto, al protocollo dei dati del display e all'anello di heartbeat OSEK.
Per poter inviare dati al display MFA, è necessario innanzitutto comprendere il protocollo di trasporto 1.6. Il protocollo dei dati del display viene infatti trasmesso tramite messaggi di dati utili. Originariamente, il TP 1.6 veniva utilizzato per trasmettere dati diagnostici tra il gateway e l'unità di controllo, poiché la linea K non era disponibile.
Cercherò di rendere il tutorial TP 1.6 il più generale possibile, ma lo illustrerò comunque con gli esempi pratici di "Tacho" e "Radio".
[size=150]
Protocollo di Trasporto 1.6[/size]
Flusso di comunicazione fondamentale in TP 1.6:
1. Creazione di un canale di comunicazione e definizione degli identificativi di comunicazione.
2. Scambio di dati relativi al protocollo, ad esempio valori di temporizzazione (già a partire da questo punto, utilizzando gli ID di comunicazione concordati).
3. Trasmissione di dati utente.
4. Cambiata di direzione.
5. Ricezione dei dati utili.
6. Cambio di direzione o interruzione della comunicazione.
// In caso di terminazione, qui si conclude; in caso di cambio di direzione, invece, no!
7. Trasmissione di dati utente.
8. Cambiata di direzione.
9. ECC VIA...
[size=150]
Costruzione del canale di comunicazione[/size]
Quando la radio si accende:
1. La radio chiede informazioni.
2. Tacho risponde.
Quando Tacho inizia:
1. Ciao, come stai?
2. La radio risponde.
Il messaggio per la richiesta e la risposta è composto da 3 byte di dati ed è costituito dall'ID CAN (AAA), dall'ID del dispositivo dell'unità di controllo con cui si deve comunicare (BB).
Codice operativo (CC), ID di comunicazione personalizzata desiderata in seguito (DD).
0xAAA 0xBB 0xCC 0xDD
Il primo passaggio è l'identificatore CAN (AAA).
Ogni partecipante ha un ID base e un ID del dispositivo.
L'ID base della radio è
0x4A0.
L'ID del dispositivo della radio è
0x36 oppure
0x39. Entrambe le opzioni sono possibili, ma per il momento continuerò a considerare
0x36.
L'ID base del tachigrafo è
0x2E0.
L'ID del dispositivo del tachigrafo è
0x08.
Per ottenere l'identificatore della richiesta, si sommano l'ID di base e l'ID del dispositivo.
Radio =
0x4D6
Tachimetro =
0x2E8
Il secondo passaggio è il codice operativo (CC).
Ci sono 3 possibilità:
0xC0 = Richiesta.
0xD0 = Risposta
0xD8 = Rifiuto della comunicazione.
Il terzo passaggio è l'ID di comunicazione (DD).
Si calcola sommando la base
0x600 + l'ID del dispositivo radio
0x36 + un offset specifico del dispositivo per il tachimetro
0x60, radio
0x80, a seconda di chi invia il messaggio.
In questa posizione viene utilizzato l'ID del dispositivo della radio, poiché più partecipanti potrebbero avere contemporaneamente un canale TP aperto verso il tachigrafo.
Da ne risultano gli identificativi di comunicazione:
Contachilometri:
0x696
Radio:
0x6B6
Poiché la base di
0x600 sembra essere ovvia, viene trasmesso solo il byte meno significativo, ovvero per la radio
0xB6 e per il tachimetro
0x96.
Ecco un esempio di un intero processo di comunicazione.
in cui la radio stabilisce la comunicazione:
0x4D6 0x08 0xC0 0xB6
0x2E8 0x36 0xD0 0x96
in cui il tachigrafo stabilisce la comunicazione.
0x2E8 0x36 0xC0 0x96
0x4D6 0x08 0xD0 0xB6
[size=150]
Scambio di dati relativi a protocolli[/size]
Finora tutto bene. La comunicazione è stata stabilita e gli identificatori per le successive trasmissioni sono stati concordati (
0xB6 e
0x96 ).
Ora vengono scambiati dati relativi al protocollo, come la dimensione del blocco (che verrà spiegata in seguito) e i valori di temporizzazione.
Se la radio ha avviato la comunicazione:
Il dispositivo radio trasmette dati relativi a protocolli specifici.
Il tachimetro risponde con dati relativi al protocollo.
Se è il tachigrafo ad aver avviato la comunicazione, allora l'intero processo avviene esattamente al contrario.
Il messaggio è composto da 6 byte di dati e include l'ID CAN (AAA), il codice operativo (BB), la dimensione del blocco (CC) e i valori di temporizzazione (T0 - T3).
0xAAA 0xBB 0xCC 0xT0 0xT1 0xT2 0xT3
Il primo passo è l'ID CAN (AAA).
Da questo punto, fino alla terminazione/conferma del canale TP, verranno utilizzati gli ID di comunicazione dei partecipanti trasmittenti.
Se il radio trasmette il messaggio:
0x6B6.
Il contachilometri:
0x696.
Il secondo passaggio è il codice operativo (BB).
Ecco due possibilità:
0xA0 = Richiesta
0xA1 = Risposta
Il terzo passaggio è la dimensione del blocco (CC).
Die Blockgröße gibt an, ab wieviel gesendeten Nutzdatennachrichten ein Acknowledge erwartet wird. DNe parleremo più tardi.
L'intervallo di valori è compreso tra
0x01 e 0x0F.
Il quarto passaggio riguarda i valori temporali (T0 - T3).
T0: Tempo massimo tra due messaggi (se superato, viene inviata una conferma).
T1: Tempo massimo tra due blocchi.
T2: Tempo minimo tra due messaggi.
T3: Tempo massimo per l'attesa di telegrammi destinati al destinatario.
Ogni byte di temporizzazione è composto da un predivisore a 2 bit e da un moltiplicatore a 6 bit.
( PRESC1 | PRESC0 | MUL5 | MUL4 | ... | MUL0 )
Valori del prescaler:
00 = 100 µS.
01 = 1 mS
10 = 10 milliSecondi (mS)
11 = 100 mS
Valori moltiplicativi:
0x00 - 0x3F
Il divisore di frequenza viene semplicemente moltiplicato per il fattore di moltiplicazione... come suggerisce già il nome.
Ecco un esempio del flusso di comunicazione.
se è la radio ad aver avviato la comunicazione:
0x6B6 0xA0 0x04 0x82 0x84 0x46 0xC5
0x696 0xA1 0x04 0x8A 0x85 0x43 0x94
se è stato il tachigrafo ad avviare la comunicazione:
0x696 0xA0 0x04 0x8A 0x85 0x43 0x94
0x6B6 0xA1 0x04 0x82 0x84 0x46 0xC5
[size=150]
Invio di dati utente[/size]
Un messaggio di dati utili ha una dimensione compresa tra 1 e 8 byte ed è composto dall'ID CAN (AAA), dal byte di controllo (BB) e dai byte di dati utili (D0-D6).
0xAAA 0xBB 0xD0 0xD1 0xD2 0xD3 0xD4 0xD5 0xD6
Il primo passo è l'ID CAN (AAA).
Qui vengono utilizzati nuovamente gli ID di comunicazione (0x6B6 e 0x696).
Il secondo passaggio è il byte di controllo (BB).
Qui la situazione si complica, poiché questo byte contiene una parte significativa del protocollo TP 1.6.
I singoli bit del byte:
( NV | NV | /RICHIEDERE ACK | CAMBIO DI DIREZIONE | BIT CONTATORE 3 - 0 )
I bit 7 e 6 non sono utilizzati.
Il bit 5 è attivo a livello basso (0). Se questo bit è a livello basso ("LOW"), il ricevitore invia un'conferma.
Il bit 4 è attivo (a livello logico 1). Se questo bit è a livello "alto", viene forzata una variazione di direzione e il ricevitore inizia a trasmettere dati.
Il bit 3-0 del byte di controllo, denominato "Lownipple", viene incrementato con ogni messaggio inviato. In caso di overflow (superiore a 0xf), il valore riparte semplicemente da 0x0.
Dopo una svolta, si riparte anche qui con il valore 0x0.
Il messaggio di conferma occupa 1 byte ed è composto dall'ID CAN (AAA) e dal messaggio di conferma effettivo (BB).
0xAAA 0xBB
Il primo passo è l'ID CAN (AAA).
Qui vengono utilizzati nuovamente gli ID di comunicazione (0x6B6 e 0x696).
Il secondo passaggio è il messaggio di ACK (BB).
Il valore di Highnipple è sempre
0xB.
Il valore di "Lownipple" viene incrementato ad ogni messaggio di dati utili ricevuto.
Ora sono arrivato al punto giusto per affrontare l'argomento dei "blocchi". Un blocco è composto da un certo numero di messaggi di dati utili.
Come già descritto, questo numero viene definito durante lo scambio di dati relativi al protocollo. Nel caso dell'esempio che ho fornito in precedenza, un blocco contiene 4 messaggi di dati utili.
Significa che ogni quarta messaggio di dati utente imposta il bit 5 del byte di controllo su "LOW", e il destinatario invia un messaggio di conferma (ACK). Se un blocco non è completo (solo 1-3 messaggi di dati utente),...
In questo modo, il destinatario invia l'ultimo messaggio di conferma al momento del cambio di direzione.
Dopo aver invertito la direzione, il destinatario originale (che diventa trasmettitore) invia i suoi dati seguendo lo stesso schema.
Dopo aver cambiato direzione e il partecipante che ora sta trasmettendo non dispone di dati da inviare, quest'ultimo conferma la comunicazione.
Il messaggio di conferma ha una lunghezza di 1 byte ed è composto dall'ID CAN (AAA) e dal codice operativo (OP code) (BB).
0xAAA 0xBB
Il primo passo è l'ID CAN (AAA).
Qui vengono utilizzati nuovamente gli ID di comunicazione (0x6B6 e 0x696).
Il secondo passaggio è il codice operativo (BB).
0xA8 = Confermare.
Un esempio del flusso di comunicazione:
0x4D6 0x08 0xC0 0xB6 // Inizializzazione della comunicazione.
0x2E8 0x39 0xD0 0x96
0x6B6 0xA0 0x04 0x82 0x84 0x46 0xC5 // Scambio dei parametri relativi al protocollo.
0x699 0xA1 0x04 0x8A 0x85 0x43 0x94
0x6B6 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00 // Invio di dati utili.
0x6B6 0x21 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x6B6 0x22 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x6B6 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00 // Blocco di 4 elementi pieno, richiesta di conferma.
0x696 0xB4 // Conferma: Ricevute 4 messaggi di dati utente.
0x6B6 0x24 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x6B6 0x15 0x00 0x00 0x00 0x00 0x00 0x00 0x00 // Ultimo messaggio di dati utili, inversione di direzione!
0x696 0xB6 // Conferma: ricevute 6 messaggi di dati utili.
0x696 0x20 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x696 0x11 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x6B6 0xB2 // Conferma: Ricevute 2 messaggi di dati utente.
0x6B6 0xA8 // Conferma di comunicazione.
Con questo, il protocollo di trasporto versione 1.6 è stato spiegato.
[size=150]
Il registro dei dati del display:[/size]
Poiché il tutorial DDP è piuttosto datato, negli esempi di comunicazione successivi si assume che l'ID del dispositivo radio sia 0x39, e non più 0x36 come nel tutorial TP 1.6.
Nelle spiegazioni, gli ID sono indicati con "X", ma questi valori sono variabili.
Un messaggio DDP viene suddiviso in più messaggi di dati utili TP 1.6, a seconda della sua lunghezza.
Il display è diviso in 3 segmenti: indicatore radio, display MFA/navigazione e indicatore di marcia. Questi possono essere utilizzati singolarmente o insieme, il che si traduce in un totale di 6 possibili segmenti.
Per visualizzare testo o simboli sul display, è necessario aprire un canale dati per ogni segmento del display utilizzato. Ogni canale dati ha un numero compreso tra 0x00 e 0xFF, che viene assegnato dal tachimetro al momento della registrazione del canale. Per ciascun dispositivo collegato, possono essere registrati al massimo 3 canali.
Dopo aver creato un canale dati per un segmento e configurato la sua creazione, questo canale dati può essere descritto, a condizione che il tachigrafo lo consenta. Un canale dati può anche essere riconfigurato o eliminato in una certa misura, successivamente.
[size=150]
Codici operativi dei messaggi DDP[/size]
Il primo byte del tuo messaggio DDP contiene un opcode che determina quale funzione il messaggio deve svolgere.
Codici operativi per radio / Partecipanti al programma DDP
0x00 = Eliminazione di tutti i canali DDP del tuo partecipante DDP (ID dispositivo/apparecchiatura).
0x01 = Richiesta della dimensione del segmento di visualizzazione (codice operativo/numero del segmento [per la descrizione dei segmenti, vedere il codice operativo 0x02]).
0x02 = Registrazione del canale DDP (vedere la descrizione dettagliata di seguito).
0x05 = Disattivare canale DDP (OP/numero di canale).
0x06 = Modifica la modalità del menu del canale DDP (numero di operazione/numero di canale/modalità del menu [per la spiegazione della modalità del menu, vedere il codice operativo 0x02]).
0x09 = Invia dati per il canale DDP (vedere la descrizione dettagliata di seguito).
0x0A = Passa alla voce del menu corrispondente al canale (numero del canale/codice).
0x0B = Cambia segmento del display (numero operazione/numero canale/nuovo segmento).
0x0C = Dare la priorità al canale DDP (numero di operazione/canale).
0x0D = Elimina tutti i canali del partecipante al sistema DDP (OP/0x00/0x00).
0x15 = Inviare lo stato del partecipante DDP (ID operazione/ID dispositivo/0x20/0x01/Stato [0x00 = Disattivato, 0x01 = Attivato]).
Codici operativi del tachigrafo.
0x20 = Tutti i canali DDP del partecipante DDP sono stati eliminati.
0x21 = Invio delle dimensioni dei segmenti del display (Numero di segmento interno al OP/Tachimetro/0x00/Larghezza in pixel - byte alto/Larghezza in pixel - byte basso/Altezza in pixel - byte alto/Altezza in pixel - byte basso).
0x23 = Richiesta di invio dati per canale DDP, trasmissione dei parametri del canale (OP/numero canale/stato del canale [0x00 = bloccato, 0x01 = dati richiesti]).
0x25 = Conferma generale.
0x27 = Stato del canale DDP, trasmissione dei parametri del canale (OP/numero di canale/stato del canale).
0x2A = Canale DDP: per uscire dal menu, tornare al menu principale (numero OP/canale).
0x2B = Errore (numero operazione/canale/codice errore).
Codici di errore:
0x01: Codice operativo sconosciuto.
0x02: Messaggio incompleto.
0x03: Numero di canale sconosciuto.
0x04: Segmento sconosciuto.
0x05: Errore nei dati di visualizzazione.
0x06: ?
0x07: La coordinata X è troppo grande per il segmento.
0x08: La coordinata Y è troppo grande per il segmento.
0x09: Superato il numero massimo di canali (3).
0x35 = Partecipante al programma DDP disconnesso (OP).
[size=150]
Registrazione di un canale dati[/size]
Un canale dati ha diversi parametri:
- Con/senza voce di menù e nome.
- Segmento del display.
Struttura del messaggio per la registrazione di un canale dati:
Titolo:
Byte 0: Codice operativo per creare un canale dati = 0x02.
Notizia:
Byte 0: Con voce di menu = 0x70, Senza voce di menu = 0x71-0x85 (Più basso è il valore, maggiore è la priorità).
Byte 1: ID del dispositivo = 0x3X.
Byte 2: Tutti i segmenti = 0x00, segmento centrale = 0x10, segmento superiore = 0x20, segmento inferiore = 0x30, segmento superiore + centrale = 0x40, segmento centrale + inferiore = 0x50.
Byte n: Etichetta della voce di menu ASCII (se il byte 0 = 0x70).
[size=150]
Descrizione di un canale dati[/size]
Ogni messaggio di testo/grafica viene trasmesso insieme al numero del canale dati corrispondente.
Struttura dei messaggi per la trasmissione di notizie testuali/grafiche (inviate dai partecipanti a DDP).
Titolo:
Byte 0: Codice operativo per l'invio di dati al canale DDP = 0x09.
Byte 1: Numero del canale dati.
Notizia:
Byte 0: Dimensione del carattere: 0x57 (caratteri medi), 0x69 (caratteri grandi), 0x55 (caratteri piccoli).
Byte 1: 0x05 + lunghezza della stringa che segue il byte 6.
Byte a bit.
0: Attivare/disattivare i pixel attivi del personaggio sullo schermo.
text
1: Carattere normale = 1, Carattere invertito = 0
2: Carattere piccolo = 1, carattere normale = 0.
3: Elementi grafici = 1, Caratteri = 0.
4: Caratteri grandi = 1, caratteri normali = 0.
5: Orientamento verso destra = 1, orientamento verso sinistra = 0.
6: Sovrascrivere la riga del display = 1, cancellare completamente il display = 0.
7: Non utilizzato.
Byte 3: Posizione orizzontale in pixel (valore minimo).
Byte 4: Posizione orizzontale in pixel (valore alto).
Byte 5: Posizione verticale (Y) in pixel, valore minimo.
Byte 6: Posizione verticale (Y) in pixel, valore più significativo.
Byte n: Dati a freccia 0x00 - 0x74, dati di testo in formato ASCII.
Byte n

: fine = 0x08.
Esempio:
Le notizie del DDP vengono semplicemente scritte sequenzialmente nei 7 byte dei dati utili delle notifiche del protocollo di trasporto.
Apertura di un canale dati.
0x4D9 0x08 0xC0 0xB9
0x2E8 0x39 0xD0 0x99
0x6B9 0xA0 0x04 0x82 0x84 0x46 0xC5
0x699 0xA1 0x04 0x8A 0x85 0x43 0x94
0x6B9 0x20 0x02 0x70 0x39 0x10 0x41 0x42 0x43 // Con voce di menu (0x70), Nome: ABCDE, Segmento: Centro (0x10)
0x6B9 0x11 0x44 0x45
0x699 0xB2
0x699 0x10 0x23 0x04 0x01 // Il tachimetro richiede dati dal canale, numero di canale = 0x04; il tachimetro desidera ricevere dati testuali/grafici per questo canale.
0x6B9 0xB1
0x6B9 0xA8
Descrizione del canale dati
0x4D9 0x08 0xC0 0xB9
0x2E8 0x39 0xD0 0x99
0x6B9 0xA0 0x04 0x82 0x84 0x46 0xC5
0x699 0xA1 0x04 0x8A 0x85 0x43 0x94
0x6B9 0x20 0x09 0x04 0x57 0x0a 0x02 0x02 0x00 // Numero del canale = 0x04, numero di caratteri da trasmettere = 5, carattere non invertito, posizione X = 0x02
0x6B9 0x21 0x03 0x00 0x48 0x41 0x4C 0x4C 0x4F // Posizione Y = 0x03, Testo = HALLO
0x6B9 0x12 0x08 // Fine
0x699 0xB3
0x699 0x10 0x27 0x04 0x01 // Trasmissione di stato, numero del canale dati = 0x04, il tachigrafo desidera continuare a ricevere dati per questo canale.
0x6B9 0xB1
0x6B9 0xA8
Eliminazione del canale dati
0x4D9 0x08 0xC0 0xB9
0x2E8 0x39 0xD0 0x99
0x6B9 0xA0 0x04 0x82 0x84 0x46 0xC5
0x699 0xA1 0x04 0x8A 0x85 0x43 0x94
0x6B9 0x10 0x05 0x04 // Disconnessione, numero del canale = 0x04
0x699 0xB1
0x699 0x10 0x25 0x04 // Disconnesso, numero di canale = 0x04
0x6B9 0xB1
0x6B9 0xA8
Osservazione generale:
Il quadro strumenti svolge molte funzioni. Di conseguenza, il display è la funzione meno importante di questa centralina (come si evince dagli identificativi elevati della comunicazione CAN).
Il tachimetro ha bisogno di tempo per elaborare i dati. Se vengono inviati pacchetti di dati troppo velocemente uno dopo l'altro, potrebbe semplicemente dimenticare di inviare una richiesta di dati o non visualizzare affatto i dati inviati. Quindi, è importante procedere con calma.
Lo schermo non è quindi adatto per frequenze di aggiornamento elevate.
[size=150]
L'anello "Heartbeat":[/size]
Le centraline del sistema Comfort CAN inviano messaggi di "heartbeat" in una sequenza specifica. Ogni centralina fa riferimento alla successiva, mentre l'ultima fa riferimento alla prima. I dispositivi "Ringmaster" sono il gateway (ID dispositivo 0x00) e il tachimetro (ID dispositivo 0x08).
Immediatamente dopo l'attivazione, il gateway avvia la sequenza di inizializzazione del sistema. Dopo 30 millisecondi, questa sequenza viene completata dal tachimetro. Durante questi 30 millisecondi, ogni nodo rimanente invia un messaggio di inizializzazione.
Le centraline che si aggiungono successivamente al sistema inviano semplicemente il loro messaggio di inizializzazione e attendono che una centralina principale le indirizzi. La nuova centralina, inizialmente, fa riferimento al gateway, ovvero all'indirizzo 0x00. Se una centralina già registrata, che ora è stata superata, si rende conto della situazione, invierà un messaggio di reinizializzazione. La nuova centralina deve ascoltare questo messaggio e, durante il successivo ciclo di comunicazione, indirizzare la sua risposta a quella centralina.
Gli identificatori dei messaggi heartbeat sono composti dalla base
0x400 sommata all'ID del dispositivo.
Nel caso di un partecipante al programma DDP, quindi
0x43X.
Il messaggio è composto da 6 byte.
Il primo byte contiene, in caso di rilevamento di un errore o durante la fase di registrazione (cioè il primo messaggio "heartbeat" inviato da un dispositivo), l'ID di riferimento del dispositivo stesso. Per un dispositivo con ID 0x39, l'ID di riferimento è 0x19, mentre per un dispositivo con ID 0x36 è invece 0x16.
Byte 0: Riferimento all'ID del prossimo dispositivo di controllo (
0x00 fino a
0x1f) / Durante la registrazione o in caso di errore, il proprio.
Byte 1: Stato interno: 0x01 = Modalità operativa normale; 0x02 = Errore rilevato; 0x11 = Pronto per la modalità standby; 0x31 = Se un'unità di controllo rileva che essa stessa e tutti gli altri dispositivi sono pronti per la modalità standby, questo valore disabilita l'anello. L'anello viene riattivato solo quando il dispositivo master 0x400 invia il suo messaggio di inizializzazione.
Byte 3: 0x00 = modalità normale; 0x80 = modalità di login.
L'intervallo di identificativi CAN (CAN ID) consentito per il sistema Polo è:
0x400 - 0x43F.