Aide sur un exemple de programme SPI pour microcontroleur
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Aide sur un exemple de programme SPI pour microcontroleur



  1. #1
    invite8a011b82

    Aide sur un exemple de programme SPI pour microcontroleur


    ------

    Bonjour à tous,

    Je suis en train de réaliser un programme en SPI pour discuter avec un inclinomètre. Sur le site du constructeur j'ai trouvé un exemple de programmation pour les microcontroleurs ATMEL que je souhaite adapter au PIC. Il y a juste quelques lignes du programme donné en exemple que je ne comprend pas. Es-ce que quelqu'un peux me les expliquer merci.

    Voici le code:

    Code:
    inline uint16_t  
    HW_SPI(uint8_t W_len, uint16_t W_data, uint8_t R_len) 
    { 
    	 uint16_t value; 
    	value = 0; 
    	#ifdef SCA_SCP_DEMO 
    		SPI_I2C_PORT &= ~(1 << SPI_I2C_SELECT); 
    	#endif 
    	 HW_POUT(0,0);     // pin 0 is reserved for CSB!
    	 switch(W_len) 
    	 { 
    		case 0: 
    			break; 
    		case 8:     // This loop writes 8 bit data to SPI
    			SPDR = (uint8_t)(W_data); 
    			while(!(SPSR & (1<<SPIF))) 
    			;
    			value = SPDR; 
    			break; 
    		case 16:    // This loop writes 16 bit data to SPI 
    			SPDR = (uint8_t)(W_data>>8); 
    			while(!(SPSR & (1<<SPIF))) 
    			  ;
    			value = SPDR << 8; 
    			SPDR = (uint8_t)(W_data); 
    			while(!(SPSR & (1<<SPIF))) 
    			  ;
    			value |= SPDR; 
    			break; 
    		default: 
    		  SPI_DISABLE(); 
    			W_data <<= (16 - W_len);  // This loop writes W_len bit long data to SPI 
    			while(W_len > 0) 
    				{
    				SPI_PORT &= ~(1<<SPI_CLK); 	// Je ne comprend pas cette ligne
    				if(W_data & 0x8000) 		// Je ne comprend pas cette ligne
    					SPI_PORT |= (1<<SPI_MOSI); 
    				else 
    					SPI_PORT &= ~(1<<SPI_MOSI); 	 
    				W_data <<= 1; 
    				wait_1us(); 
    				SPI_PORT |= (1<<SPI_CLK); 
    				wait_1us(); 
    				value <<= 1; 
    				if(SPI_PORT & (1<<SPI_MISO)) 
    					value |= 0x0001;     	 
    				W_len--; 
    				}
    		SPI_PORT &= ~(1<<SPI_CLK); 
    		SPI_ENABLE(); 
    		break; 
    	} 
    	
    	while(R_len != 0)  //This loop reads R_len bits from SPI 
    	 { 
    		if((R_len % 8) == 0) //use standard HW SPI for 8 bit and 16 bit data
    		  {        //This loop is used for VTI SCA100T 8 bit temperature data
    			  SPDR = 0x00;   
    			  value <<= 8;   
    			  R_len -= 8; 
    			  while(!(SPSR & (1<<SPIF))) 
    				  ;
    			  value |= SPDR; 
    		   } 
    		else 
    		{ 
    			  SPI_DISABLE();  //if data length is not 8 or 16 bit then disable HW SPI
    			  while(R_len > 0)//This loop generates SPI clock signal to the SPI port
    				{        //and read SPI data bit by bit
    					SPI_PORT &= ~(1<<SPI_CLK);//This loop is used for VTI SCA100T 11 bit measurement data.
    					wait_1us();  //For measurement data R_len=11   
    					wait_1us(); 
    					wait_1us();  //wait_1us routines generate 1 us delay, These 4 1us waits are needed to generate 50% duty cycle to SPI clock signal 
    					SPI_PORT |= (1<<SPI_CLK); //with these delays the SPI clock is high 3us and low 3us. 
    					wait_1us();   	 
    					value <<= 1; 
    					if(SPI_PORT_IN & (1<<SPI_MISO)) 
    						value++; 
    					R_len--; 
    				}
    			  SPI_PORT &= ~(1<<SPI_CLK); 
    			  SPI_ENABLE(); 
    		   } 
    	 } 
    	 HW_POUT(0,1);     // pin 0 is reserved for CSB!
    	   
    	 return value; 
    }

    -----

  2. #2
    invite8a011b82

    Re : Aide sur un exemple de programme SPI pour microcontroleur

    Es ce que quelqu'un peut m'aider svp???

  3. #3
    invite2fa5ac65

    Re : Aide sur un exemple de programme SPI pour microcontroleur

    Je travail avec le SPI mais sur un LM3S9B96. Je pourrais peut être t'aider. Quelle partie du code tu ne comprends pas?

    Le programme C pour le SPI chez texas est bien plus simple. Mais le fonctionnement de SPI est le même.

  4. #4
    invite8a011b82

    Re : Aide sur un exemple de programme SPI pour microcontroleur

    Bonjour,

    Les lignes que je ne comprend pas sont celles-ci:

    Code:
    	SPI_PORT &= ~(1<<SPI_CLK); 	
    				if(W_data & 0x8000) 		
    					SPI_PORT |= (1<<SPI_MOSI); 
    				else 
    					SPI_PORT &= ~(1<<SPI_MOSI); 	 
    				W_data <<= 1; 
    				wait_1us(); 
    				SPI_PORT |= (1<<SPI_CLK); 
    				wait_1us(); 
    				value <<= 1; 
    				if(SPI_PORT & (1<<SPI_MISO)) 
    					value |= 0x0001;     	 
    				W_len--;
    Je ne vois pas concrètement ce que ça fait. Par exemple la ligne :
    Code:
    SPI_PORT &= ~(1<<SPI_CLK);
    en plus simple sa donne :
    Code:
    SPI_PORT = SPI_PORT & ~(1<<SPI_CLK);
    et ça veut dire qu'on fait un "et logique" entre SPI_PORT et le "non logique" SPI_CLK je ne comprend pas le résultat que l'on obtient et pourquoi on fait un décalage du CLK.

    Je pense qu'une fois que j'aurai compris cette ligne les autres sa pourra aller puisque c'est le même principe c'est juste les opérateurs qui change.

    Merci

  5. A voir en vidéo sur Futura
  6. #5
    invite936c567e

    Re : Aide sur un exemple de programme SPI pour microcontroleur

    Bonjour

    Le décalage correspond à la génération du masque de bit nécessaire.

    La connaissance des définitions des valeurs de décalage et de l'architecture interne du µC (qui est essentielle pour comprendre et porter un tel logiciel) aurait pu t'indiquer la voie.

    Par exemple, sur un ATmega8, les signaux SPI sont contrôlés par le port B, l'horloge SCLK étant située sur le bit 1, la sortie MOSI sur le bit 2, et l'entrée MISO sur le bit 3 (la sortie /SS de sélection qui est sur le bit 0 ne semble pas être manipulée ici).

    Dans ce cas particulier, on a :
    • SPI_PORT=PORTB c'est-à-dire l'adresse du port B pour l'écriture (0x25 dans l'espace mémoire, ou 0x05 dans l'espace I/O)
    • SPI_PORT_IN=PINB c'est-à-dire l'adresse du port B pour la lecture (0x23 dans l'espace mémoire, ou 0x03 dans l'espace I/O)
    • SPI_CLK=1 et donc (SPI_CLK<<1)=2 c'est-à-dire 00000010 en binaire
    • SPI_MOSI=2 et donc (SPI_MOSI<<1)=4 c'est-à-dire 00000100 en binaire
    • SPI_MISO=3 et donc (SPI_MISO<<1)=8 c'est-à-dire 00001000 en binaire

    Ainsi, le code SPI_PORT &= ~(1<<SPI_CLK) consiste à construire le masque 00000010, à calculer son inverse, soit 11111101, puis à réaliser un ET logique entre cette valeur et SPI_PORT afin de forcer le bit 1 de dernier à zéro.

  7. #6
    invite936c567e

    Re : Aide sur un exemple de programme SPI pour microcontroleur

    Pour faire plus court :
    • Le signal SCLK est piloté par le bit SPI_CLK du port situé à l'adresse SPI_PORT
    • Le code SPI_PORT &= ~(1<<SPI_CLK) met à 0 le signal SCLK
    • Le code SPI_PORT |= (1<<SPI_CLK) met à 1 le signal SCLK

  8. #7
    invite8a011b82

    Re : Aide sur un exemple de programme SPI pour microcontroleur

    Merci beaucoup sa répond à toutes mes questions!!!

Discussions similaires

  1. Aide pour une formule par un exemple
    Par invite7b178f75 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 08/11/2011, 18h58
  2. Réponses: 24
    Dernier message: 14/04/2010, 21h45
  3. aide pour simulation d'un programme de PIC16F876 sur isis
    Par invitef9ed8fd4 dans le forum Électronique
    Réponses: 10
    Dernier message: 30/03/2010, 18h29
  4. Aide pour programme sur microC
    Par inviteadd14caf dans le forum Électronique
    Réponses: 1
    Dernier message: 26/02/2009, 11h01
  5. 8051 et EEPROM SPI pour mémoire de programme
    Par invite7318634f dans le forum Électronique
    Réponses: 3
    Dernier message: 22/04/2006, 16h55
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...