微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STM32F103VCT6 MINI 使用SPI读取外部Flash W25X16无法发送数据

STM32F103VCT6 MINI 使用SPI读取外部Flash W25X16无法发送数据

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


SPI_Flash配置函数如下:

  1. void SPI_FLASH_Init(void)
  2. {
  3.         //SPI 配置结构体
  4.         SPI_InitTypeDef SPI_InitStructure;
  5.         //GPIO 配置结构体
  6.         GPIO_InitTypeDef GPIO_InitStructure;

  7.         //配置GPIO端口时钟
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

  10.         //配置SPI2时钟RCC_APB1Periph_SPI2
  11.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

  12.         //配置SPI--SCK引脚
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  16.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  17.         //配置SPI--MISO引脚
  18.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  20.         //配置SPI--MOSI引脚
  21.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  22.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  23.         //配置SPI--CS引脚
  24.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  26.         GPIO_Init(GPIOB, &GPIO_InitStructure);

  27.         //将SPI电平拉高,使其失能
  28.         SPI_FLASH_HIGH();

  29.         //SPI 参数配置
  30.         SPI_Cmd(SPI2, DISABLE);
  31.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;                //SPI数据模式设置为 双线双向全双工
  32.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                        //SPI工作在主机模式下
  33.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                        //SPI 数据大小 为8位
  34.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                                                //SPI串行时钟稳态,时钟悬空高
  35.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                                                        //SPI捕获的时钟沿\
  36.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                //SPI NSS信号由软件管理
  37.         SPI_InitStructure.SPI_BaudRatePrescaler        = SPI_BaudRatePrescaler_16;                //SPI 波特率的预分频值,用来设置SCK时钟
  38.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                //SPI 数据传输是由MSB位开始还是由LSB位开始
  39.         SPI_InitStructure.SPI_CRCPolynomial = 7;                                                                //定义用于CRC值计算的多项式

  40.         SPI_Init(SPI2, &SPI_InitStructure);

  41.         //使能SPI2
  42.         SPI_Cmd(SPI2, ENABLE);
  43. }

复制代码


main函数中开始去读取器件ID号,函数如下:

  1. u32 SPI_FLASH_ReadDeviceID(void)
  2. {
  3.         u32 Temp = 0;       

  4.         //将Flash 电平拉低,使能
  5.         SPI_FLASH_LOW();

  6.         //向Flash 发送【读取器件ID号  W25X_DeviceID】指令
  7. <font color="#ff0000">        SPI_FLASH_SendByte(W25X_DeviceID);</font>

  8.         SPI_FLASH_SendByte(DummyByte);
  9.         SPI_FLASH_SendByte(DummyByte);
  10.         SPI_FLASH_SendByte(DummyByte);

  11.         Temp = SPI_FLASH_SendByte(DummyByte);

  12.         //将Flash 电平拉高,失能
  13.         SPI_FLASH_HIGH();

  14.         return Temp;
  15. }

复制代码


但是在    SPI_FLASH_SendByte(W25X_DeviceID);  这一句发送数据时出了问题
SPI_FLASH_SendByte函数如下:

  1. u8 SPI_FLASH_SendByte(u8 byte)
  2. {
  3.         //等待SPI发送缓冲区为空,再开始发送
  4.         while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);

  5.         //发送数据
  6.         SPI_I2S_SendData(SPI2, byte);

  7.         //等待SPI接收缓冲区不为空时,说明有数据,开始接收数据
  8. <font color="#ff0000">        while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);</font>
  9.         //while((SPI2->SR &SPI_I2S_FLAG_RXNE) == RESET);

  10.         //返回接收数据
  11.         return SPI_I2S_ReceiveData(SPI2);
  12. }

复制代码

在执行到   while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);  这一句时就会一直卡着,不知道大家有没有遇见过这种问题,希望知道的朋友帮忙解释一下,谢谢啦!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top