4624 views|2 replies

252

Posts

1

Resources
The OP
 

STM32L151 reads W25Q16 ID error, please help me find out what is the reason [Copy link]

When using STM32L151's SPI2 to read the ID of W25Q16, the return is always 0xFFFF. Please help me find out the reason for the code. The code is based on the punctual atom.

void SPI2_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
    ////SPI Set PB13,14,15 as Output push-pull - SCK, MISO and MOSI
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);

    /* 使能SPI引脚相关的时钟 */
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
   
    /*指令IO的复用功能*/
     GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);
    /*  SCK、MOSI、MISO */
  GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF;  //复用
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
  GPIO_Init(GPIOB,&GPIO_InitStructure);

        /* SPI2 configuration */                                            
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                        
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                   
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                        
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                 
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; 
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                        
        SPI_InitStructure.SPI_CRCPolynomial = 7;                                

        SPI_Init(SPI2, &SPI_InitStructure);  
        /* Enable SPI2  */
        SPI_Cmd(SPI2, ENABLE);                                     
        
        SPI2_ReadWriteByte(0xff); 

}

//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
uint8_t SPI2_ReadWriteByte(uint8_t TxData)
{  
uint8_t retry=0;      
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  {
  retry++;
  if(retry>200)return 0;
  }     
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
  {
  retry++;
  if(retry>200)return 0;
  }             
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据         
}

//读取芯片ID
//返回值如下:       
//0XEF13,表示芯片型号为W25Q80  
//0XEF14,表示芯片型号为W25Q16    
//0XEF15,表示芯片型号为W25Q32  
//0XEF16,表示芯片型号为W25Q64 
//0XEF17,表示芯片型号为W25Q128    
uint16_t W25QXX_ReadID(void)
{
uint16_t Temp = 0;   
GPIO_ResetBits(GPIOB,GPIO_Pin_12);        
SPI2_ReadWriteByte(0x90);//发送读取ID命令     
SPI2_ReadWriteByte(0x00);      
SPI2_ReadWriteByte(0x00);      
SPI2_ReadWriteByte(0x00);         
Temp|=SPI2_ReadWriteByte(0x00)<<8;  
Temp|=SPI2_ReadWriteByte(0x00);  
GPIO_SetBits(GPIOB,GPIO_Pin_12);        
return Temp;
}      

This post is from stm32/stm8

Latest reply

I have encountered your problem before. Finally, I solved it by adding a wake-up instruction before reading ID after power-on. SFLASH_RELEASE_POWER_DOWN 0xAB //Release power off   Details Published on 2020-5-9 08:30
 

4005

Posts

0

Resources
2
 

Is the io port voltage correct?

This post is from stm32/stm8
 
 

321

Posts

1

Resources
3
 

I have encountered your problem before. Finally, I solved it by adding a wake-up instruction before reading ID after power-on. SFLASH_RELEASE_POWER_DOWN 0xAB //Release power off

This post is from stm32/stm8
 
Personal signature模电临时工
 

Just looking around
Find a datasheet?

EEWorld Datasheet Technical Support

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号
快速回复 返回顶部 Return list