e la peppa, che credi di essere il primo che usa SPI? che la libreria che usi ha un baco è mille volte più probabile
Ragazzi, ma avete perlomeno visto il codice? La libreria che ho copiato sono poche funzioni che usano direttamente l'SPI hw tramite i registri del micro, sto cercando di capire il bug in una di quelle funzioni che non usa a sua volta altre librerie
nel senso che se ha un minimo di logica interna (in pratica è un altro microo quasi) probablmente bufferizza i dati, e crea casino dentro se stesso. in fondo potrebbe non essere stato pensato per essere floddato di richieste
Io al limite avevo pensato ad un baco nel modulo SPI hw.. ma sarebbe stato troppo grosso!
Un baco di cache.. improbabile, il micro è pensato per eseguire istruzioni una dopo l'altra quindi non vedo problemi in un ciclo while..
però usi la lireria SPI più usata del mondo arduino.. ed eliminiamo un possibile problema del "driver", rimane omunque un possiile errore nel protocollo al di sopra di SPI (esempio impostazone valori non consenti)
Domani potrei fare delle prove anche in questo senso
Se qualcosa sotto interrupt tocca il port su cui stanno i segnali SPI mentre SPI sta trasmettendo il risultato e' che SPI scarta il byte e di conseguenza non alza la flag SPIF, come se non avesse trasmesso nulla e nulla ha da segnalare e il while ha ragione di bloccarsi.
Allora bisogna disabilitare gli interrupt appena entrati nella spi_write16 e riabilitarli appena si sta per uscire dalla spi_write16.
Avevo provato con "cli" e "sei" a disabilitare gli interrupt ma.. niente
Su AVR Freaks mi hanno detto:
What's happening with your _SS pin? The common AVR SPI "gotcha" is that if you configure MSTR but something leads to the _SS pin being pulled low it switches from Master to Slave mode. From that point on writing to SPDR does NOT start a transmission, SCK pulses are not generated and SPIF is never set. That would lead to the while() loop being infinite.
The usual solutions are either use the _SS pin as the actual _SS signal for the distant device or at the very least just set it as an output so nothing external can lead to it being pulled or floating low. I guess you could leave it as an input as long as you turned on the internal pull-up.
Quindi pensano che forse potrebbe essere un problema col pin SS... domani proverò a fare qualcosa anche se non so ancora cosa..