使用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条回答
kmmmko
1楼-- · 2019-08-17 01:51
MoQinchuan 发表于 2017-1-7 09:11
请问解决了吗....我问题一样....

我知道了,你如果用的原子哥的例程的话,你要改一下SPI初始化函数里面的波特率预分频值配置那里,原子哥的程序把它配置到了最低,你要把它改一下,不要太高也不要太低,这样就能正常读写了。
cunzhang521
2楼-- · 2019-08-17 07:29

cunzhang521
3楼-- · 2019-08-17 09:55
回复【2楼】cunzhang521:
---------------------------------
焊接的是W25Q64。
我看到论坛里也有人出现过这个问题,但是没找到合适的答案。
我用万用表量过,可以控制片选信号的高低电平。
单步调试时,只要过了Temp|=SPI4_ReadWriteByte(0xFF);  这一句,就会显示Temp的值是0xffff
到底是哪儿的原因呢?新手真是伤脑筋啊。
正点原子
4楼-- · 2019-08-17 15:31
 精彩回答 2  元偷偷看……
cunzhang521
5楼-- · 2019-08-17 16:34
回复【4楼】正点原子:
---------------------------------
嗯,我明天去测测吧,如果有呢?还可能是什么问题呢?原子哥求教啊
cunzhang521
6楼-- · 2019-08-17 21:48
回复【4楼】正点原子:
---------------------------------
另外有个疑问:我外加了上拉电阻,然后在设置复用口的时候设置成上拉没问题吧。

一周热门 更多>