This commit is contained in:
Qiea
2024-12-19 14:06:05 +08:00
parent 1c0f3b676f
commit dcd484c1bd
58 changed files with 14859 additions and 863 deletions

View File

@@ -1,242 +1,325 @@
//-----------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// W25QXX<58><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><> <20><>: <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD>
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>: 2018-08-04
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 2018-08-04
// <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>:
// <20><>ǰ<EFBFBD>汾: V1.0
// <20><>ʷ<EFBFBD>汾:
// - V1.0: (2018-08-04)W25QXX<58><58>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD>: <20><><EFBFBD><EFBFBD>STM32F429+CycloneIV<49><56><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD>塢LZE_ST_LINK2
// ˵ <20><>:
//
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// ͷ<>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
//-----------------------------------------------------------------
#include "w25qxx.h"
#include "spi.h"
#include "delay.h"
#include "usart.h"
#include "stm32f4xx_hal_gpio.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
//ALIENTEK STM32F429<32><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//W25QXX<58><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2016/1/16
//<2F><EFBFBD><E6B1BE>V1.0
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾ 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------
u16 W25QXX_TYPE=W25Q256; //Ĭ<><C4AC><EFBFBD><EFBFBD>W25Q256
//4KbytesΪһ<EFBFBD><EFBFBD>Sector
//16<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<EFBFBD><EFBFBD>Block
//W25Q256
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ32M<EFBFBD>ֽ<EFBFBD>,<2C><><EFBFBD><EFBFBD>512<31><32>Block,8192<39><32>Sector
//<2F><>ʼ<EFBFBD><EFBFBD>SPI FLASH<53><48>IO<EFBFBD><EFBFBD>
u16 W25QXX_TYPE=W25Q128; // Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Q128
//-----------------------------------------------------------------
// void W25QXX_Init(void)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ʼ<EFBFBD><CABC>SPI FLASH<53><48>IO<49><4F>
// <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
void W25QXX_Init(void)
{
u8 temp;
GPIO_InitTypeDef GPIO_Initure;
u8 temp;
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOG_CLK_ENABLE(); // ʹ<><CAB9>GPIOGʱ<47><CAB1>
GPIO_Initure.Pin=GPIO_PIN_3; // PG3 -> FLASH_CS
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_Initure.Pull=GPIO_PULLUP; // <20><><EFBFBD><EFBFBD>
GPIO_Initure.Speed=GPIO_SPEED_FAST; // <20><><EFBFBD><EFBFBD>
HAL_GPIO_Init(GPIOG,&GPIO_Initure); // <20><>ʼ<EFBFBD><CABC>
__HAL_RCC_GPIOF_CLK_ENABLE(); //ʹ<><CAB9>GPIOFʱ<46><CAB1>
//PF6
GPIO_Initure.Pin=GPIO_PIN_6; //PF6
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPIO_Initure.Pull=GPIO_PULLUP; //<2F><><EFBFBD><EFBFBD>
GPIO_Initure.Speed=GPIO_SPEED_FAST; //<2F><><EFBFBD><EFBFBD>
HAL_GPIO_Init(GPIOF,&GPIO_Initure); //<2F><>ʼ<EFBFBD><CABC>
W25QXX_CS=1; //SPI FLASH<53><48>ѡ<EFBFBD><D1A1>
SPI5_Init(); //<2F><>ʼ<EFBFBD><CABC>SPI
SPI5_SetSpeed(SPI_BAUDRATEPRESCALER_2); //<2F><><EFBFBD><EFBFBD>Ϊ45Mʱ<4D><CAB1>,<2C><><EFBFBD><EFBFBD>ģʽ
W25QXX_TYPE=W25QXX_ReadID(); //<2F><>ȡFLASH ID.
if(W25QXX_TYPE==W25Q256) //SPI FLASHΪW25Q256
{
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_CS=1; // ȡ<><C8A1>Ƭѡ
SPI_Init(); // <20><>ʼ<EFBFBD><CABC>SPI
W25QXX_TYPE=W25QXX_ReadID(); // <20><>ȡFLASH ID.
if(W25QXX_TYPE==W25Q256) // <20><>SPI FLASHΪW25Q256
{
temp=W25QXX_ReadSR(3); // <20><>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>3<EFBFBD><33><EFBFBD>жϵ<D0B6>ַģʽ
if((temp&0X01)==0) // <20><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڵ<EFBFBD>ַģʽ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڵ<D6BD>ַģʽ
{
W25QXX_CS=0; //ѡ<><D1A1>
SPI5_ReadWriteByte(W25X_Enable4ByteAddr);//<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>4<EFBFBD>ֽڵ<D6BD>ַģʽָ<CABD><D6B8>
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
W25QXX_CS=0; // ѡ<EFBFBD><EFBFBD>
SPI1_ReadWriteByte(W25X_Enable4ByteAddr);// <EFBFBD><EFBFBD><EFBFBD>ͽ<EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽڵ<EFBFBD>ַģʽָ<EFBFBD><EFBFBD>
W25QXX_CS=1; // ȡ<EFBFBD><EFBFBD>Ƭѡ
}
}
}
}
//<EFBFBD><EFBFBD>ȡW25QXX<EFBFBD><EFBFBD>״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25QXXһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD>״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
//״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>
//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ʹ<EFBFBD><EFBFBD>
//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>)
//Ĭ<EFBFBD><EFBFBD>:0x00
//״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>
//BIT7 6 5 4 3 2 1 0
//SUS CMP LB3 LB2 LB1 (R) QE SRP1
//״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD>
//BIT7 6 5 4 3 2 1 0
//HOLD/RST DRV1 DRV0 (R) (R) WPS ADP ADS
//regno:״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD><EFBFBD>:1~3
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>ֵ
//-----------------------------------------------------------------
// u8 W25QXX_ReadSR(u8 regno)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ȡW25QXX<58><58>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>W25QXXһ<58><D2BB><EFBFBD><EFBFBD>3<EFBFBD><33>״̬<D7B4>Ĵ<EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: u8 regno<6E><6F>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>Χ:1~3
// <20><> <20><> ֵ: u8 byte<74><65>״̬<D7B4>Ĵ<EFBFBD><EFBFBD><EFBFBD>ֵ
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// BUSY:æ<><C3A6><EFBFBD><EFBFBD>λ(1,æ;0,<2C><><EFBFBD><EFBFBD>)
// Ĭ<><C4AC>:0x00
// ״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>
// 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
//
//-----------------------------------------------------------------
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;
}
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(command); //<2F><><EFBFBD>Ͷ<EFBFBD>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
byte=SPI5_ReadWriteByte(0Xff); //<2F><>ȡһ<C8A1><D2BB><EFBFBD>ֽ<EFBFBD>
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
switch(regno)
{
case 1:
command=W25X_ReadStatusReg1; // <EFBFBD><EFBFBD>״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 2:
command=W25X_ReadStatusReg2; // <EFBFBD><EFBFBD>״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 3:
command=W25X_ReadStatusReg3; // <EFBFBD><EFBFBD>״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
default:
command=W25X_ReadStatusReg1;
break;
}
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(command); // <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>ȡ״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
byte=SPI1_ReadWriteByte(0Xff); // <EFBFBD><EFBFBD>ȡһ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
W25QXX_CS=1; // ȡ<EFBFBD><EFBFBD>Ƭѡ
return byte;
}
//дW25QXX״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
//-----------------------------------------------------------------
// void W25QXX_Write_SR(u8 regno,u8 sr)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: дW25QXX״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: u8 regno<6E><6F>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>Χ:1~3
// u8 sr<73><72>д<EFBFBD><D0B4>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
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;
}
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(command); //<2F><><EFBFBD><EFBFBD>дȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(sr); //д<><D0B4>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
u8 command=0;
switch(regno)
{
case 1:
command=W25X_WriteStatusReg1; // д״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 2:
command=W25X_WriteStatusReg2; // д״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
case 3:
command=W25X_WriteStatusReg3; // д״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
default:
command=W25X_WriteStatusReg1;
break;
}
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(command); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>дȡ״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(sr); // д<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
W25QXX_CS=1; // ȡ<EFBFBD><EFBFBD>Ƭѡ
}
//W25QXXдʹ<D0B4><CAB9>
//<2F><>WEL<45><4C>λ
//-----------------------------------------------------------------
// void W25QXX_Write_Enable(void)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: W25QXXдʹ<D0B4><CAB9>
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: <20><>
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
void W25QXX_Write_Enable(void)
{
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(W25X_WriteEnable); //<2F><><EFBFBD><EFBFBD>дʹ<D0B4><CAB9>
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(W25X_WriteEnable); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>дʹ<EFBFBD><EFBFBD>
W25QXX_CS=1; // ȡ<EFBFBD><EFBFBD>Ƭѡ
}
//W25QXXд<58><D0B4>ֹ
//<2F><>WEL<45><4C><EFBFBD><EFBFBD>
//-----------------------------------------------------------------
// void W25QXX_Write_Disable(void)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: WW25QXXд<58><D0B4>ֹ
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: <20><>
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
void W25QXX_Write_Disable(void)
{
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(W25X_WriteDisable); //<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ָֹ<D6B9><D6B8>
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(W25X_WriteDisable); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>ָֹ<EFBFBD><EFBFBD>
W25QXX_CS=1; // ȡ<EFBFBD><EFBFBD>Ƭѡ
}
//<EFBFBD><EFBFBD>ȡоƬID
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
//0XEF13,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q80
//0XEF14,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q16
//0XEF15,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q32
//0XEF16,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q64
//0XEF17,<EFBFBD><EFBFBD>ʾоƬ<EFBFBD>ͺ<EFBFBD>ΪW25Q128
//0XEF18,<2C><>ʾоƬ<D0BE>ͺ<EFBFBD>ΪW25Q256
//-----------------------------------------------------------------
// u16 W25QXX_ReadID(void)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ȡоƬID
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: <20><>
// <20><> <20><> ֵ: u16 Temp<EFBFBD><EFBFBD>оƬ<EFBFBD>ͺ<EFBFBD>
// ע<><D7A2><EFBFBD><EFBFBD><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
//
//-----------------------------------------------------------------
u16 W25QXX_ReadID(void)
{
u16 Temp = 0;
W25QXX_CS=0;
SPI5_ReadWriteByte(0x90);//<2F><><EFBFBD>Ͷ<EFBFBD>ȡID<49><44><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(0x00);
SPI5_ReadWriteByte(0x00);
SPI5_ReadWriteByte(0x00);
Temp|=SPI5_ReadWriteByte(0xFF)<<8;
Temp|=SPI5_ReadWriteByte(0xFF);
SPI1_ReadWriteByte(0x90);// <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>ȡID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(0x00);
SPI1_ReadWriteByte(0x00);
SPI1_ReadWriteByte(0x00);
Temp|=SPI1_ReadWriteByte(0xFF)<<8;
Temp|=SPI1_ReadWriteByte(0xFF);
W25QXX_CS=1;
return Temp;
}
//<2F><>ȡSPI FLASH
//<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>ַ(24bit)
//NumByteToRead:Ҫ<><D2AA>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
//-----------------------------------------------------------------
// void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>ȡSPI FLASH<53><48><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼ<EFBFBD><CABC>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: u8* pBuffer<65><72><EFBFBD><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2>
// u32 ReadAddr:<3A><>ʼ<EFBFBD><CABC>ȡ<EFBFBD>ĵ<EFBFBD>ַ(24bit)
// u16 NumByteToRead:<3A><><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)
{
u16 i;
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(W25X_ReadData); //<2F><><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
if(W25QXX_TYPE==W25Q256) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Q256<35>Ļ<EFBFBD><C4BB><EFBFBD>ַΪ4<CEAA>ֽڵģ<DAB5>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
SPI5_ReadWriteByte((u8)((ReadAddr)>>24));
}
SPI5_ReadWriteByte((u8)((ReadAddr)>>16)); //<2F><><EFBFBD><EFBFBD>24bit<69><74>ַ
SPI5_ReadWriteByte((u8)((ReadAddr)>>8));
SPI5_ReadWriteByte((u8)ReadAddr);
for(i=0;i<NumByteToRead;i++)
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(W25X_ReadData); // <EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(W25QXX_TYPE==W25Q256) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Q256<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>ַΪ4<EFBFBD>ֽڵģ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
SPI1_ReadWriteByte((u8)((ReadAddr)>>24));
}
SPI1_ReadWriteByte((u8)((ReadAddr)>>16)); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>24bit<EFBFBD><EFBFBD>ַ
SPI1_ReadWriteByte((u8)((ReadAddr)>>8));
SPI1_ReadWriteByte((u8)ReadAddr);
for(i=0;i<NumByteToRead;i++)
{
pBuffer[i]=SPI5_ReadWriteByte(0XFF); //ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
pBuffer[i]=SPI1_ReadWriteByte(0XFF); // ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
W25QXX_CS=1;
}
//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>ַ(24bit)
//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>!!!
//-----------------------------------------------------------------
// void W25QXX_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: PI<50><49>һҳ(0~65535)<29><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35><36><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʼд<CABC><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>256<35>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: u8* pBuffer<65><72><EFBFBD><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2>
// u32 WriteAddr<64><72><EFBFBD><EFBFBD>ʼд<CABC><D0B4><EFBFBD>ĵ<EFBFBD>ַ(24bit)
// u16 NumByteToWrite<74><65>Ҫд<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>!!!
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
void W25QXX_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u16 i;
W25QXX_Write_Enable(); //SET WEL
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(W25X_PageProgram); //<2F><><EFBFBD><EFBFBD>дҳ<D0B4><D2B3><EFBFBD><EFBFBD>
if(W25QXX_TYPE==W25Q256) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Q256<35>Ļ<EFBFBD><C4BB><EFBFBD>ַΪ4<CEAA>ֽڵģ<DAB5>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
SPI5_ReadWriteByte((u8)((WriteAddr)>>24));
}
SPI5_ReadWriteByte((u8)((WriteAddr)>>16)); //<2F><><EFBFBD><EFBFBD>24bit<69><74>ַ
SPI5_ReadWriteByte((u8)((WriteAddr)>>8));
SPI5_ReadWriteByte((u8)WriteAddr);
for(i=0;i<NumByteToWrite;i++)SPI5_ReadWriteByte(pBuffer[i]);//ѭ<><D1AD>д<EFBFBD><D0B4>
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
W25QXX_Wait_Busy(); //<2F>ȴ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_Write_Enable(); // SET WEL
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(W25X_PageProgram); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>дҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(W25QXX_TYPE==W25Q256) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Q256<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>ַΪ4<EFBFBD>ֽڵģ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
SPI1_ReadWriteByte((u8)((WriteAddr)>>24));
}
SPI1_ReadWriteByte((u8)((WriteAddr)>>16)); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>24bit<EFBFBD><EFBFBD>ַ
SPI1_ReadWriteByte((u8)((WriteAddr)>>8));
SPI1_ReadWriteByte((u8)WriteAddr);
for(i=0;i<NumByteToWrite;i++)
SPI1_ReadWriteByte(pBuffer[i]); // ѭ<><D1AD>д<EFBFBD><D0B4>
W25QXX_CS=1; // ȡ<><C8A1>Ƭѡ
W25QXX_Wait_Busy(); // <20>ȴ<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>!
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>ʼд<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><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>ַ(24bit)
//NumByteToWrite:Ҫд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD>65535)
//CHECK OK
//-----------------------------------------------------------------
// void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20>޼<EFBFBD><DEBC><EFBFBD>дSPI FLASH
// <20><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD>: u8* pBuffer<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ洢<EFBFBD><EFBFBD>
// u32 WriteAddr<64><72><EFBFBD><EFBFBD>ʼд<CABC><D0B4><EFBFBD>ĵ<EFBFBD>ַ(24bit)
// u16 NumByteToWrite<74><65>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><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>!
// <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD>!
// <20><>ָ<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>!
//
//-----------------------------------------------------------------
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>
pageremain=256-WriteAddr%256; // <EFBFBD><EFBFBD>ҳʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
if(NumByteToWrite<=pageremain)
pageremain=NumByteToWrite; // <20><><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
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<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
NumByteToWrite-=pageremain; // <EFBFBD><EFBFBD>ȥ<EFBFBD>Ѿ<EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD>
if(NumByteToWrite>256)
pageremain=256; // һ<>ο<EFBFBD><CEBF><EFBFBD>д<EFBFBD><EFBFBD>256<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
else
pageremain=NumByteToWrite; // <20><><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>ַ(24bit)
//NumByteToWrite:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
u8 W25QXX_BUFFER[4096];
u8 W25QXX_BUFFER[4096];
//-----------------------------------------------------------------
// void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: дSPI FLASH
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: u8* pBuffer<65><72><EFBFBD><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2>
// u32 WriteAddr<64><72><EFBFBD><EFBFBD>ʼд<CABC><D0B4><EFBFBD>ĵ<EFBFBD>ַ(24bit)
// u16 NumByteToWrite<74><65>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
//
//-----------------------------------------------------------------
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
@@ -244,94 +327,149 @@ void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
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>
W25QXX_BUF=W25QXX_BUFFER;
secpos=WriteAddr/4096; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
secoff=WriteAddr%4096; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ƫ<EFBFBD><EFBFBD>
secremain=4096-secoff; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><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>
W25QXX_Read(W25QXX_BUF,secpos*4096,4096); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<secremain;i++) // У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(W25QXX_BUF[secoff+i]!=0XFF)break;//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
if(W25QXX_BUF[secoff+i]!=0XFF)
break;// <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
}
if(i<secremain)//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
if(i<secremain)// <EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><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_Erase_Sector(secpos); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<secremain;i++) // <EFBFBD><EFBFBD><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>
W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);// д<EFBFBD><EFBFBD><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//д<><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);// д<EFBFBD>Ѿ<EFBFBD><EFBFBD><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
secpos++;// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>1
secoff=0;// ƫ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>Ϊ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>
pBuffer+=secremain; // ָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
WriteAddr+=secremain; // д<EFBFBD><EFBFBD>ַƫ<EFBFBD><EFBFBD>
NumByteToWrite-=secremain; // <EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>
if(NumByteToWrite>4096)
secremain=4096; // <EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
secremain=NumByteToWrite; // <20><>һ<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>...
//-----------------------------------------------------------------
// void W25QXX_Erase_Chip(void)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬ
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: <20><>
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
void W25QXX_Erase_Chip(void)
{
W25QXX_Write_Enable(); //SET WEL
W25QXX_Wait_Busy();
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(W25X_ChipErase); //<2F><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
W25QXX_Wait_Busy(); //<2F>ȴ<EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_Write_Enable(); // SET WEL
W25QXX_Wait_Busy();
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(W25X_ChipErase); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_CS=1; // ȡ<EFBFBD><EFBFBD>Ƭѡ
W25QXX_Wait_Busy(); // <EFBFBD>ȴ<EFBFBD>оƬ<EFBFBD><EFBFBD><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>
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>:150ms
//-----------------------------------------------------------------
// void W25QXX_Erase_Sector(u32 Dst_Addr)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: u32 Dst_Addr<64><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>:150ms
//
//-----------------------------------------------------------------
void W25QXX_Erase_Sector(u32 Dst_Addr)
{
//<2F><><EFBFBD><EFBFBD>falsh<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//printf("fe:%x\r\n",Dst_Addr);
{
Dst_Addr*=4096;
W25QXX_Write_Enable(); //SET WEL
W25QXX_Wait_Busy();
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(W25X_SectorErase); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
if(W25QXX_TYPE==W25Q256) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Q256<35>Ļ<EFBFBD><C4BB><EFBFBD>ַΪ4<CEAA>ֽڵģ<DAB5>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
SPI5_ReadWriteByte((u8)((Dst_Addr)>>24));
}
SPI5_ReadWriteByte((u8)((Dst_Addr)>>16)); //<2F><><EFBFBD><EFBFBD>24bit<69><74>ַ
SPI5_ReadWriteByte((u8)((Dst_Addr)>>8));
SPI5_ReadWriteByte((u8)Dst_Addr);
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
W25QXX_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_Write_Enable(); // SET WEL
W25QXX_Wait_Busy();
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(W25X_SectorErase); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
if(W25QXX_TYPE==W25Q256) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Q256<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD>ַΪ4<EFBFBD>ֽڵģ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
SPI1_ReadWriteByte((u8)((Dst_Addr)>>24));
}
SPI1_ReadWriteByte((u8)((Dst_Addr)>>16)); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>24bit<EFBFBD><EFBFBD>ַ
SPI1_ReadWriteByte((u8)((Dst_Addr)>>8));
SPI1_ReadWriteByte((u8)Dst_Addr);
W25QXX_CS=1; // ȡ<EFBFBD><EFBFBD>Ƭѡ
W25QXX_Wait_Busy(); // <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
//-----------------------------------------------------------------
// void W25QXX_Wait_Busy(void)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: <20><>
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
void W25QXX_Wait_Busy(void)
{
while((W25QXX_ReadSR(1)&0x01)==0x01); // <20>ȴ<EFBFBD>BUSYλ<59><CEBB><EFBFBD><EFBFBD>
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
//-----------------------------------------------------------------
// void W25QXX_PowerDown(void)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: <20><>
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
void W25QXX_PowerDown(void)
{
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(W25X_PowerDown); //<2F><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
delay_us(3); //<2F>ȴ<EFBFBD>TPD
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(W25X_PowerDown); // <EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
W25QXX_CS=1; // ȡ<EFBFBD><EFBFBD>Ƭѡ
delay_us(3); // <EFBFBD>ȴ<EFBFBD>TPD
}
//<2F><><EFBFBD><EFBFBD>
//-----------------------------------------------------------------
// void W25QXX_WAKEUP(void)
//-----------------------------------------------------------------
//
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>: <20><>
// <20><> <20><> ֵ: <20><>
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><>
//
//-----------------------------------------------------------------
void W25QXX_WAKEUP(void)
{
W25QXX_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI5_ReadWriteByte(W25X_ReleasePowerDown); // send W25X_PowerDown command 0xAB
W25QXX_CS=1; //ȡ<><C8A1>Ƭѡ
delay_us(3); //<2F>ȴ<EFBFBD>TRES1
W25QXX_CS=0; // ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI1_ReadWriteByte(W25X_ReleasePowerDown); // send W25X_PowerDown command 0xAB
W25QXX_CS=1; // ȡ<EFBFBD><EFBFBD>Ƭѡ
delay_us(3); // <EFBFBD>ȴ<EFBFBD>TRES1
}
//-----------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------

View File

@@ -1,26 +1,29 @@
//-----------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// W25QXX<58><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
// <20><> <20><>: <20><><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD>
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>: 2018-08-04
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 2018-08-04
// <20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>:
// <20><>ǰ<EFBFBD>汾: V1.0
// <20><>ʷ<EFBFBD>汾:
// - V1.0: (2018-08-04)W25QXX<58><58>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD>: <20><><EFBFBD><EFBFBD>STM32F429+CycloneIV<49><56><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD>ƿ<EFBFBD><C6BF><EFBFBD><EFBFBD>塢LZE_ST_LINK2
// ˵ <20><>:
//
//-----------------------------------------------------------------
#ifndef __W25QXX_H
#define __W25QXX_H
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>ѧϰʹ<EFBFBD>ã<EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>;
//ALIENTEK STM32F429<32><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//W25QXX<58><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2016/1/16
//<2F><EFBFBD><E6B1BE>V1.0
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾ 2014-2024
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////
#include "stm32f429_winner.h"
//-----------------------------------------------------------------
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-----------------------------------------------------------------
extern u16 W25QXX_TYPE; // <20><><EFBFBD><EFBFBD>W25QXXоƬ<D0BE>ͺ<EFBFBD>
//W25Xϵ<EFBFBD><EFBFBD>/Qϵ<51><CFB5>оƬ<D0BE>б<EFBFBD>
//W25Q80 ID 0XEF13
//W25Q16 ID 0XEF14
//W25Q32 ID 0XEF15
//W25Q64 ID 0XEF16
//W25Q128 ID 0XEF17
//W25Q256 ID 0XEF18
//-----------------------------------------------------------------
// <20><EFBFBD><EAB6A8>
//-----------------------------------------------------------------
// W25<EFBFBD><EFBFBD>/Qϵ<51><CFB5>оƬ<D0BE>б<EFBFBD>
#define W25Q80 0XEF13
#define W25Q16 0XEF14
#define W25Q32 0XEF15
@@ -28,49 +31,50 @@
#define W25Q128 0XEF17
#define W25Q256 0XEF18
extern u16 W25QXX_TYPE; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25QXXоƬ<EFBFBD>ͺ<EFBFBD>
#define W25QXX_CS PGout(3) // W25QXX<EFBFBD><EFBFBD>Ƭѡ<EFBFBD>ź<EFBFBD>
#define W25QXX_CS PFout(6) //W25QXX<58><58>Ƭѡ<C6AC>ź<EFBFBD>
//////////////////////////////////////////////////////////////////////////////////
//ָ<><D6B8><EFBFBD><EFBFBD>
#define W25X_WriteEnable 0x06
#define W25X_WriteDisable 0x04
#define W25X_ReadStatusReg1 0x05
#define W25X_ReadStatusReg2 0x35
#define W25X_ReadStatusReg3 0x15
#define W25X_WriteEnable 0x06
#define W25X_WriteDisable 0x04
#define W25X_ReadStatusReg1 0x05
#define W25X_ReadStatusReg2 0x35
#define W25X_ReadStatusReg3 0x15
#define W25X_WriteStatusReg1 0x01
#define W25X_WriteStatusReg2 0x31
#define W25X_WriteStatusReg3 0x11
#define W25X_ReadData 0x03
#define W25X_FastReadData 0x0B
#define W25X_FastReadDual 0x3B
#define W25X_PageProgram 0x02
#define W25X_BlockErase 0xD8
#define W25X_SectorErase 0x20
#define W25X_ChipErase 0xC7
#define W25X_PowerDown 0xB9
#define W25X_ReleasePowerDown 0xAB
#define W25X_DeviceID 0xAB
#define W25X_ManufactDeviceID 0x90
#define W25X_JedecDeviceID 0x9F
#define W25X_ReadData 0x03
#define W25X_FastReadData 0x0B
#define W25X_FastReadDual 0x3B
#define W25X_PageProgram 0x02
#define W25X_BlockErase 0xD8
#define W25X_SectorErase 0x20
#define W25X_ChipErase 0xC7
#define W25X_PowerDown 0xB9
#define W25X_ReleasePowerDown 0xAB
#define W25X_DeviceID 0xAB
#define W25X_ManufactDeviceID 0x90
#define W25X_JedecDeviceID 0x9F
#define W25X_Enable4ByteAddr 0xB7
#define W25X_Exit4ByteAddr 0xE9
void W25QXX_Init(void);
u16 W25QXX_ReadID(void); //<2F><>ȡFLASH ID
u8 W25QXX_ReadSR(u8 regno); //<2F><>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
void W25QXX_4ByteAddr_Enable(void); //ʹ<EFBFBD><EFBFBD>4<EFBFBD>ֽڵ<EFBFBD>ַģʽ
void W25QXX_Write_SR(u8 regno,u8 sr); //д״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
void W25QXX_Write_Enable(void); //дʹ<EFBFBD><EFBFBD>
void W25QXX_Write_Disable(void); //д<><EFBFBD><EFBFBD><EFBFBD>
void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);
void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead); //<2F><>ȡflash
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);//д<><D0B4>flash
void W25QXX_Erase_Chip(void); //<2F><>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
void W25QXX_Erase_Sector(u32 Dst_Addr); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void W25QXX_Wait_Busy(void); //<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void W25QXX_PowerDown(void); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
void W25QXX_WAKEUP(void); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-----------------------------------------------------------------
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-----------------------------------------------------------------
extern void W25QXX_Init(void);
extern u16 W25QXX_ReadID(void); // <EFBFBD><EFBFBD>ȡFLASH ID
extern u8 W25QXX_ReadSR(u8 regno); // <20><>ȡ״̬<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
extern void W25QXX_4ByteAddr_Enable(void); // ʹ<EFBFBD><EFBFBD>4<EFBFBD>ֽڵ<EFBFBD>ַģʽ
extern void W25QXX_Write_SR(u8 regno,u8 sr); // д״̬<D7B4>Ĵ<EFBFBD><EFBFBD><EFBFBD>
extern void W25QXX_Write_Enable(void); // дʹ<D0B4><CAB9>
extern void W25QXX_Write_Disable(void); // д<><D0B4><EFBFBD><EFBFBD>
extern void W25QXX_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);
extern void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead); // <20><>ȡflash
extern void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite);// д<><D0B4>flash
extern void W25QXX_Erase_Chip(void); // <20><>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern void W25QXX_Erase_Sector(u32 Dst_Addr); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern void W25QXX_Wait_Busy(void); // <20>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
extern void W25QXX_PowerDown(void); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
extern void W25QXX_WAKEUP(void); // <20><><EFBFBD><EFBFBD>
#endif
//-----------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------