stm32F103vgt6 SPI2读写flash w25Q128 都不出数据

2019-07-21 04:57发布

本帖最后由 jorry 于 2017-4-20 22:39 编辑

采用原子的代码,板子为硬件电路和原子该部分电路一样,但无法读出数据,单步提示图,调用代码如下#ifdef  USING_FLASHDEVICE
       
     const u8 TEXT_Buffer[]={"Explorer STM32F1 SPI TEST"};
     #define SIZE sizeof(TEXT_Buffer)       
                 u32 FLASH_SIZE=16*1024*1024;        //FLASH ′óD¡Îa16×Ö½ú
                 u8 datatemp[SIZE];
                 
        #endif
#ifdef  USING_FLASHDEVICE                        SPI_Flash_Init();                  //SPI FLASH 3õê¼»ˉ
                                                while(SPI_Flash_ReadID()!=W25Q128)                                                        //¼ì2a2»μ½W25Q128 ¿éòÔ¼ì2aμ½
                  {
                                                                USART1_Printfstr("Please Check! ");
                                                                delay_ms(100);
                                                }
                                                SPI_Flash_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE);                        //′óμ1êyμú100¸öμØÖ·′|¿aê¼,D′èëSIZE3¤¶èμÄêy¾Y
                        delay_ms(100);
#endif
读取代码如下
#ifdef USING_FLASHDEVICE
                         SPI_Flash_Read(datatemp,FLASH_SIZE-100,SIZE);                                //′óμ1êyμú100¸öμØÖ·′|¿aê¼,¶á3öSIZE¸ö×Ö½ú
                   delay_ms(100);
                  sprintf(temp,"%s ",datatemp);
                   USART1_Printfstr(temp);   
#endif

找不出问题,硬件经测量和原子电路一样,供电都为3.3V,请指导帮助!谢谢



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
jorry
2019-07-21 19:46

u16 SPI_FLASH_TYPE=W25Q128;//ĬèϾíêÇ25Q128

//4KbytesÎaò»¸öSector
//16¸öéèÇøÎa1¸öBlock
//W25X16
//èYá¿Îa2M×Ö½ú,12óD32¸öBlock,512¸öSector

//3õê¼»ˉSPI FLASHμÄIO¿ú
void SPI_Flash_Init(void)
{       
  GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTBê±Öóê1Äü

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //íÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_5);  //Öøß1©μçflash
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  // PB12 íÆíì
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //íÆíìêä3ö
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        GPIO_SetBits(GPIOB,GPIO_Pin_12);  //spi flash 2»Ñ¡ÖD
       
        SPI2_Init();                           //3õê¼»ˉSPI
        SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//éèÖÃÎa18Mê±Öó,¸ßËùÄ£ê½
        SPI_FLASH_TYPE=SPI_Flash_ReadID();//¶áè¡FLASH ID.  

}  

//¶áè¡SPI_FLASHμÄ×′쬼Ä′æÆ÷
//BIT7  6   5   4   3   2   1   0
//SPR   RV  TB BP2 BP1 BP0 WEL BUSY
//SPR:ĬèÏ0,×′쬼Ä′æÆ÷±£»¤Î»,ÅäoÏWPê1óÃ
//TB,BP2,BP1,BP0:FLASHÇøóòD′±£»¤éèÖÃ
//WEL′ê1ÄüËø¶¨
//BUSY:Ã|±ê¼Çλ(1,Ã|;0,¿ÕÏD)
//ĬèÏ:0x00
u8 SPI_Flash_ReadSR(void)   
{  
        u8 byte=0;   
        SPI_FLASH_CS=0;                            //ê1ÄüÆ÷¼t   
        SPI2_ReadWriteByte(W25X_ReadStatusReg);    //·¢Ëí¶áè¡×′쬼Ä′æÆ÷Ãüáî   
        byte=SPI2_ReadWriteByte(0Xff);             //¶áè¡ò»¸ö×Ö½ú  
        SPI_FLASH_CS=1;                            //è¡ÏûƬѡ     
        return byte;   
}
//D′SPI_FLASH×′쬼Ä′æÆ÷
//Ö»óDSPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)¿éòÔD′!!!
void SPI_FLASH_Write_SR(u8 sr)   
{   
        SPI_FLASH_CS=0;                            //ê1ÄüÆ÷¼t   
        SPI2_ReadWriteByte(W25X_WriteStatusReg);   //·¢ËíD′è¡×′쬼Ä′æÆ÷Ãüáî   
        SPI2_ReadWriteByte(sr);               //D′èëò»¸ö×Ö½ú  
        SPI_FLASH_CS=1;                            //è¡ÏûƬѡ                  
}   
//SPI_FLASHD′ê1Äü       
//½«WELÖÃλ   
void SPI_FLASH_Write_Enable(void)   
{
        SPI_FLASH_CS=0;                            //ê1ÄüÆ÷¼t   
    SPI2_ReadWriteByte(W25X_WriteEnable);      //·¢ËíD′ê1Äü  
        SPI_FLASH_CS=1;                            //è¡ÏûƬѡ                  
}
//SPI_FLASHD′½ûÖ1       
//½«WELÇåáã  
void SPI_FLASH_Write_Disable(void)   
{  
        SPI_FLASH_CS=0;                            //ê1ÄüÆ÷¼t   
    SPI2_ReadWriteByte(W25X_WriteDisable);     //·¢ËíD′½ûÖ1Ö¸áî   
        SPI_FLASH_CS=1;                            //è¡ÏûƬѡ                  
}                             
//¶áè¡D¾Æ¬ID W25X16μÄID:0XEF14
u16 SPI_Flash_ReadID(void)
{
        u16 Temp = 0;          
        SPI_FLASH_CS=0;                                    
        SPI2_ReadWriteByte(0x90);//·¢Ëí¶áè¡IDÃüáî            
        SPI2_ReadWriteByte(0x00);             
        SPI2_ReadWriteByte(0x00);             
        SPI2_ReadWriteByte(0x00);                                    
        Temp|=SPI2_ReadWriteByte(0xFF)<<8;  
        Temp|=SPI2_ReadWriteByte(0xFF);         
        SPI_FLASH_CS=1;                                    
        return Temp;
}                       
//&#182;áè&#161;SPI FLASH  
//&#212;ú&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;&#182;áè&#161;&#214;&#184;&#182;¨3¤&#182;èμ&#196;êy&#190;Y
//pBuffer:êy&#190;Y′&#230;′¢&#199;&#248;
//ReadAddr:&#191;aê&#188;&#182;áè&#161;μ&#196;μ&#216;&#214;·(24bit)
//NumByteToRead:òa&#182;áè&#161;μ&#196;×&#214;&#189;úêy(×&#238;′ó65535)
void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{
        u16 i;                                                                                                        
        SPI_FLASH_CS=0;                            //ê1&#196;ü&#198;÷&#188;t   
    SPI2_ReadWriteByte(W25X_ReadData);         //·¢&#203;í&#182;áè&#161;&#195;üá&#238;   
    SPI2_ReadWriteByte((u8)((ReadAddr)>>16));  //·¢&#203;í24bitμ&#216;&#214;·   
    SPI2_ReadWriteByte((u8)((ReadAddr)>>8));   
    SPI2_ReadWriteByte((u8)ReadAddr);   
    for(i=0;i<NumByteToRead;i++)
        {
        pBuffer[i]=SPI2_ReadWriteByte(0XFF);   //&#209;-&#187;·&#182;áêy  
                 
    }
           SPI_FLASH_CS=1;                            //è&#161;&#207;&#251;&#198;&#172;&#209;&#161;                  
}  
//SPI&#212;úò&#187;ò3(0~65535)&#196;úD′è&#235;éùóú256&#184;&#246;×&#214;&#189;úμ&#196;êy&#190;Y
//&#212;ú&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;D′è&#235;×&#238;′ó256×&#214;&#189;úμ&#196;êy&#190;Y
//pBuffer:êy&#190;Y′&#230;′¢&#199;&#248;
//WriteAddr:&#191;aê&#188;D′è&#235;μ&#196;μ&#216;&#214;·(24bit)
//NumByteToWrite:òaD′è&#235;μ&#196;×&#214;&#189;úêy(×&#238;′ó256),&#184;&#195;êy2&#187;ó|&#184;&#195;3&#172;1y&#184;&#195;ò3μ&#196;ê£óà×&#214;&#189;úêy!!!         
void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
        u16 i;  
    SPI_FLASH_Write_Enable();                  //SET WEL
        SPI_FLASH_CS=0;                            //ê1&#196;ü&#198;÷&#188;t   
    SPI2_ReadWriteByte(W25X_PageProgram);      //·¢&#203;íD′ò3&#195;üá&#238;   
    SPI2_ReadWriteByte((u8)((WriteAddr)>>16)); //·¢&#203;í24bitμ&#216;&#214;·   
    SPI2_ReadWriteByte((u8)((WriteAddr)>>8));   
    SPI2_ReadWriteByte((u8)WriteAddr);   
    for(i=0;i<NumByteToWrite;i++)SPI2_ReadWriteByte(pBuffer[i]);//&#209;-&#187;·D′êy  
        SPI_FLASH_CS=1;                            //è&#161;&#207;&#251;&#198;&#172;&#209;&#161;
        SPI_Flash_Wait_Busy();                                           //μè′yD′è&#235;&#189;áê&#248;
}
//&#206;T&#188;ì&#209;éD′SPI FLASH
//±&#216;D&#235;è·±£&#203;ùD′μ&#196;μ&#216;&#214;··&#182;&#206;§&#196;úμ&#196;êy&#190;Yè&#171;2&#191;&#206;a0XFF,·&#241;&#212;ò&#212;ú·&#199;0XFF′|D′è&#235;μ&#196;êy&#190;Y&#189;&#171;꧰ü!
//&#190;&#223;óD×&#212;&#182;ˉ&#187;&#187;ò31|&#196;ü
//&#212;ú&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;D′è&#235;&#214;&#184;&#182;¨3¤&#182;èμ&#196;êy&#190;Y,μ&#171;ê&#199;òaè·±£μ&#216;&#214;·2&#187;&#212;&#189;&#189;&#231;!
//pBuffer:êy&#190;Y′&#230;′¢&#199;&#248;
//WriteAddr:&#191;aê&#188;D′è&#235;μ&#196;μ&#216;&#214;·(24bit)
//NumByteToWrite:òaD′è&#235;μ&#196;×&#214;&#189;úêy(×&#238;′ó65535)
//CHECK OK
void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{                                           
        u16 pageremain;          
        pageremain=256-WriteAddr%256; //μ¥ò3ê£óàμ&#196;×&#214;&#189;úêy                             
        if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//2&#187;′óóú256&#184;&#246;×&#214;&#189;ú
        while(1)
        {          
                SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain);
                if(NumByteToWrite==pageremain)break;//D′è&#235;&#189;áê&#248;á&#203;
                 else //NumByteToWrite>pageremain
                {
                        pBuffer+=pageremain;
                        WriteAddr+=pageremain;       

                        NumByteToWrite-=pageremain;                          //&#188;&#245;è¥ò&#209;&#190;-D′è&#235;á&#203;μ&#196;×&#214;&#189;úêy
                        if(NumByteToWrite>256)pageremain=256; //ò&#187;′&#206;&#191;éò&#212;D′è&#235;256&#184;&#246;×&#214;&#189;ú
                        else pageremain=NumByteToWrite;           //2&#187;1&#187;256&#184;&#246;×&#214;&#189;úá&#203;
                }
        };            
}
//D′SPI FLASH  
//&#212;ú&#214;&#184;&#182;¨μ&#216;&#214;·&#191;aê&#188;D′è&#235;&#214;&#184;&#182;¨3¤&#182;èμ&#196;êy&#190;Y
//&#184;&#195;oˉêy′&#248;2á3y2ù×÷!
//pBuffer:êy&#190;Y′&#230;′¢&#199;&#248;
//WriteAddr:&#191;aê&#188;D′è&#235;μ&#196;μ&#216;&#214;·(24bit)
//NumByteToWrite:òaD′è&#235;μ&#196;×&#214;&#189;úêy(×&#238;′ó65535)                    
u8 SPI_FLASH_BUF[4096];
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{
        u32 secpos;
        u16 secoff;
        u16 secremain;          
        u16 i;   

        secpos=WriteAddr/4096;//éè&#199;&#248;μ&#216;&#214;· 0~511 for w25x16
        secoff=WriteAddr%4096;//&#212;úéè&#199;&#248;&#196;úμ&#196;&#198;&#171;ò&#198;
        secremain=4096-secoff;//éè&#199;&#248;ê£óà&#191;&#213;&#188;&#228;′óD&#161;   

        if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//2&#187;′óóú4096&#184;&#246;×&#214;&#189;ú
        while(1)
        {       
                SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//&#182;á3&#246;&#213;&#251;&#184;&#246;éè&#199;&#248;μ&#196;&#196;úèY
                for(i=0;i<secremain;i++)//D£&#209;éêy&#190;Y
                {
                        if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//Dèòa2á3y            
                }
                if(i<secremain)//Dèòa2á3y
                {
                        SPI_Flash_Erase_Sector(secpos);//2á3y&#213;a&#184;&#246;éè&#199;&#248;
                        for(i=0;i<secremain;i++)           //&#184;′&#214;&#198;
                        {
                                SPI_FLASH_BUF[i+secoff]=pBuffer[i];          
                        }
                        SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//D′è&#235;&#213;&#251;&#184;&#246;éè&#199;&#248;  

                }else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//D′ò&#209;&#190;-2á3yá&#203;μ&#196;,&#214;±&#189;óD′è&#235;éè&#199;&#248;ê£óà&#199;&#248;&#188;&#228;.                                   
                if(NumByteToWrite==secremain)break;//D′è&#235;&#189;áê&#248;á&#203;
                else//D′è&#235;&#206;′&#189;áê&#248;
                {
                        secpos++;//éè&#199;&#248;μ&#216;&#214;·&#212;&#246;1
                        secoff=0;//&#198;&#171;ò&#198;&#206;&#187;&#214;&#195;&#206;a0          

                           pBuffer+=secremain;  //&#214;&#184;&#213;&#235;&#198;&#171;ò&#198;
                        WriteAddr+=secremain;//D′μ&#216;&#214;·&#198;&#171;ò&#198;          
                           NumByteToWrite-=secremain;                                //×&#214;&#189;úêyμY&#188;&#245;
                        if(NumByteToWrite>4096)secremain=4096;        //&#207;&#194;ò&#187;&#184;&#246;éè&#199;&#248;&#187;1ê&#199;D′2&#187;íê
                        else secremain=NumByteToWrite;                        //&#207;&#194;ò&#187;&#184;&#246;éè&#199;&#248;&#191;éò&#212;D′íêá&#203;
                }         
        };                  
}
//2á3y&#213;&#251;&#184;&#246;D&#190;&#198;&#172;
//&#213;&#251;&#198;&#172;2á3yê±&#188;&#228;:
//W25X16:25s
//W25X32:40s
//W25X64:40s
//μè′yê±&#188;&#228;3&#172;3¤...
void SPI_Flash_Erase_Chip(void)   
{                                             
    SPI_FLASH_Write_Enable();                  //SET WEL
    SPI_Flash_Wait_Busy();   
          SPI_FLASH_CS=0;                            //ê1&#196;ü&#198;÷&#188;t   
    SPI2_ReadWriteByte(W25X_ChipErase);        //·¢&#203;í&#198;&#172;2á3y&#195;üá&#238;  
        SPI_FLASH_CS=1;                            //è&#161;&#207;&#251;&#198;&#172;&#209;&#161;                  
        SPI_Flash_Wait_Busy();                                      //μè′yD&#190;&#198;&#172;2á3y&#189;áê&#248;
}   
//2á3yò&#187;&#184;&#246;éè&#199;&#248;
//Dst_Addr:éè&#199;&#248;μ&#216;&#214;· 0~511 for w25x16
//2á3yò&#187;&#184;&#246;é&#189;&#199;&#248;μ&#196;×&#238;éùê±&#188;&#228;:150ms
void SPI_Flash_Erase_Sector(u32 Dst_Addr)   
{   
        Dst_Addr*=4096;
    SPI_FLASH_Write_Enable();                  //SET WEL          
    SPI_Flash_Wait_Busy();   
          SPI_FLASH_CS=0;                            //ê1&#196;ü&#198;÷&#188;t   
    SPI2_ReadWriteByte(W25X_SectorErase);      //·¢&#203;íéè&#199;&#248;2á3y&#214;&#184;á&#238;
    SPI2_ReadWriteByte((u8)((Dst_Addr)>>16));  //·¢&#203;í24bitμ&#216;&#214;·   
    SPI2_ReadWriteByte((u8)((Dst_Addr)>>8));   
    SPI2_ReadWriteByte((u8)Dst_Addr);  
        SPI_FLASH_CS=1;                            //è&#161;&#207;&#251;&#198;&#172;&#209;&#161;                  
    SPI_Flash_Wait_Busy();                                      //μè′y2á3yíê3é
}  
//μè′y&#191;&#213;&#207;D
void SPI_Flash_Wait_Busy(void)   
{   
        while ((SPI_Flash_ReadSR()&0x01)==0x01);   // μè′yBUSY&#206;&#187;&#199;&#229;&#191;&#213;
}  
//&#189;&#248;è&#235;μ&#244;μ&#231;&#196;£ê&#189;
void SPI_Flash_PowerDown(void)   
{
          SPI_FLASH_CS=0;                            //ê1&#196;ü&#198;÷&#188;t   
    SPI2_ReadWriteByte(W25X_PowerDown);        //·¢&#203;íμ&#244;μ&#231;&#195;üá&#238;  
        SPI_FLASH_CS=1;                            //è&#161;&#207;&#251;&#198;&#172;&#209;&#161;                  
    delay_us(3);                               //μè′yTPD  
}   
//&#187;&#189;D&#209;
void SPI_Flash_WAKEUP(void)   
{  
          SPI_FLASH_CS=0;                            //ê1&#196;ü&#198;÷&#188;t   
    SPI2_ReadWriteByte(W25X_ReleasePowerDown);   //  send W25X_PowerDown command 0xAB   
        SPI_FLASH_CS=1;                            //è&#161;&#207;&#251;&#198;&#172;&#209;&#161;                  
    delay_us(3);                               //μè′yTRES1
}   

























一周热门 更多>