Codifica un pò particolare

Ciao, un mio cliente mi ha chiesto di creare un sistema di trasmissione dati su due fili attraverso due microcontrollori MC68HC908JL8. Nella sua richiesta mi è stato specificato che non posso utilizzare ne le interfacce SPI, ne i timer per generare un clock di trasmissione e ne gli IRQ (tutto questo perchè ha già creato il pcb con i pin SPI utilizzati e il sw che utilizza già TIMER e IRQ).

Uno dei 2 uP è il MASTER ed è lui che si prende cura di richiedere/fornire i dati allo SLAVE (2° uP).

Io avevo pensato di utilizzare un segnale come DATA e un segnale come CLOCK e un pacchetto di dati di un numero di byte fisso.

Il problema è che quando trasmetto ogni singolo bit non ho la sicurezza che lo SLAVE abbia correttamente letto il bit (in quanto lo SLAVE si può trovare a leggere il dato in tempi non precisi).

Ho pensato anche, ad ogni singolo bit trasmesso, di cambiare la direzione della linea di CLOCK per avere una conferma dallo SLAVE, ma il software diventa complesso.

Esite un protocollo che mi permetta di risolvere il problema.

Grazie tantissimo a tutti.

Sabrina

Reply to
Sabrina
Loading thread data ...

Provo a darti qualche spunto, una soluzione hardware e più veloce, un'altra soluzione software, più lenta ma più completa:

  1. dal momento che utilizzi dei pacchetti a lunghezza fissa (celle), potresti utilizzare l'ultimo bit per ricevere l'acknowledge; in modo particolare, utilizzando una linea DATA con pullup, il trasmettitore invierà il comando ponendo come ultimo bit sempre un valore altro (Vcc); il ricevitore tiene conto dei bit ricevuti e non appena riceve l'ultimo bit pone a ground la linea DATA; in questo modo il trasmettitore, osservando la linea DATA, si accorge se il tutto è stato ricevuto (credo si usi un protocollo simile dei dispositivi 1-wire, come le pennette per i distributori automatici di caffé)
  2. potresti creare un protocollo con conferma ispirandoti a qualche tecnica ARQ, ossia ai protocolli a finestra: aggiungi un campo nel pacchetto da inviare in cui numeri la sequenza, lo slave risponderà con un pacchetto di acknowledge riportando quel numero (magari incrementato di uno per dire "ho ricevuto tutto fino a N, aspetto N+1")
--
Francesco L
Reply to
Francesco L

Conscio delle conseguenze, Sabrina un bel dì scrisse:

Hai descritto praticamente l'i2c solo che viene testato il DATA (e non il clock) per avere conferma della ricezione...

--
This time it will surely run.
News 2002 [v 2.4] - [ StopDialers/PopDuster/SMTP Proxy -
http://www.socket2000.com ]
Reply to
Due di Picche

Sabrina ha scritto:

non hai parlato di velocita' e dimensione del pacchetto; quello che hai descritto potrebbe essere I2C software , molto rallentato per funzionare in polling, senza timer o interrupt.

saluti

--
  lowcost
Reply to
lowcost

Sabrina:

Ah, ok, allora usalo.

Se ti avanza una resistenza puoi usare il protocollo delle smartcard, con due conduttori, visto che non hai bisogno di autoalimentarti come con lo

1-Wire.
Reply to
F. Bertolazzi

Sabrina ha scritto:

Ma perchè non una semplice seriale asincrona 8,n,1 implementata via software? Lo so che sarebbe meglio hw, ma se vai a velocità basse (tipo

1200bps) non dovresti avere nessun problema a ricevere con la tecnica del polling. Quindi con una linea trasmetti e con l'altra ricevi. Potresti anche usare una parità ed un pacchetto di risposta contenente un ACK. Se hai paura di non sincronizzare i pacchetti tra master e slave, puoi sempre impacchettare i dati in un frame con un byte di start ed uno di stop (naturalmente devi imporre che questi byte non cadano all'interno del payload).

Oppure se una linea è bidirezionale puoi usare un classico SPI software. Su una linea metti il clock e sull'altra i dati. Inizia sempre il Master che dice, all'interno del pacchetto, cosa vuole fare: leggere o scrivere. Se vuole leggere, metterà il pin dei dati in alta impedenza e fornirà allo slave i giusti colpi di clock. Quando lo slave trasmette, "sputa" i dati quando vede un fronte (positivo o negativo, basta mettersi d'accordo) sul clock.

Reply to
pozz

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.