Qu'est-ce qui frappe

26

Je suis nouveau dans la programmation des microcontrôleurs. J'utilise le contrôleur ATmega32-A et le compilateur CodeVisionAVR. J'utilise le générateur de forme d'onde (AD9833) pour générer un signal sinusoïdal à l'aide de la communication SPI. Je suis capable de générer avec succès l'onde sinusoïdale. Maintenant, je transmets ce signal au capteur. La sortie du capteur est sélectionnée via le multiplexeur et envoyée à l'ADC. Maintenant, je veux lire les valeurs ADC en utilisant la communication SPI. J'ai beaucoup essayé de configurer les registres de l'ADC. Cela ne fonctionne toujours pas. Pour voir le code de communication SPI, jetez un œil à mon article précédent Configuration des registres ADC en utilisant la communication spi . J'utilise la communication USART (RS232) pour imprimer des valeurs sur PC (PuTTY).

Quelqu'un m'a conseillé d'utiliser le bit banging. Je suis nouveau dans ce concept. Quelqu'un peut-il me fournir un exemple de code de frappe de bits de communication SPI? Comment démarrer cette procédure? Quelqu'un peut-il me fournir un bon matériel? Ai-je besoin de matériel externe?

J'ai écrit ceci, y compris les connexions de broches:

#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7

void send_8bit_serial_data(unsigned char data)
{
    int i;  
    ADC_CS=0;
    for (i = 0; i < 8; i++)
    {
        // consider leftmost bit
        // set line high if bit is 1, low if bit is 0
        if (data & 0x80)
            output_high(PORTB.5);
        else
            output_low(PORTB.5);

        // pulse clock to indicate that bit value should be read
        output_low(PORTB.7);
        output_high(PORTB.7);

        // shift byte left so next bit will be leftmost
        data <<= 1;
    }

    // deselect device
    ADC_CS=1;
}
verendra
la source
Votre code semble correct, sauf que la sortie d'horloge doit être faible avant le réglage du bit et le délai. Vous avez besoin de quelques retards pour fixer le timing (donc l'horloge basse / haute est à peu près la même période). Revoyez le code de Steven. Si vous souhaitez également lire, vous devrez également ajouter le code correspondant.
Oli Glaser
@OliGlaser Puis-je utiliser directement ce code au lieu du code SPI normal pour configurer les registres.
verendra
@verendra - vous ne savez pas ce que vous entendez par "code SPI normal". Si vous voulez dire au lieu du SPI matériel, alors l'ADC ne se soucie pas de la façon dont les impulsions sont générées tant qu'elles sont d'accord avec le protocole et le timing.
Oli Glaser

Réponses:

25

Le banging est en train de créer toute la série d'impulsions dans le logiciel, au lieu de s'appuyer sur un élément matériel à l'intérieur du microcontrôleur.

De nombreux microcontrôleurs ont un SPI matériel, et alors tout ce que vous avez à faire est d'écrire un octet dans le registre de sortie, et le contrôleur SPI décale les données et reçoit en même temps les données de l'esclave. Vous pouvez obtenir une interruption lorsque le transfert est terminé, puis lire les données reçues.

Mais certains microcontrôleurs n'ont pas le matériel SPI à bord et vous devez ensuite le simuler en faisant tout manuellement. SPI a un certain nombre de modes différents, je vais utiliser ce diagramme d'impulsions comme exemple:

entrez la description de l'image ici

Ainsi, alors qu'un contrôleur SPI dédié s'occupe de toutes les impulsions, du décalage des données et de la synchronisation, lorsque vous frappez des bits, vous devez prendre toutes les mesures vous-même:

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

Le bit-banging SPI est relativement simple, le code pour le bit-banging I2C par exemple sera plus complexe, et vous aurez besoin d'une minuterie d'une manière ou d'une autre si vous voulez bit-bang le protocole UART.

Stevenvh
la source
2
Pouvez-vous fournir un exemple de code c.
verendra
1
@verendra - J'ai ajouté un exemple de pseudocode, que vous devriez pouvoir traduire facilement en C.
stevenvh
Je génère avec succès Wavefrom en utilisant la communication SPI. J'ai un problème avec la lecture des valeurs ADC en utilisant SPI uniquement. Je dois utiliser le bit banging pour les deux ou simplement pour lire les valeurs ADC. Pouvez-vous jeter un oeil à mon code pour envoyer 8 bits, est-ce en écriture. mais je ne sais pas comment l'utiliser. Puis-je placer ce code directement au lieu de mon code SPI pour configurer le registre.
verendra
@Steven - le diagramme que vous montrez est MSB en premier, vous devez donc passer à gauche de 7 et à gauche de 0. Je sais qu'il n'y a pas de norme, il peut donc être LSB en premier, mais je pense que la plupart des périphériques SPI le font de cette façon .
Oli Glaser
2
@Oli - bon point, j'ai raté ça. Je vais le réparer, merci pour les commentaires. La raison pour laquelle il n'y a pas de norme est que cela n'a pas d'importance tant que le nombre de bits transférés est égal à la longueur du registre à décalage. Récemment, certains microcontrôleurs (comme le NXP Cortec-M3) ont un registre à décalage de longueur variable, et la direction peut alors être importante. IIRC dans l'AVR, vous pouvez d'abord sélectionner MSB ou LSB.
stevenvh
6

Le bang-bang se réfère au concept selon lequel les signaux qui sortent ou entrent dans un appareil doivent être générés / échantillonnés par logiciel plutôt que par matériel. Évidemment, du matériel est nécessaire, mais lors de l'utilisation du bit banging, le seul matériel pour chaque sortie est un verrou qui peut être explicitement défini ou effacé par le logiciel, et le seul matériel pour chaque entrée est une interface permettant au logiciel de tester si c'est le cas. haut ou bas (et exécutent généralement une branche conditionnelle pour un état mais pas pour l'autre).

La vitesse maximale qui peut être atteinte avec le bit banging sera généralement une fraction de ce qui pourrait être atteint avec du matériel spécialement conçu, mais en dehors des limitations imposées par la vitesse du processeur, le bit banging est beaucoup plus polyvalent et peut être utilisé dans des circonstances où le matériel à usage général n'est pas tout à fait approprié et le matériel à usage spécial ne serait pas rentable.

Par exemple, de nombreux contrôleurs ont un port "de style SPI" qui se comporte essentiellement comme suit: lorsqu'un octet est écrit dans un certain registre, le matériel génère un certain nombre d'impulsions d'horloge (généralement huit), en synchronisant un bit de données sur le front montant de chaque impulsion d'horloge et échantillonnage d'un bit de données entrant sur le front descendant. Généralement, les ports de style SPI des contrôleurs permettent de configurer diverses fonctionnalités, mais dans certains cas, il peut être nécessaire d'interfacer un processeur avec un périphérique qui fait quelque chose d'inhabituel. Un périphérique peut exiger que les bits de données soient traités en multiples autres que huit, ou il peut exiger que les données soient à la fois sorties et échantillonnées sur le même front d'horloge, ou il peut avoir une autre exigence inhabituelle. Si le matériel particulier du contrôleur que vous utilisez peut répondre à vos besoins précis, génial (certains fournissent des nombres configurables de bits, une synchronisation de transmission et de réception configurable séparément, etc.) Sinon, le claquement de bits peut être utile. Selon le contrôleur, le fait de frapper une interface SPI prend souvent 2 à 10 fois plus de temps que de laisser le matériel le gérer, mais si les exigences ne correspondent pas au matériel dont on dispose, l'échange de données plus lentement peut être mieux que ne pas pouvoir le faire du tout.

Une chose importante à noter avec les conceptions bang-bang est qu'elles sont les plus simples et les plus robustes dans les circonstances où soit les appareils avec lesquels ils communiquent attendent sur le contrôleur de bit-banging pour générer tout leur timing, soit où le contrôleur sera autorisé à attendre, sans distraction, l'arrivée d'un événement, et où il pourra faire tout ce qu'il doit faire avec cet événement avant l'arrivée de tout autre événement sur lequel il doit agir. Ils sont beaucoup moins robustes dans les circonstances où un appareil devra être capable de réagir à des stimuli externes dans un délai relativement court, mais ne peut pas utiliser 100% de son énergie pour surveiller de tels stimuli.

Par exemple, supposons que l'on souhaite qu'un processeur transmette des données de type UART en série à un débit très élevé par rapport à sa vitesse d'horloge (par exemple, un PIC qui exécute 8192 instructions par seconde souhaite produire des données à 1200 bps). Si aucune interruption n'est activée, une telle transmission n'est pas difficile (horloge un bit tous les sept cycles d'instructions). Si un PIC ne faisait rien d'autre qu'attendre un octet de données entrant de 1200 bps, il pourrait exécuter une boucle de 3 cycles en attendant le bit de démarrage, puis procéder à l'horloge des données à des intervalles de sept cycles. En effet, si un PIC avait un octet de données prêt à être envoyé lorsqu'un octet de données entrant est arrivé, sept cycles par bit seraient suffisants pour que le PIC envoie son octet de données simultanément à la lecture de l'octet entrant. Également,si une telle réponse aurait un timing fixe par rapport à la transmission d'origine . D'un autre côté, il n'y aurait aucun moyen pour les PICs de gérer les communications bit-bang de telle manière que l'un ou l'autre des appareils soit autorisé à transmettre à tout moment qu'il jugerait bon (par opposition à un seul appareil qui pourrait transmettre quand il a vu s'adapter, et faire ce qu'il voulait quand il ne transmet pas, et un appareil qui devrait passer la majeure partie de son temps à ne rien faire mais à attendre les transmissions du premier appareil).

supercat
la source