597 lines
16 KiB
C
Raw Permalink Normal View History

2021-07-28 13:15:22 +08:00
#include "w25qxx.h"
#include "qspi.h"
#include "delay.h"
#include "usart.h"
//////////////////////////////////////////////////////////////////////////////////
/************************************************************/
//W25QXX QPIģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
//////////////////////////////////////////////////////////////////////////////////
u16 W25QXX_TYPE=W25Q64; //Ĭ<><C4AC><EFBFBD><EFBFBD>W25Q64
u8 W25QXX_QPI_MODE=0; //QSPIģʽ<C4A3><CABD>־:0,SPIģʽ;1,QSPIģʽ.
//4KbytesΪһ<CEAA><D2BB>Sector
//16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<CEAA><31>Block
//W25Q64
//<2F><><EFBFBD><EFBFBD>Ϊ8M<38>ֽ<EFBFBD>
/************************************************************/
//<2F><>ʼ<EFBFBD><CABC>SPI FLASH<53><48>IO<49><4F>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Init(void)
{
u8 temp;
QSPI_Init(); //<2F><>ʼ<EFBFBD><CABC>QSPI
W25QXX_Qspi_Enable(); //ʹ<><CAB9>QSPIģʽ
W25QXX_TYPE=W25QXX_ReadID(); //<2F><>ȡFLASH ID.
//printf("ID:%x\r\n",W25QXX_TYPE);
if(W25QXX_TYPE==W25Q64) //SPI FLASHΪW25Q64
{
//// <20>˴<EFBFBD>ע<EFBFBD>͵<EFBFBD><CDB5><EFBFBD>ֻ<EFBFBD>е<EFBFBD><D0B5><EFBFBD>W25Q256<35><36>ʱ<EFBFBD>򣬴˴<F2A3ACB4><CBB4><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
//// temp=W25QXX_ReadSR(3); //<2F><>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>3<EFBFBD><33><EFBFBD>жϵ<D0B6>ַģʽ
////
//// if((temp&0X01)==0) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڵ<D6BD>ַģʽ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڵ<D6BD>ַģʽ
//// {
//// W25QXX_Write_Enable(); //дʹ<D0B4><CAB9>
////
//// QSPI_Send_CMD(W25X_Enable4ByteAddr,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE);//QSPI,ʹ<><CAB9>4<EFBFBD>ֽڵ<D6BD>ַָ<D6B7><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,0<><30><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
//// }
W25QXX_Write_Enable(); //дʹ<D0B4><CAB9>
QSPI_Send_CMD(W25X_SetReadParam,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_4_LINES); //QPI,<2C><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,<2C><>ַΪ0,4<>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,1<><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
temp=3<<4; //<2F><><EFBFBD><EFBFBD>P4&P5=11,8<><38>dummy clocks,104M
QSPI_Transmit(&temp,1); //<2F><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD>
}
}
/************************************************************/
//W25QXX<58><58><EFBFBD><EFBFBD>QSPIģʽ
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Qspi_Enable(void)
{
u8 stareg2;
stareg2=W25QXX_ReadSR(2); //<2F>ȶ<EFBFBD><C8B6><EFBFBD>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>2<EFBFBD><32>ԭʼֵ
if((stareg2&0X02)==0) //QEλδʹ<CEB4><CAB9>
{
W25QXX_Write_Enable(); //дʹ<D0B4><CAB9>
stareg2|=1<<1; //ʹ<><CAB9>QEλ
W25QXX_Write_SR(2,stareg2); //д״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>2
}
QSPI_Send_CMD(W25X_EnterQPIMode,0,0,QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE);//дcommandָ<64><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_<D6B7><5F><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,0<><30><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_QPI_MODE=1; //<2F><><EFBFBD><EFBFBD>QSPIģʽ
}
/************************************************************/
//W25QXX<58>˳<EFBFBD>QSPIģʽ
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Qspi_Disable(void)
{
QSPI_Send_CMD(W25X_ExitQPIMode,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE);//дcommandָ<64><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,0<><30><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_QPI_MODE=0; //<2F><><EFBFBD><EFBFBD>SPIģʽ
}
/************************************************************/
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
/************************************************************/
//<2F><>ȡW25QXX<58><58>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>W25QXXһ<58><D2BB><EFBFBD><EFBFBD>3<EFBFBD><33>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
//״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>1<EFBFBD><31>
//BIT7 6 5 4 3 2 1 0
//SPR RV TB BP2 BP1 BP0 WEL BUSY
//SPR:Ĭ<><C4AC>0,״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ,<2C><><EFBFBD><EFBFBD>WPʹ<50><CAB9>
//TB,BP2,BP1,BP0:FLASH<53><48><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//WEL:дʹ<D0B4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//BUSY:æ<><C3A6><EFBFBD><EFBFBD>λ(1,æ;0,<2C><><EFBFBD><EFBFBD>)
//Ĭ<><C4AC>:0x00
//״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>2<EFBFBD><32>
//BIT7 6 5 4 3 2 1 0
//SUS CMP LB3 LB2 LB1 (R) QE SRP1
//״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>3<EFBFBD><33>
//BIT7 6 5 4 3 2 1 0
//HOLD/RST DRV1 DRV0 (R) (R) WPS ADP ADS
//regno:״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>:1~3
//<2F><><EFBFBD><EFBFBD>ֵ:״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>ֵ
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
u8 W25QXX_ReadSR(u8 regno)
{
u8 byte=0,command=0;
switch(regno)
{
case 1:
command=W25X_ReadStatusReg1; //<2F><>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><31><D6B8>
break;
case 2:
command=W25X_ReadStatusReg2; //<2F><>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><32><D6B8>
break;
case 3:
command=W25X_ReadStatusReg3; //<2F><>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><33><D6B8>
break;
default:
command=W25X_ReadStatusReg1;
break;
}
if(W25QXX_QPI_MODE)
QSPI_Send_CMD(command,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_4_LINES); //QPI,дcommandָ<64><D6B8>,<2C><>ַΪ0,4<>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,1<><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
else
QSPI_Send_CMD(command,0,0,QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_1_LINE); //SPI,дcommandָ<64><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_<D6B7><5F><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,1<><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
QSPI_Receive(&byte,1);
return byte;
}
/************************************************************/
//дW25QXX״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Write_SR(u8 regno,u8 sr)
{
u8 command=0;
switch(regno)
{
case 1:
command=W25X_WriteStatusReg1; //д״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><31><D6B8>
break;
case 2:
command=W25X_WriteStatusReg2; //д״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><32><D6B8>
break;
case 3:
command=W25X_WriteStatusReg3; //д״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><33><D6B8>
break;
default:
command=W25X_WriteStatusReg1;
break;
}
if(W25QXX_QPI_MODE)
QSPI_Send_CMD(command,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_4_LINES); //QPI,дcommandָ<64><D6B8>,<2C><>ַΪ0,4<>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,1<><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
else
QSPI_Send_CMD(command,0,0, QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_1_LINE); //SPI,дcommandָ<64><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_<D6B7><5F><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,1<><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
QSPI_Transmit(&sr,1);
}
/************************************************************/
//W25QXXдʹ<D0B4><CAB9>
//<2F><>S1<53>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>WEL<45><4C>λ
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Write_Enable(void)
{
if(W25QXX_QPI_MODE)
QSPI_Send_CMD(W25X_WriteEnable,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE); //QPI,дʹ<D0B4><CAB9>ָ<EFBFBD><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,0<><30><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
else
QSPI_Send_CMD(W25X_WriteEnable,0,0,QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE); //SPI,дʹ<D0B4><CAB9>ָ<EFBFBD><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_<D6B7><5F><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,0<><30><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
}
/************************************************************/
//W25QXXд<58><D0B4>ֹ
//<2F><>WEL<45><4C><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Write_Disable(void)
{
if(W25QXX_QPI_MODE)
QSPI_Send_CMD(W25X_WriteDisable,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE); //QPI,д<><D0B4>ָֹ<D6B9><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,0<><30><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
else
QSPI_Send_CMD(W25X_WriteDisable,0,0,QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE); //SPI,д<><D0B4>ָֹ<D6B9><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_<D6B7><5F><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,0<><30><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
}
/************************************************************/
//<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>:
//0XEF13,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q80
//0XEF14,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q16
//0XEF15,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q32
//0XEF16,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q64
//0XEF17,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q128
//0XEF18,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q256
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
u16 W25QXX_ReadID(void)
{
u8 temp[2];
u16 deviceid;
if(W25QXX_QPI_MODE)
QSPI_Send_CMD(W25X_ManufactDeviceID,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_4_LINES,QSPI_ADDRESS_24_BITS,QSPI_DATA_4_LINES);//QPI,<2C><>id,<2C><>ַΪ0,4<>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_24λ<34><CEBB>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,2<><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
else
QSPI_Send_CMD(W25X_ManufactDeviceID,0,0,QSPI_INSTRUCTION_1_LINE,QSPI_ADDRESS_1_LINE,QSPI_ADDRESS_24_BITS,QSPI_DATA_1_LINE); //SPI,<2C><>id,<2C><>ַΪ0,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_24λ<34><CEBB>ַ_<D6B7><5F><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ַ_<D6B7><5F><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,2<><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
QSPI_Receive(temp,2);
deviceid=(temp[0]<<8)|temp[1];
return deviceid;
}
/************************************************************/
//<2F><>ȡSPI FLASH,<2C><>֧<EFBFBD><D6A7>QPIģʽ
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼ<EFBFBD><CABC>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
//pBuffer:<3A><><EFBFBD>ݴ洢<DDB4><E6B4A2>
//ReadAddr:<3A><>ʼ<EFBFBD><CABC>ȡ<EFBFBD>ĵ<EFBFBD>ַ(<28><><EFBFBD><EFBFBD>32bit)
//NumByteToRead:Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)
{
QSPI_Send_CMD(W25X_FastReadData,ReadAddr,8,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_4_LINES,QSPI_ADDRESS_24_BITS,QSPI_DATA_4_LINES); //QPI,<2C><><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD>,<2C><>ַΪReadAddr,4<>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_24λ<34><CEBB>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,8<><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,NumByteToRead<61><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QSPI_Receive(pBuffer,NumByteToRead);
}
/************************************************************/
//SPI<50><49>һҳ(0~65535)<29><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35><36><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼд<CABC><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
//pBuffer:<3A><><EFBFBD>ݴ洢<DDB4><E6B4A2>
//WriteAddr:<3A><>ʼд<CABC><D0B4><EFBFBD>ĵ<EFBFBD>ַ(<28><><EFBFBD><EFBFBD>32bit)
//NumByteToWrite:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>256),<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><D2B3>ʣ<EFBFBD><CAA3><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>!!!
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
W25QXX_Write_Enable(); //дʹ<D0B4><CAB9>
QSPI_Send_CMD(W25X_PageProgram,WriteAddr,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_4_LINES,QSPI_ADDRESS_24_BITS,QSPI_DATA_4_LINES); //QPI,ҳдָ<D0B4><D6B8>,<2C><>ַΪWriteAddr,4<>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_24λ<34><CEBB>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,NumByteToWrite<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
QSPI_Transmit(pBuffer,NumByteToWrite);
W25QXX_Wait_Busy(); //<2F>ȴ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/************************************************************/
//<2F>޼<EFBFBD><DEBC><EFBFBD>дSPI FLASH
//<2F><><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>д<EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7>Χ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>Ϊ0XFF,<2C><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>0XFF<46><46>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD>ʧ<EFBFBD><CAA7>!
//<2F><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD>
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼд<CABC><D0B4>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ҫȷ<D2AA><C8B7><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>Խ<EFBFBD><D4BD>!
//pBuffer:<3A><><EFBFBD>ݴ洢<DDB4><E6B4A2>
//WriteAddr:<3A><>ʼд<CABC><D0B4><EFBFBD>ĵ<EFBFBD>ַ(<28><><EFBFBD><EFBFBD>32bit)
//NumByteToWrite:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
//CHECK OK
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u16 pageremain;
pageremain=256-WriteAddr%256; //<2F><>ҳʣ<D2B3><CAA3><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35><36><EFBFBD>ֽ<EFBFBD>
while(1)
{
W25QXX_Write_Page(pBuffer,WriteAddr,pageremain);
if(NumByteToWrite==pageremain)break;//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else //NumByteToWrite>pageremain
{
pBuffer+=pageremain;
WriteAddr+=pageremain;
NumByteToWrite-=pageremain; //<2F><>ȥ<EFBFBD>Ѿ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>˵<EFBFBD><CBB5>ֽ<EFBFBD><D6BD><EFBFBD>
if(NumByteToWrite>256)pageremain=256; //һ<>ο<EFBFBD><CEBF><EFBFBD>д<EFBFBD><D0B4>256<35><36><EFBFBD>ֽ<EFBFBD>
else pageremain=NumByteToWrite; //<2F><><EFBFBD><EFBFBD>256<35><36><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
}
}
}
/************************************************************/
//дSPI FLASH
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼд<CABC><D0B4>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
//<2F>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
//pBuffer:<3A><><EFBFBD>ݴ洢<DDB4><E6B4A2>
//WriteAddr:<3A><>ʼд<CABC><D0B4><EFBFBD>ĵ<EFBFBD>ַ(<28><><EFBFBD><EFBFBD>32bit)
//NumByteToWrite:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
u8 W25QXX_BUFFER[4096];
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u8 * W25QXX_BUF;
W25QXX_BUF=W25QXX_BUFFER;
secpos=WriteAddr/4096;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
secoff=WriteAddr%4096;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ƫ<EFBFBD><C6AB>
secremain=4096-secoff;//<2F><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>С
//printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4096<39><36><EFBFBD>ֽ<EFBFBD>
while(1)
{
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<secremain;i++)//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(W25QXX_BUF[secoff+i]!=0XFF)break;//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
}
if(i<secremain)//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
{
W25QXX_Erase_Sector(secpos);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<secremain;i++) //<2F><><EFBFBD><EFBFBD>
{
W25QXX_BUF[i+secoff]=pBuffer[i];
}
W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//д<>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><><D6B1>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if(NumByteToWrite==secremain)break;//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else//д<><D0B4>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
{
secpos++;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>1
secoff=0;//ƫ<><C6AB>λ<EFBFBD><CEBB>Ϊ0
pBuffer+=secremain; //ָ<><D6B8>ƫ<EFBFBD><C6AB>
WriteAddr+=secremain;//д<><D0B4>ַƫ<D6B7><C6AB>
NumByteToWrite-=secremain; //<2F>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݼ<EFBFBD>
if(NumByteToWrite>4096)secremain=4096; //<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
else secremain=NumByteToWrite; //<2F><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
}
};
}
/************************************************************/
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬ
//<2F>ȴ<EFBFBD>ʱ<EFBFBD><EFBFBD><E4B3AC>...
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Erase_Chip(void)
{
W25QXX_Write_Enable(); //SET WEL
W25QXX_Wait_Busy();
QSPI_Send_CMD(W25X_ChipErase,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE);//QPI,дȫƬ<C8AB><C6AC><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_8λ<38><CEBB>ַ_<D6B7>޵<EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,0<><30><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_Wait_Busy(); //<2F>ȴ<EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/************************************************************/
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Dst_Addr:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>:150ms
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Erase_Sector(u32 Dst_Addr)
{
//printf("fe:%x\r\n",Dst_Addr); //<2F><><EFBFBD><EFBFBD>falsh<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Dst_Addr*=4096;
W25QXX_Write_Enable(); //SET WEL
W25QXX_Wait_Busy();
QSPI_Send_CMD(W25X_SectorErase,Dst_Addr,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_4_LINES,QSPI_ADDRESS_24_BITS,QSPI_DATA_NONE);//QPI,д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,<2C><>ַΪ0,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_24λ<34><CEBB>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ַ_4<5F>ߴ<EFBFBD><DFB4><EFBFBD>ָ<EFBFBD><D6B8>,<2C>޿<EFBFBD><DEBF><EFBFBD><EFBFBD><EFBFBD>,0<><30><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/************************************************************/
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/
void W25QXX_Wait_Busy(void)
{
while((W25QXX_ReadSR(1)&0x01)==0x01); // <20>ȴ<EFBFBD>BUSYλ<59><CEBB><EFBFBD><EFBFBD>
}
/************************************************************/
//STM32H7<48><37><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>-HAL<41><EFBFBD><E2BAAF><EFBFBD>
//DevEBox <20><>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>mcudev.taobao.com
//<2F>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>̣<EFBFBD>shop389957290.taobao.com
/************************************************************/