Embedded FRDM-K64F上的SPI驱动器和连续时钟

Embedded FRDM-K64F上的SPI驱动器和连续时钟,embedded,driver,spi,bare-metal,cortex-m,Embedded,Driver,Spi,Bare Metal,Cortex M,我正在尝试在FRDM-K64F板上创建自己的SPI裸机驱动程序。我现在只写了一个初始化函数 为了测试功能,我设置了连续时钟寄存器。我希望即使总线上没有设置数据,连续时钟也会始终生成时钟。然而,我在示波器上看不到时钟 为什么我的示波器上看不到时钟?我是否误解了连续时钟寄存器?还是我忘了实现另一个寄存器 int frdm_spi_init(SPI_Type *spi, struct frdm_spi_mode *mode, uint32_t hz) { if(mode->f

我正在尝试在FRDM-K64F板上创建自己的SPI裸机驱动程序。我现在只写了一个初始化函数

为了测试功能,我设置了连续时钟寄存器。我希望即使总线上没有设置数据,连续时钟也会始终生成时钟。然而,我在示波器上看不到时钟

为什么我的示波器上看不到时钟?我是否误解了连续时钟寄存器?还是我忘了实现另一个寄存器

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;
}
int frdm_spi_init(spi_Type*spi,struct frdm_spi_mode*mode,uint32_t hz)
{
if(模式->帧SPI|U MCR|U REG(SPI)|=(FRDM_ENABLE提供的代码没有为SPI配置管脚控制寄存器;这可以在其他地方完成,但您应该验证管脚配置是否正确,以及您正在使用的SPI端口的SCK是否与您期望的管脚多路复用。在任何情况下,最好在此功能中设置管脚配置

此外,该块看起来可疑:

    //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;
但是第二行即使在更正后也不会执行任何操作,但是第一行已经清除了位,并且0中的OR'ing也不会执行任何操作(仍然),因此错误是良性的。但是,我很惊讶您的编译器没有发出“语句不执行任何操作”警告


我相信有一些宏可以单独设置外围寄存器字段,如
SPI\u CTAR\u ASC(x)
SPI\u CTAR\u PASC(x)
等。为了清晰起见,您可能应该使用这些宏,以避免掩盖错误和维护噩梦。

除非您是芯片设计师,否则您不会“实现”特殊功能寄存器。相反,作为程序员,您可以配置它们或为它们赋值,以实现功能。
    //Enable
    SPI_MCR_REG(spi) &= ~SPI_MCR_MDIS_MASK;
    SPI_MCR_REG(spi) != 0<<SPI_MCR_MDIS_SHIFT;   
                 //  ^ 
                 //  error |= not !=