Slave SPI/I2C AA_COMMUNICATION_ERROR utilizzando un Aardvark
Hai attivato uno slave I2C/SPI, hai già ricevuto dei messaggi da esso e ora vuoi disattivarlo, ma ricevi il codice di stato AA_COMMUNICATION_ERROR? Probabilmente non si tratta di un errore del tuo codice!
Spiegazione:
Può succedere che un master invii grandi quantità di dati e quindi occupi completamente il buffer di ricezione del PC host per l'adattatore host Aardvark I2C / SPI. L'errore di comunicazione significa che mentre il PC ha inviato la richiesta di disabilitazione allo slave, l'adattatore Aardvark non ha ricevuto alcun riscontro.
Nella maggior parte dei casi, lo slave è stato probabilmente disattivato. Se l'adattatore Aardvark ha disattivato lo slave, non verranno inviati o ricevuti altri dati e la connessione/buffer non potrà più essere occupata completamente. Una successiva chiamata per disattivare lo slave dovrebbe ritornare senza errori.
Possibili soluzioni:
Anche se questo non è necessariamente un problema critico nel tuo codice, puoi migliorare la situazione in diversi modi.
a.) Uno è quello di ridurre la quantità di traffico inviato dal master. Questo richiede la possibilità di riconfigurare il dispositivo master incriminato.
b.) Un altro modo è quello di interrogare periodicamente lo slave per ottenere i messaggi asincroni in sospeso. Si noti che ogni chiamata per leggere i messaggi in sospeso può avere un timeout fino a 500 ms. Quindi, se c'è altro codice time-critical che deve essere eseguito contemporaneamente, è meglio utilizzare un modello di threading. (Le chiamate API dell'adattatore Aardvark non sono thread-safe, ma possono essere utilizzate se racchiuse da opportune chiamate di sincronizzazione dei thread)
Per gli ambienti di sviluppo più potenti, è consigliabile utilizzare due adattatori Aardvark. Un adattatore Aardvark può essere configurato per ricevere i messaggi asincroni I2C / SPI slave, mentre l'altro può essere utilizzato per la comunicazione sincrona I2C / SPI master. Con questa configurazione, un thread dell'applicazione può eseguire un ciclo stretto per elaborare i messaggi slave e un altro thread può elaborare le operazioni sincrone.