STM32F103VCT6 MINI 使用SPI读取外部Flash W25X16无法发送数据
时间:10-02
整理:3721RD
点击:
最近在做一个使用SPI读取外部Flash的实验,芯片是STM32F103VCT6 MINI ,Flash信号是:W25X16
具体引脚配置如下图:

SPI_Flash配置函数如下:
main函数中开始去读取器件ID号,函数如下:
但是在 SPI_FLASH_SendByte(W25X_DeviceID); 这一句发送数据时出了问题
SPI_FLASH_SendByte函数如下:
具体引脚配置如下图:

SPI_Flash配置函数如下:
- void SPI_FLASH_Init(void)
- {
- //SPI 配置结构体
- SPI_InitTypeDef SPI_InitStructure;
- //GPIO 配置结构体
- GPIO_InitTypeDef GPIO_InitStructure;
- //配置GPIO端口时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- //配置SPI2时钟RCC_APB1Periph_SPI2
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
- //配置SPI--SCK引脚
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //配置SPI--MISO引脚
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //配置SPI--MOSI引脚
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //配置SPI--CS引脚
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //将SPI电平拉高,使其失能
- SPI_FLASH_HIGH();
- //SPI 参数配置
- SPI_Cmd(SPI2, DISABLE);
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI数据模式设置为 双线双向全双工
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //SPI工作在主机模式下
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI 数据大小 为8位
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //SPI串行时钟稳态,时钟悬空高
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //SPI捕获的时钟沿\
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //SPI NSS信号由软件管理
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //SPI 波特率的预分频值,用来设置SCK时钟
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //SPI 数据传输是由MSB位开始还是由LSB位开始
- SPI_InitStructure.SPI_CRCPolynomial = 7; //定义用于CRC值计算的多项式
- SPI_Init(SPI2, &SPI_InitStructure);
- //使能SPI2
- SPI_Cmd(SPI2, ENABLE);
- }
main函数中开始去读取器件ID号,函数如下:
- u32 SPI_FLASH_ReadDeviceID(void)
- {
- u32 Temp = 0;
- //将Flash 电平拉低,使能
- SPI_FLASH_LOW();
- //向Flash 发送【读取器件ID号 W25X_DeviceID】指令
- <font color="#ff0000"> SPI_FLASH_SendByte(W25X_DeviceID);</font>
- SPI_FLASH_SendByte(DummyByte);
- SPI_FLASH_SendByte(DummyByte);
- SPI_FLASH_SendByte(DummyByte);
- Temp = SPI_FLASH_SendByte(DummyByte);
- //将Flash 电平拉高,失能
- SPI_FLASH_HIGH();
- return Temp;
- }
但是在 SPI_FLASH_SendByte(W25X_DeviceID); 这一句发送数据时出了问题
SPI_FLASH_SendByte函数如下:
- u8 SPI_FLASH_SendByte(u8 byte)
- {
- //等待SPI发送缓冲区为空,再开始发送
- while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
- //发送数据
- SPI_I2S_SendData(SPI2, byte);
- //等待SPI接收缓冲区不为空时,说明有数据,开始接收数据
- <font color="#ff0000"> while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);</font>
- //while((SPI2->SR &SPI_I2S_FLAG_RXNE) == RESET);
- //返回接收数据
- return SPI_I2S_ReceiveData(SPI2);
- }
