Comment V-USB peut-il visser le SPI intégré d'un ATmega328p?

14

Je travaille sur un projet V-USB qui apparaît comme un clavier utilisant un ATmega328p. La partie USB fonctionne très bien (ce n'est pas mon premier projet V-USB), mais après avoir démarré la pile V-USB avec usbInit(), tous les appels à la bibliothèque de cartes SD échouent. Si j'appelle les mêmes fonctions auparavant usbInit(), tout fonctionne parfaitement.

J'utilise un clone Arduino appelé Diavolino, mais sans le cadre Arduino / câblage. J'ai l'USB connecté aux E / S numériques 2 et 3 et la carte SD à 10-13 (lignes SPI intégrées).

J'ai regardé par la bibliothèque de carte SD et n'a trouvé aucun signe de l'aide d'alarmes ou d' autres registres que SPxx. J'aurais aussi greppensé au code V-USB, mais il ne touche même pas les SPxxregistres.

Le premier signe du problème était lorsque l'appareil s'est déconnecté alors qu'il était censé accéder à la carte SD. Ensuite, j'ai mis usbPoll()et wdt_reset()appelé dans toutes les boucles de gestion de la carte SD, et j'ai constaté qu'en cas d'écriture, la carte attend indéfiniment l'accusé de réception de la carte après avoir envoyé les deux derniers octets (CRC-16).

La bibliothèque de cartes SD que j'utilise est sd_rawde Roland Riegel.

dnet
la source
2
Je crois comprendre que le V-USB est très gourmand en CPU, et il introduit probablement des retards inacceptables dans les routines SPI. Normalement, les opérations SPI ne sont pas sensibles au timing, mais les opérations d'écriture et d'effacement sur SPI FLASH le sont certainement.
Dave Tweed
Le problème est que même les opérations de lecture n'ont pas fonctionné la plupart du temps, et comme je l'ai lu, les communications SPI sont effectuées indépendamment dès que les données et les registres de contrôle sont définis par le code en cours d'exécution.
dnet
@DaveTweed - sensible au temps en termes de devoir attendre la carte oui, mais en termes de ne pas pouvoir garder la carte en attente de votre programme ??
Chris Stratton
2
Vous attendez probablement quelque chose qui ne peut pas se produire ou qui ne peut pas être détecté; par exemple, la broche d'E / S peut avoir été reconfigurée et ne plus être une entrée, ou des données / horloges parasites ont pu être envoyées à la carte, la plaçant dans un état indésirable. Assurez-vous également que le mécanisme par lequel la bibliothèque SD accomplit les retards requis n'a pas été interrompu ou accéléré.
Chris Stratton
3
Vous pouvez également avoir des problèmes de bruit ou d'alimentation. Vérifiez vos rails avec un oscilloscope et vérifiez les lignes SD avec un analyseur logique pour voir ce qui se passe.
Jim Paris

Réponses:

1

J'ai eu un problème comme celui-ci avec USART et je l'ai résolu en modifiant les paramètres du chien de garde. Comme vous le savez, le V-USB utilise un chien de garde et si vous mettez du temps supplémentaire en une seule opération, le chien de garde est activé. Essayez de désactiver le chien de garde et si vous voyez que tout se passe bien, vous pouvez modifier l'heure du chien de garde ou vous pouvez diviser le code interférent (les codes de la carte SD dans votre cas) en plus petites parties et «réinitialiser» le chien de garde entre eux. Mais n'oubliez pas de réactiver votre chien de garde après le débogage car il n'est pas recommandé d'utiliser V-USB sans cela.

Août
la source
Notez que la question mentionne l'insertion d'appels wdt_reset () dans le code SD; bien sûr, il est possible que cela ne se fasse pas partout.
Chris Stratton du
1
Oui, mais cela vaut vraiment la peine d'essayer le code en désactivant le chien de garde. Parfois , en particulier lorsque les données de retour est traitée dans une routine d' interruption, le code est bloqué là et le chien de garde s'active avant d' être remis à zéro
août