使用STM32F427的SPI4来控制W25Q64,读出的ID是0xffff

2019-08-17 01:26发布

主函数
int main(void)
{
u8 datatemp[SIZE];
u32 FLASH_SIZE;
W25QXX_Init();       //W25QXX初始化

      while(W25QXX_ReadID()==W25Q64) //0XEF16,表示芯片型号为W25Q64 
    {
        W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE); //从倒数第100个地址处开始,写入SIZE长度的数据
        delay_ms(10);
        W25QXX_Read(datatemp,FLASH_SIZE-100,SIZE); //从倒数第100个地址处开始,读出SIZE个字节

    }
}


void W25QXX_Init(void)

  GPIO_InitTypeDef  GPIO_InitStructure;
 
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);   //使能GPIOE时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);    //使能GPIOC时钟

 //GPIOE 3  这是W25Q64片选信号 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PE3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PC0 这是另一个复用的片选信号
    GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
 
GPIO_SetBits(GPIOC,GPIO_Pin_0);      //PC0输出1,防止干扰
W25QXX_CS=1; //SPI FLASH不选中
SPI4_Init();   //初始化SPI
SPI4_SetSpeed(SPI_BaudRatePrescaler_2); //设置为42M时钟,高速模式 
W25QXX_TYPE=W25QXX_ReadID(); //读取FLASH ID.
}  


u16 W25QXX_ReadID(void)
{
u16 Temp = 0;  
W25QXX_CS=0;    
SPI4_ReadWriteByte(0x90);//发送读取ID命令    
SPI4_ReadWriteByte(0x00);    
SPI4_ReadWriteByte(0x00);    
SPI4_ReadWriteByte(0x00);   
Temp|=SPI4_ReadWriteByte(0xFF)<<8;  
Temp|=SPI4_ReadWriteByte(0xFF);  
W25QXX_CS=1;    
return Temp;
}  

在头函数中,已经定义
#define W25QXX_CS PEout(3)   //W25QXX的片选信号,
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
大师VS叫兽
1楼-- · 2019-08-19 17:43
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-08-19 22:22
大师VS叫兽 发表于 2017-3-3 13:53
关于W25Q64读写问题解决了一半,能读写了。但是不能擦除,求原子哥帮忙看看。

1、看主函数(还是原子哥 ...

这个直接参考我们代码就好了吧?
扇区擦除,整片擦除,都不行?
未来,我来
3楼-- · 2019-08-20 02:51
kmmmko 发表于 2017-1-19 17:11
我知道了,你如果用的原子哥的例程的话,你要改一下SPI初始化函数里面的波特率预分频值配置那里,原子哥 ...

正解,我也是把它改低了就好了

一周热门 更多>