野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16379|回复: 2

SPI 获取FLASH 的ID 显示都是FFFFFF,读取内容都是0

[复制链接]
发表于 2019-2-27 14:40:20 | 显示全部楼层 |阅读模式
我用火哥的SPI——FLASH的程序读写W25Q128的FLASH,读取ID都是FFFFFF,读取里面的数据都是00,搞不懂什么情况了,搞了2天还是没有搞出来。。。。那个大神知道情况
[mw_shl_code=c,true]#include "flash.h"

/************************************flash.c*****************************/
void SPI_GPIO_Config(void)
{
        GPIO_InitTypeDef           GPIO_InitStruct;
        SPI_GPIO_CMD(SPI_NSS_CLK | SPI_SCK_CLK | SPI_MISO_CLK | SPI_MOSI_CLK | SPI_MODE_CLK, ENABLE);
       
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStruct.GPIO_Pin = SPI_NSS_PIN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SPI_NSS_PORT, &GPIO_InitStruct);
       
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Pin = SPI_SCK_PIN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SPI_SCK_PORT, &GPIO_InitStruct);
       
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_InitStruct.GPIO_Pin = SPI_MISO_PIN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SPI_MISO_PORT, &GPIO_InitStruct);
       
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Pin = SPI_MOSI_PIN;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SPI_MOSI_PORT, &GPIO_InitStruct);
       
        GPIO_SetBits(SPI_NSS_PORT, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
}

void SPI_MODE_Config(void)
{
        SPI_InitTypeDef              SPI_InitStruct;
        SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
        SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStruct.SPI_CRCPolynomial = 0;
        SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
        SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
        SPI_Init(SPIx, &SPI_InitStruct);
        SPI_Cmd(SPIx, ENABLE);
}
       
void SPI_Config(void)
{
        SPI_GPIO_Config();
        SPI_MODE_Config();
}




uint8_t SPI_FLASH_Sendbyte(uint8_t data)
{
        while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPIx, data);
        while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
        return SPI_I2S_ReceiveData(SPIx);
}

uint8_t SPI_FLASH_Receivebyte(void)
{
        return SPI_FLASH_Sendbyte(DUMMY);
}

uint32_t SPI_FLASH_GetId(void)
{
        uint32_t flashid = 0;
       
        SPI_NSS_RESET;
        SPI_FLASH_Sendbyte(0x9F);
        flashid = SPI_FLASH_Sendbyte(0X00);
        flashid <<= 8;
        flashid |= SPI_FLASH_Sendbyte(0X00);
        flashid <<= 8;
        flashid |= SPI_FLASH_Sendbyte(0X00);
        SPI_NSS_SET;

        return flashid;
}[/mw_shl_code]


/**********************************flash.h*********************/
[mw_shl_code=c,true]#ifndef __FLASH_H
#define __FLASH_H

#include "stm32f10x.h"

#define SPI_NSS_CLK           RCC_APB2Periph_GPIOA
#define SPI_NSS_PIN           GPIO_Pin_4
#define SPI_NSS_PORT          GPIOA

#define SPI_SCK_CLK           RCC_APB2Periph_GPIOA
#define SPI_SCK_PIN           GPIO_Pin_5
#define SPI_SCK_PORT          GPIOA

#define SPI_MISO_CLK          RCC_APB2Periph_GPIOA
#define SPI_MISO_PIN          GPIO_Pin_6
#define SPI_MISO_PORT         GPIOA

#define SPI_MOSI_CLK          RCC_APB2Periph_GPIOA
#define SPI_MOSI_PIN          GPIO_Pin_7
#define SPI_MOSI_PORT         GPIOA

#define SPI_MODE_CLK          RCC_APB2Periph_SPI1

#define SPI_GPIO_CMD          RCC_APB2PeriphClockCmd
#define SPI_MODE_CMD          RCC_APB2PeriphClockCmd

#define SPI_MODE_CMD          RCC_APB2PeriphClockCmd

#define SPI_NSS_SET           GPIO_SetBits(SPI_NSS_PORT, SPI_NSS_PIN)
#define SPI_NSS_RESET         GPIO_ResetBits(SPI_NSS_PORT, SPI_NSS_PIN)

#define DUMMY                 0X00
#define SPIx                  SPI1

void SPI_Config(void);
uint8_t SPI_FLASH_Sendbyte(uint8_t data);
uint8_t SPI_FLASH_Receivebyte(void);
uint32_t SPI_FLASH_GetId(void);

#endif
[/mw_shl_code]
回复

使用道具 举报

发表于 2019-2-27 15:36:26 | 显示全部楼层
如果型号一样,那就是硬件的问题了,我们的代码在我们的板子测试是可以的
回复 支持 反对

使用道具 举报

发表于 2020-3-8 11:22:30 | 显示全部楼层
NSS引脚应该设置为推挽输出
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 18:26 , Processed in 0.101642 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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