打印

小白求助,用SPI读取FLASH的ID号,为啥始终显示0xffff

[复制链接]
1640|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
菊江先生|  楼主 | 2020-4-2 13:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "./flash/bsp_spi_flash.h"
#include "./usart/bsp_usart.h"               





static __IO uint32_t  SPITimeout = SPIT_LONG_TIMEOUT;   


static uint32_t SPI_TIMEOUT_UserCallback(uint8_t errorCode);



static void SPI_GPIO_Config(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;

        /* 使能与 SPI 有关的时钟 */
        FLASH_SPI_APBxClock_FUN ( FLASH_SPI_CLK, ENABLE );
        FLASH_SPI_GPIO_APBxClock_FUN ( FLASH_SPI_GPIO_CLK, ENABLE );
        


  GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCK_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;               
  GPIO_Init(FLASH_SPI_SCK_PORT, &GPIO_InitStructure);
        
  GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;               
  GPIO_Init(FLASH_SPI_MOSI_PORT, &GPIO_InitStructure);        
        
        GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;               
  GPIO_Init(FLASH_SPI_MISO_PORT, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = FLASH_SPI_CS_PIN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;              
  GPIO_Init(FLASH_SPI_CS_PORT , &GPIO_InitStructure);
        
        FLASH_SPI_CS_HIGH;
        
}


/**
  * @brief  SPI 工作模式配置
  * @param  无
  * @retval 无
  */
static void SPI_Mode_Config(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStructure.SPI_CRCPolynomial = 0;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        
        
        /* SPI 初始化 */
  SPI_Init(FLASH_SPIx, &SPI_InitStructure);

        /* 使能 SPI */
  SPI_Cmd(FLASH_SPIx, ENABLE);   
}



void SPI_FLASH_Init(void)
{

  SPI_GPIO_Config();

  SPI_Mode_Config();

}

uint8_t SPI_FLASH_Send_Byte(uint8_t data)
{
         
        //检查并等待TX缓冲区为空
        while(SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_TXE)==RESET);
        {
        if((SPITimeout--)==0)
                {
                        return SPI_TIMEOUT_UserCallback(0);
                }
        }
        //程序到此,TX缓冲区已空
        SPI_I2S_SendData(FLASH_SPIx, data);
        
        //检查并等待RX缓冲区为非空
        while(SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_RXNE)==RESET);
        {
        if((SPITimeout--)==0)
                {
                        return SPI_TIMEOUT_UserCallback(0);
                }
        }
        //程序到此说明数据发送完毕,并接收到一个字节
        return SPI_I2S_ReceiveData(FLASH_SPIx);
}

uint8_t SPI_FLASH_Read_Byte(void)
{
        return SPI_FLASH_Send_Byte(DUMMY);
}

uint32_t SPI_Read_ID(void)
{
        uint32_t flash_id;
        FLASH_SPI_CS_LOW;
        SPI_FLASH_Send_Byte(READ_JEDEC_ID);
        flash_id = SPI_FLASH_Read_Byte();
        flash_id <<=8;
        flash_id |=SPI_FLASH_Read_Byte();
        flash_id <<=8;
        flash_id |=SPI_FLASH_Read_Byte();
        FLASH_SPI_CS_HIGH;
        return flash_id;
}




static  uint32_t SPI_TIMEOUT_UserCallback(uint8_t errorCode)
{
  /* Block communication and all processes */
  FLASH_ERROR("I2C 等待超时!errorCode = %d",errorCode);

  return 0;
}


以上是SPI的C文件
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#ifndef __SPI_FLASH_H
#define        __SPI_FLASH_H


#include "stm32f10x.h"

#define             FLASH_SPIx                                SPI1
#define             FLASH_SPI_APBxClock_FUN                   RCC_APB2PeriphClockCmd
#define             FLASH_SPI_CLK                             RCC_APB2Periph_SPI1
#define             FLASH_SPI_GPIO_APBxClock_FUN              RCC_APB2PeriphClockCmd
#define             FLASH_SPI_GPIO_CLK                        (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC)

#define             FLASH_SPI_SCK_PORT                         GPIOA   
#define             FLASH_SPI_SCK_PIN                          GPIO_Pin_5
#define             FLASH_SPI_MOSI_PORT                        GPIOA   
#define             FLASH_SPI_MOSI_PIN                         GPIO_Pin_7
#define             FLASH_SPI_MISO_PORT                        GPIOA
#define             FLASH_SPI_MISO_PIN                         GPIO_Pin_6
#define             FLASH_SPI_CS_PORT                          GPIOC
#define             FLASH_SPI_CS_PIN                           GPIO_Pin_0

#define             FLASH_SPI_CS_HIGH       GPIO_SetBits(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN);
#define             FLASH_SPI_CS_LOW        GPIO_SetBits(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN);

#define DUMMY  0x00
#define READ_JEDEC_ID 0x9f

/*等待超时时间*/
#define SPIT_FLAG_TIMEOUT         ((uint32_t)0x1000)
#define SPIT_LONG_TIMEOUT         ((uint32_t)(10 * SPIT_FLAG_TIMEOUT))


/*信息输出*/
#define FLASH_DEBUG_ON         0

#define FLASH_INFO(fmt,arg...)           printf("<<-FLASH-INFO->> "fmt"\n",##arg)
#define FLASH_ERROR(fmt,arg...)          printf("<<-FLASH-ERROR->> "fmt"\n",##arg)
#define FLASH_DEBUG(fmt,arg...)          do{\
                                          if(FLASH_DEBUG_ON)\
                                          printf("<<-FLASH-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\
                                          }while(0)

uint32_t SPI_Read_ID(void);
void SPI_FLASH_Init(void);


#endif


以上是SPI的H文件
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

#include "stm32f10x.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_usart.h"
#include "./flash/bsp_spi_flash.h"
#include <string.h>


/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{
        uint32_t id;

        USART_Config();
        
        SPI_FLASH_Init();
        
        printf("\r\n 这是一个SPI_FLASH_ID读写测试例程 \r\n");
        
        id= SPI_Read_ID();        

       printf("\r\n id=0x%x \r\n",id);        

}
以上是主函数
、、、、、、、、、、、、、、、、、、、、、、、、、、、

使用特权

评论回复

相关帖子

沙发
dirtwillfly| | 2020-4-2 20:23 | 只看该作者
mcu用的哪个型号?
spi flash是什么型号?他们之间是如何连接的?

使用特权

评论回复
板凳
光轮TreeOS| | 2020-4-3 09:57 | 只看该作者
SPI有4工作模式,SPI中的极性CPOL和相位CPHA。
看看你的SPI  flash使用哪种模式。另外接线顺序是否正确。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

447

帖子

0

粉丝