硬汉嵌入式论坛

 找回密码
 立即注册
查看: 686|回复: 1
收起左侧

[技术讨论] SPI写失败

[复制链接]

5

主题

19

回帖

34

积分

新手上路

积分
34
发表于 2024-9-8 16:02:29 | 显示全部楼层 |阅读模式
STM32F103ZET6,使用HAL库进行SPI读写W25Q64,发现SPI读成功,但SPI写过程中CS脚异常拉高拉低,见波形,有大佬遇到过这种情况吗?




配置和读写接口如下:
static void SPI1_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;

    FLASH_SPIx_CLK_ENABLE();
    SPI_SCK_GPIO_CLK_ENABLE();
    SPI_MOSI_GPIO_CLK_ENABLE();
    SPI_MISO_GPIO_CLK_ENABLE();
    SPI_CS_GPIO_CLK_ENABLE();

    GPIO_InitStruct.Pin = SPI_SCK_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(SPI_SCK_GPIO_PORT , &GPIO_InitStruct);

    GPIO_InitStruct.Pin = SPI_MOSI_GPIO_PIN;
    HAL_GPIO_Init(SPI_MOSI_GPIO_PORT , &GPIO_InitStruct);

    GPIO_InitStruct.Pin = SPI_MISO_GPIO_PIN;
    HAL_GPIO_Init(SPI_MISO_GPIO_PORT , &GPIO_InitStruct);

    /* CS引脚需要配置为普通推挽输出 */
    GPIO_InitStruct.Pin = SPI_CS_GPIO_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    HAL_GPIO_Init(SPI_CS_GPIO_PORT , &GPIO_InitStruct);

    HAL_GPIO_WritePin(SPI_CS_GPIO_PORT, SPI_CS_GPIO_PIN, GPIO_PIN_SET);
}

static void SPI1_Mode_Config(uint32_t baudrate_prescaler, uint32_t clk_polarity, uint32_t clk_phase)
{
    /* 提高执行效率,只有在SPI硬件参数发生变化时,才执行初始化 */
    if ( (SPI1_BaudRatePrescaler == baudrate_prescaler) && (SPI1_CLKPhase == clk_phase) && (SPI1_CLKPolarity == clk_polarity) )
    {
        return;
    }

    SPI1_Handle.Instance = FLASH_SPIx;
    SPI1_Handle.Init.Mode = SPI_MODE_MASTER;                    /* SPI工作在主控模式 */
    SPI1_Handle.Init.Direction = SPI_DIRECTION_2LINES;          /* 全双工 */
    SPI1_Handle.Init.DataSize = SPI_DATASIZE_8BIT;              /* 数据宽度为8bit */
    SPI1_Handle.Init.CLKPolarity = clk_polarity;                /* 配置时钟极性:SCK空闲时为高电平,相当于CPOL=0 */
    SPI1_Handle.Init.CLKPhase = clk_phase;                      /* 配置时钟相位:在SCK时钟的第二个跳边沿数据将被采样,相当于CPHA=1 */
    SPI1_Handle.Init.NSS = SPI_NSS_SOFT;                        /* CS信号由软件控制 */
    /*W25Q64支持最高通讯速率为104MHz*/
    SPI1_Handle.Init.BaudRatePrescaler = baudrate_prescaler;        /* SPI1在APB1总线上,通讯速率为72MHz/2=36MHz */
    SPI1_Handle.Init.FirstBit = SPI_FIRSTBIT_MSB;                   /* 数据传输为MSB先行 */
    SPI1_Handle.Init.TIMode = SPI_TIMODE_DISABLE;                   /* 关闭TI模式 */
    SPI1_Handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;   /* 关闭硬件CRC校验 */
    SPI1_Handle.Init.CRCPolynomial = 7u;                            /* CRC值计算的多项式,禁止CRC后,此位无效 */
    HAL_SPI_Init(&SPI1_Handle);

    __HAL_SPI_ENABLE(&SPI1_Handle);     /* 使能SPI1 */
}


uint8_t Bsp_SPI_Write_Read_Data(uint8_t port, uint8_t* txdata, uint8_t *rxdata, uint16_t size)
{
    uint8_t status = 0;

    if(PORT_SPI_FLASH == port)
    {
        status = HAL_SPI_TransmitReceive(&SPI1_Handle, txdata, rxdata, size, 1000000);
    }

    return status;
}



234.png








回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2024-9-10 08:43:51 | 显示全部楼层
使能这个上拉试试

GPIO_InitStruct.Pull = GPIO_NOPULL;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 18:10 , Processed in 0.041562 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表