Sostituzione di un bit in un byte

Buonasera,
Sono alle prese con la modifica di un circuito.
Il circuito opera con il protocollo i2C. Sono presenti un microprocessore e un altro integrato che opera come decoder video. Ho letto ciò che c’è nel bus i2c tra questi due integrati e devo cambiare un bit in un codice di un byte. Nell’allegato ci sono tutti i codici. Devo cambiare quello indicato da 0x00 a 0x10 o in binario da 0000 0000 a 0001 0000.

Sono molto all’asciutto in quanto a programmazione. Potreste darmi qualche indicazione almeno su come cominciare? Vi ringrazio in anticipo per un’eventuale risposta!

Immagine.png

non penso potrai fare tanto finché non hai una situazione da man in the middle.

miky_police:
non penso potrai fare tanto finché non hai una situazione da man in the middle.

Ehm.. cosa?

miky_police:
non penso potrai fare tanto finché non hai una situazione da man in the middle.

In realtà ce l'ho. Appena accendo l'apparecchiatura il microprocessore e il decoder video comunicano e il microprocessore invia quei dati al subaddress 0x9A (che è il codice slave del decoder video). Poi da quanto ho capito, una volta ogni tanto lo invia. Mi serve che quella volta ogni tanto venga sostituito quel bit nel byte dopo 0xA0 e 0xFF da 0x00 a 0x10. E' così difficile?

ciao...arduino in tutto questo cosa fa?...intercetta (tipo sniffer) il bus I2C?
l''unico modo che vedrei e interporre tra i due componenti un (due?) arduino che legge l'I2C, lo verifica/modifica, e lo rimanda al secondo integrato...e viceversa se necessario (come detto...MITM)

Seplicemente fai “tuo_byte |= (1 << numero_del_bit_da_mettere_a_uno);

Guglielmo

Nel senso devi mettere qualcosa in mezzo che legge i dati e li manda avanti in modo uguale e in certe condizioni sostituisce il valore.

Non so come farlo perché secondo me Ti servirebbe un microcontroller con 2 BUS I2C separati.
Esiste una libreria che emula I2C via software ma non so se é adatta alle esigenze del circuito.
Il ATmega328BP ha 2 bus I2C ma non viene sopportato al 100% dal IDE di Arduino.

ok, ORSO2001 ha trovato una soluzione 2 Arduini che sono interfacciati con un altra interfaccia per esempio SPI o seriale. Puó funzionare ma sará un bel impegno scrivere i sketch.

Ciao Uwe

ORSO2001:
ciao...arduino in tutto questo cosa fa?...intercetta (tipo sniffer) il bus I2C?
l''unico modo che vedrei e interporre tra i due componenti un (due?) arduino che legge l'I2C, lo verifica/modifica, e lo rimanda al secondo integrato...e viceversa se necessario (come detto...MITM)

Esatto. Da quanto ho capito, Arduino legge il codice i2C e lo fa passare tutto. l'unica cosa che fa è cambiare un bit di un byte e lo rimanda all'altro integrato. Avete qualche codice d'esempio? Io intanto faccio delle ricerce a riguardo. Grazie per le risposte!

Comunque il mio progetto è simile a questo :TV RGB Modding

Agozzi:
Esatto. Da quanto ho capito, Arduino legge il codice i2C e lo fa passare tutto. l'unica cosa che fa è cambiare un bit di un byte e lo rimanda all'altro integrato. Avete qualche codice d'esempio? Io intanto faccio delle ricerce a riguardo. Grazie per le risposte!

Comunque il mio progetto è simile a questo :TV RGB Modding

Come pensi di fare che il codice non voluto non arrivi al destinatario?

Ciao Uwe

dovresti separare i 2 bus I2C e magari accedervi alternativamente utilizzando un multiplexer I2C

uwefed:
Come pensi di fare che il codice non voluto non arrivi al destinatario?

Ciao Uwe

Pensavo di fargli leggere i byte precedenti che di per se son sempre uguali, quindi volevi tenerli come riferimento.

Guardando l'immagine che ho postato, se Arduino legge i byte 0xA0 e 0xFF, sostituisci il successivo byte con 0x10 e subito dopo lascia passare il codice intoccato. Se non li rileva, fa passare tutto il codice intoccato.

Agozzi, Arduino per leggere quella sequenza di byte deve essere il destinatario di quella sequenza sul bus i2c. Quindi poi dovresti modificare il circuito in modo tale che Arduino abbia l'address dell'integrato 0x9A per ingannare il microcontrollore già presente facendoli credere che Arduino è l'integrato, cambi quello che vuoi sulla comunicazione ed invii con un altro Arduino configurato come master su i2c al vero destinatario 0x9A. Quindi non uno man in the middle (letteralmente uomo nel mezzo), ma 2, uno per leggere e modificare e l'altro per inviare (oppure il primo solo per leggere ed il secondo per modificare ed inviare).
Domanda: ti sei accertato che l'integrato non invia una risposta ben precisa all'mcu dopo che riceve questi dati? ovvero, ti sei accertato che la comunicazione sia unidirezionale (solo mcu->integrato) e non bidirezionale?

Non puoi modoficare una frase detta da una persona ad un altra in Tua presenza nella stessa stanza.
La persona deve parlare a te senza il destinatario e tu ripetere o modificare il detto comunicandolo alla seconda persona destinataria.
percui servono 2 bus I2C separati.
Ciao Uwe

uwefed:
percui servono 2 bus I2C separati.

infatti, il primo Arduino intercetta la comunicazione (nel senso che intercetta fisicamente il bus), la rielabora invitandola, magari tramite seriale, ad un secondo Arduino che sfrutta il suo i2c libero per spedire il messaggio dell'integrato (quindi collegando fisicamente il bus i2c del secondo Arduino con all'integrato 0x9A).

miky_police:
infatti, il primo Arduino intercetta la comunicazione (nel senso che intercetta fisicamente il bus), la rielabora invitandola, magari tramite seriale, ad un secondo Arduino che sfrutta il suo i2c libero per spedire il messaggio dell'integrato ...

Non serve, ci sono un'infinità di esempi su internet per I2C bit-banging ... basta cercarli ... e creare una seconda I2C virtuale (come si fa con la seriale con la SoftwareSerial).

Guglielmo