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;
}
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. –