Per gli impazienti, puoi saltare lo sfondo.
sfondo
Sto programmando una serie di microcontrollori che comunicano con SPI. C'è un maestro e degli nschiavi che condividono il bus. Non esiste una selezione di chip. (Non è un cattivo design, ma nè grande e non c'è abbastanza spazio per nle linee extra).
È quindi responsabilità degli schiavi mantenere il loro MISO in alta impedenza e al massimo uno di loro parla. Ciò avviene rispondendo solo quando viene eseguito il polling del loro ID.
Ora vorremmo avere una fase di scoperta iniziale in cui il master scopre gli schiavi con quali ID sono associati ad esso. Per semplificare la vita (per alcuni aspetti), vorremmo avere un ID unico (e quindi ad esempio 32 bit). Questo rende impossibile per il master semplicemente sondare gli ID uno per uno e vedere chi risponde (ci sono troppe possibilità).
Per risolvere questo problema, ho escogitato una variante della ricerca binaria in cui gli slave rispondono collettivamente e il master è in grado di trovare rapidamente l'id minimo. Lo slave con quell'id viene detto di non partecipare più e l'algoritmo si ripete. (Dettagli non importanti).
C'è un problema però. La risposta collettiva deve essere l'OR logico (o AND logico) di tutte le risposte. Mi è stato detto che la linea può essere configurata in modo tale che il bus MISO possa fungere da OR logico. Quello che mi è stato detto è:
- Impostare MISO sul master come Pull-up e
- Impostare MISO su ogni slave come Open-drain.
Ho provato questo, ma con un solo slave, questa configurazione non funziona (l'oscilloscopio mostra uno zero costante sulla linea). Se configuro MISO sul master come ingresso ad alta impedenza, posso vedere con l'oscilloscopio che la tensione scende alla metà dove differiscono i bit delle uscite da due slave (fondamentalmente presumo un cortocircuito).
Nota: configurando MISO sul master come alta impedenza e slave ciascuno come push-pull, posso parlare con ciascuno di essi singolarmente anche se ce ne sono molti sullo stesso bus. Voglio dire, dubito che sia un problema della linea stessa.
Domanda
La mia domanda è, se possibile, e in tal caso, come posso configurare i pin di input e output del master e degli slave in modo che la linea MISO condivisa funga da OR logico (o AND logico)?
modificare
Si è scoperto che diventa un OR con logica negativo-vera (sostanzialmente un AND).
Il problema con il singolo slave è stato risolto scrivendo 1 sul pin pull-up sul master. In precedenza aveva uno stato iniziale di 0.
Modifica 2
Si è scoperto che lo slave ST ha la precedenza sulla mia configurazione GPIO di MISO come open-drain e lo stava forzando in alto quando uno è stato scritto. Ho deciso di mettere a tacere SPI e generare manualmente MISO in questo caso particolare.