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