Vous voyez un crénelage dans votre capture, pas une gigue d'horloge - un cas de mauvais outil pour le travail.
Une horloge de 2 MHz a une période de 500 ns, elle est donc élevée pendant 250 ns. Avec un analyseur logique de 16 Mhz, vous prélevez des échantillons toutes les 62,5 ns, donc idéalement, vous verriez 4 échantillons élevés et 4 échantillons faibles se répéter.
Considérons maintenant l'effet d'une minuscule différence de fréquence de 0,5 % sur l'oscillateur du processeur, de sorte que le réseau diviseur jusqu'au bus SPI fonctionne désormais avec une période de 251,25 ns. Remarque :la fréquence ne dérive pas dans le temps, c'est toujours un cristal idéal, mais la forme d'onde que nous essayons de capturer n'est plus un multiple exact de l'horloge de capture 62,5 ns. Cela vous donne un crénelage avec des modèles de 4/4, 3/5, 4/4, 5/3,... comme rapport haut/bas dans votre capture lorsque vous observez la relation de phase entre les deux horloges qui dérivent.
Votre analyseur est toujours bon pour capturer les signaux SPI (au-dessus de Nyquist, etc.), mais il n'est pas adapté pour juger de la stabilité de l'horloge. Pour cela, utilisez un oscilloscope déclenché sur un bord pour voir la stabilité de l'autre bord et un compteur de fréquence calibré pour vérifier la fréquence absolue.
Étant donné que SPI est un protocole synchrone, la fréquence exacte à un moment donné n'a pas vraiment d'importance. Tout est calé sur les bords de l'horloge, donc la synchronisation exacte entre les bords n'a vraiment pas d'importance - dans les limites de l'appareil bien sûr.
Il existe plusieurs manières de générer des signaux SPI. Dans certains cas, un périphérique sera un matériel qui peut être chargé d'envoyer le contenu d'une certaine plage de mémoire vers le port SPI sans intervention du processeur. Dans de tels cas, il y aura généralement une séquence uniforme d'impulsions d'horloge, bien qu'il soit possible qu'il y ait une "pause" tous les huitièmes. Dans certains cas, un processeur devra charger chaque octet dans un décaleur qui est capable d'accepter au moins un octet "avant" celui qui est décalé. La sortie dans ces cas ressemblera souvent à celle du cas purement matériel, sauf qu'il peut parfois y avoir des écarts aléatoires après des multiples de huit horloges si le logiciel ne parvient parfois pas à charger l'octet suivant avant que l'octet actuel ne soit décalé, mais selon le timing du processeur qui pourrait ne jamais se produire. Dans les cas ci-dessus, l'utilisation de fonctions de déclenchement retardé sur une portée peut être utile lors de l'examen de données formatées régulièrement, car tout se produira toujours (ou presque toujours) à un moment cohérent par rapport au début d'une image.
Les choses ne sont pas toujours aussi agréables, cependant. Il est assez courant que les appareils disposent d'un matériel capable d'envoyer 8 bits automatiquement, mais nécessitent que le logiciel attende qu'un groupe de 8 soit envoyé avant de mettre le suivant en file d'attente. Cela crée des groupes de 8 impulsions d'horloge régulièrement espacées, avec des quantités aléatoires d'espace entre elles. Cela empêche souvent l'utilisation de fonctions de balayage retardé, mais d'un autre côté, cela rend souvent l'identification du début et de l'arrêt de chaque octet plus facile qu'elle ne le serait si toutes les impulsions étaient uniformes. La dernière possibilité est que le logiciel puisse générer un signal SPI en utilisant une séquence de commandes "set port high" et "set port low". C'est ce qui semble se passer dans l'exemple ci-dessus.
Dans la plupart des cas, l'appareil maître sur un bus SPI (le RasPi dans ce cas) est libre d'utiliser n'importe quel mélange d'impulsions longues et courtes qu'il juge approprié, sous réserve uniquement de limitations sur certains minutages d'impulsions minimum et, occasionnellement, des minutages d'impulsion maximum qui sont souvent des ordres de grandeur au-dessus des minimums (par exemple, un appareil peut avoir une largeur d'impulsion minimale et une séparation des impulsions de 250 ns chacune, mais un temps maximum entre les impulsions de 1 ms - plus de trois ordres de grandeur de différence). À condition que les durées d'impulsion restent dans les limites très larges (et dans de nombreux cas, il n'y aurait pas de limite maximale), la communication devrait être fiable.
Le seul moment où la perte de données est probable avec SPI est lorsque le périphérique esclave est un processeur. Le matériel esclave SPI intégré à de nombreux processeurs exige que lorsqu'un octet arrive, le processeur agisse avant que le maître démarre envoyer l'octet suivant pour éviter la perte de données, mais ne fournit aucun moyen par lequel l'esclave peut dire au maître qu'il est prêt ; par conséquent, les esclaves doivent souvent utiliser cinq lignes pour communiquer avec le maître (horloge, MOSI, MISO, CS et une ligne "prête" implémentée manuellement) ou bien exiger que le maître ajoute un délai après chaque octet suffisant pour accueillir le temps de réponse le plus défavorable de l'esclave.