STM32 HAL SPI 时钟问题

问题描述 投票:0回答:1

刚开始使用 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 线路会这样。

stm32 clock spi hal
1个回答
0
投票
  1. (uint8_t *)0x51
    表示您将
    0x51
    作为缓冲区的地址传递。你不能只获取右值的地址
    0x51
  2. 您错误地计算了数据的大小。你必须使用 1
    uint8_t
    而不是 2。

所以你必须执行以下操作:

uint8_t buffer[] = { 0x51 };
HAL_SPI_Transmit(&SPI_1, buffer, sizeof(buffer), 10);
© www.soinside.com 2019 - 2024. All rights reserved.