STM32 HAL SPI时钟问题

时间:2020-07-05 23:31:59

标签: stm32 clock spi hal

使用HAL的新手,设置SPI时遇到了几个问题。

我正在STM32F429ZGT6上使用SPI 1。

这是我的设置:

SPI_HandleTypeDef SPI_1;

void SPI_INIT(void)
{
    __HAL_RCC_SPI1_CLK_ENABLE();
    SPI_1.Instance = SPI1;
    SPI_1.Init.Mode = SPI_MODE_MASTER;
    SPI_1.Init.Direction = SPI_DIRECTION_2LINES;
    SPI_1.Init.DataSize = SPI_DATASIZE_8BIT;
    SPI_1.Init.CLKPolarity = SPI_POLARITY_HIGH;
    SPI_1.Init.CLKPhase = SPI_PHASE_2EDGE;
    SPI_1.Init.NSS = SPI_NSS_SOFT;
    SPI_1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    SPI_1.Init.TIMode = SPI_TIMODE_DISABLE;
    SPI_1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    SPI_1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
    HAL_SPI_Init(&SPI_1);
}

static void ConfigGPIOA(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}


static void ConfigGPIOE(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    __HAL_RCC_GPIOE_CLK_ENABLE();       
    
    GPIO_InitStruct.Pin = SPI_CS02_Pin|SPI_CS03_Pin|SPI_CS00_Pin|SPI_CS01_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);
}

只需初始化SPI 1并为SPI1配置GPIO引脚5、6和7。我将GPIOE引脚0、1、2和3设置为手动芯片选择,并且正在向它们写入空闲高电平(由于上拉似乎不起作用而对其进行初始化)

这是我的主音

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    GPIOInit();
    SPI_INIT();

    for(spibyte=0; spibyte < 4; spibyte++)
    {
        CS_LOW();
        if(spibyte == 0)
        {
            HAL_SPI_Transmit(&SPI_1, (uint8_t *)0x51, 2, 10);
        }
        if(spibyte >= 1)
        {
            HAL_SPI_Transmit(&SPI_1, (uint8_t *)0xFF, 2, 10);
        }
        _DELAY(TDISCS);
        CS_HIGH();
   }
}

GPIOInit()同时运行ConfigGPIOA和ConfigGPIOE。

CS_LOW()和CS_HIGH()是仅向上和向下拉动芯片选择的宏。我已经看了示波器上的芯片选择线,它确实会切换。

项目已构建并加载到板上,但是MOSI引脚处于静音状态,将示波器放在时钟引脚上,时钟线被上拉一次,向下拉回,并保持这种状态。

我还将注意到,即使我在SPI初始化过程中已将时钟极性明确设置为高电平,时钟也空闲为低电平。

有什么我想念的吗?我不明白为什么SPI线会以这种方式起作用。

0 个答案:

没有答案