使用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条回答
cunzhang521
2019-08-17 09:55
回复【2楼】cunzhang521:
---------------------------------
焊接的是W25Q64。
我看到论坛里也有人出现过这个问题,但是没找到合适的答案。
我用万用表量过,可以控制片选信号的高低电平。
单步调试时,只要过了Temp|=SPI4_ReadWriteByte(0xFF);  这一句,就会显示Temp的值是0xffff
到底是哪儿的原因呢?新手真是伤脑筋啊。

一周热门 更多>