Domanda

Piattaforma - ARM9

Ho un dispositivo di terze parti collegato tramite I2C all'ARM9. Il mio problema è che I2C in lettura / scrittura sta diventando una svolta. Sembra che la riga IRQ sia affermata ma mai disattivata quando ci sono dati da leggere. La lettura non riesce poiché il dispositivo di terze parti NACK il pacchetto di indirizzi. Quindi qualsiasi scrittura successiva fallisce.

Mi chiedo se la mia gestione degli interrupt è ok. Nell'ISR che serve l'IRQ, disabilito gli interrupt, annulla la registrazione del gestore degli interrupt e quindi segnala all'attività di andare a leggere dal bus I2C. Infine, riattivo gli interrupt.

Quando l'attività serve il segnale pubblicato sopra, provo a leggere i dati dal bus I2C ma questo non riesce. Infine, registro nuovamente l'ISR dopo aver mai letto il tentativo. Non vi è alcuna disabilitazione / abilitazione di interruzioni che si verifica durante la gestione del segnale di lettura.

La mia domanda è: devo disabilitare gli interrupt durante la lettura / scrittura sul bus I2C?

Il linguaggio di programmazione di scelta è c usando RTOS di proprietà.

È stato utile?

Soluzione

Una cosa importante è se il tuo RTOS / sistema è pronto a supportare le eccezioni nidificate. A meno che non ci sia una buona ragione per farlo, le cose sono più semplici se si evitano eccezioni nidificate e si disabilitano tutti gli interrupt quando si inserisce un ISR e si riattiva quando si esce.

Se si desidera consentire che si verifichino altri interrupt con priorità più alta mentre si sta servendo l'interrupt I2C, disabilitare solo l'interrupt I2C. È piuttosto insolito annullare la registrazione di un gestore di interrupt quando si immette un ISR. Ciò può comportare comportamenti imprevisti, quando non è presente un gestore registrato, l'interruzione stessa è abilitata e si verifica un'interruzione. Quindi, invece di annullare la registrazione del gestore, è sufficiente disabilitare l'interrupt I2C (forse lo stai già facendo, ma a mio modo di vedere, registrare un gestore e abilitare un interrupt sono due cose diverse).

Una buona strategia per risolvere il tuo problema sarà quella di provare a comunicare con il dispositivo senza interruzioni. Prova a leggere / scrivere da esso in modo seriale, non importa se tutto si blocca - è solo un test. È molto più facile eseguire il debug e dopo aver eseguito correttamente è possibile passare alla versione di interrupt.

Altri suggerimenti

La maggior parte degli interrupt deve essere riconosciuta o cancellata. Si menziona l'abilitazione / disabilitazione, la registrazione / annullamento della registrazione e la gestione dell'interrupt. Basta controllare che l'interrupt sia stato riconosciuto e / o cancellato / ripristinato. Spesso ciò comporta la scrittura del numero di interruzione o del bit nel registro in attesa di interruzione. Controllare il manuale ARM specifico o il manuale RTOS.

La necessità di abilitare / disabilitare gli interrupt per la piattaforma di destinazione dipende dall'implementazione hardware / RTOS specifica. Sfortunatamente, ogni fornitore di microcontrollori ARM (STMicro, Freescale, Oki, ecc.) Ha la capacità di implementare l'hardware I2C in modo diverso e potrebbe avere requisiti diversi su come cancellare l'IRQ.

Ti consiglierei di trovare una copia del foglio dati dell'hardware (e / o pubblicare qui il numero di parte dell'hardware specifico in modo che possiamo aiutarti a versare la documentazione del fornitore, con te).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top