2015-12-15 2 views
2

J'essaye de créer mon propre pilote de métal nu SPI sur la carte FRDM-K64F. J'ai seulement écrit une fonction d'initialisation pour le moment.Pilote SPI sur le FRDM-K64F et l'horloge continue

Afin de tester le fonctionnel, je définis le registre d'horloge continu. Je m'attendais à ce que l'horloge continue toujours génère une horloge même si aucune donnée n'a été définie sur le bus. Cependant, je ne vois pas une horloge sur mon oscilloscope. Pourquoi ne vois-je pas une horloge sur mon oscilloscope? Suis-je en train d'interpréter le registre d'horloge continue? Ou ai-je oublié de mettre en place un autre registre?

int frdm_spi_init(SPI_Type *spi, struct frdm_spi_mode *mode, uint32_t hz) 
{ 

     if(mode->frame < FRDM_SPI_MIN_FRAME_SIZE) { 
      return -1; 
     } 

     // Enable clock 
     SIM_SCGC6 |= SIM_SCGC6_SPI0(FRDM_ENABLE); 

     // For debug purpose 
     SPI_MCR_REG(spi) &= ~SPI_MCR_CONT_SCKE_MASK; 
     SPI_MCR_REG(spi) |= (FRDM_ENABLE<<SPI_MCR_CLR_RXF_SHIFT); 

     // Master/slave 
     SPI_MCR_REG(spi) &= ~SPI_MCR_MSTR_MASK; 
     SPI_MCR_REG(spi) |= (mode->mode<<SPI_MCR_MSTR_SHIFT); 

     if(mode->mode == FRDM_SPI_MASTER) { 

      //Frame size 
      SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_FMSZ_MASK; 
      SPI_CTAR_REG(spi,0) |= (((mode->frame-1) & 0x0F)<<SPI_CTAR_FMSZ_SHIFT); 

      // Spi mode 
      SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_CPOL_MASK; 
      SPI_CTAR_REG(spi,0) |= (mode->CPOL)<<SPI_CTAR_CPOL_SHIFT; 
      SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_CPHA_MASK; 
      SPI_CTAR_REG(spi,0) |= (mode->CPHA)<<SPI_CTAR_CPHA_SHIFT; 

      //Always in msb mode 
      SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_LSBFE_MASK; 

     } else if(mode->mode == FRDM_SPI_SLAVE) { 

      /*TODO*/ 
     } 

     //frequency 
     SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_ASC_MASK; 
     SPI_CTAR_REG(spi,0) |= 1<<SPI_CTAR_ASC_SHIFT; 
     SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_PASC_MASK; 
     SPI_CTAR_REG(spi,0) |= 0<<SPI_CTAR_PASC_SHIFT; 
     SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_DBR_MASK; 
     SPI_CTAR_REG(spi,0) |= 0<<SPI_CTAR_DBR_SHIFT; 

     // Fifo 
     SPI_MCR_REG(spi) &= ~SPI_MCR_DIS_TXF_MASK; 
     SPI_MCR_REG(spi) != 0<<SPI_MCR_DIS_TXF_SHIFT; 

     //Enable 
     SPI_MCR_REG(spi) &= ~SPI_MCR_MDIS_MASK; 
     SPI_MCR_REG(spi) != 0<<SPI_MCR_MDIS_SHIFT; 

     // Start hardware 
     SPI_MCR_REG(spi) &= ~SPI_MCR_HALT_MASK; 
     SPI_MCR_REG(spi) |= 0<<SPI_MCR_HALT_SHIFT; 

     return 0; 
} 
+0

Sauf si vous êtes un concepteur de puces, vous ne «mettez pas en œuvre» de registres de fonctions spéciales. Au contraire, en tant que programmeur, vous les configurez ou leur attribuez des valeurs afin d'implémenter des fonctionnalités. –

Répondre

0

Le code présenté ne configure pas les registres de contrôle de broche pour le SPI; Cela peut être fait ailleurs, mais vous devez vérifier que la configuration de la broche est correcte et que le SCK du port SPI que vous utilisez est en MUX avec la broche que vous attendez. Il serait probablement préférable de régler la configuration de la broche dans cette fonction dans tous les cas.

ce bloc semble également suspect:

//frequency 
    SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_ASC_MASK; 
    SPI_CTAR_REG(spi,0) |= 1<<SPI_CTAR_ASC_SHIFT; 
    SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_PASC_MASK; 
    SPI_CTAR_REG(spi,0) |= 0<<SPI_CTAR_PASC_SHIFT; 
    SPI_CTAR_REG(spi,0) &= ~SPI_CTAR_DBR_MASK; 
    SPI_CTAR_REG(spi,0) |= 0<<SPI_CTAR_DBR_SHIFT; 

Il ne pas utiliser le paramètre hz et Y |= 0 << X sera toujours égal à Y. Il sort ASC = 1, PASC = 0, DBR = 0, seul le dernier de ces facteurs affecte la fréquence d'horloge. Vous avez pas fixé de BR et PBR:

vitesse de transmission SCK = (f P/PBR) x [(1 + DBR)/BR]

En supposant que les valeurs de courant sont à la remise à zéro état, ce qui donnerait une horloge de f P/4.

En outre, vous avez une faute de frappe dans:

//Enable 
    SPI_MCR_REG(spi) &= ~SPI_MCR_MDIS_MASK; 
    SPI_MCR_REG(spi) != 0<<SPI_MCR_MDIS_SHIFT; 
       //^
       // error |= not != 

Cependant, la deuxième ligne ne fait rien quand même corrigé, mais la première ligne CLEARS déjà le bit et OR'ing à zéro ne fait rien (encore), donc l'erreur est bénigne. Je suis cependant surpris que votre compilateur n'ait pas émis d'avertissement "déclaration ne fait rien". Je crois qu'il existe des macros pour régler les champs de registre de périphériques individuellement tels que SPI_CTAR_ASC(x), SPI_CTAR_PASC(x) etc. Vous devriez probablement les utiliser pour plus de clarté et pour éviter les erreurs de masquage et les cauchemars de maintenance.