2025-06-27 00:32:57 +08:00
|
|
|
|
#include "stm32f4xx.h"
|
|
|
|
|
#include "flash.h"
|
|
|
|
|
#include "mymem.h"
|
|
|
|
|
#include "base.h"
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<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ս<4B><D5BD>STM32<33><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//W25Q64 <20><><EFBFBD><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
|
|
|
|
//<2F><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>:2012/9/9
|
|
|
|
|
//<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>˾ 2009-2019
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//All rights reserved
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
static u16 SPI_FLASH_Type=W25Q64;//Ĭ<>Ͼ<EFBFBD><CFBE><EFBFBD>25Q64
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define W25Q_MOSI PAout(4)
|
|
|
|
|
#define W25Q_CLK PAout(5)
|
|
|
|
|
#define W25Q_MISO PAin(7)
|
|
|
|
|
#define W25Q_CS PCout(3)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void delay_us(u32 us)
|
|
|
|
|
{
|
|
|
|
|
// us=us*5;
|
|
|
|
|
// while (us--);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//4KbytesΪһ<CEAA><D2BB>Sector
|
|
|
|
|
//16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<CEAA><31>Block
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//W25X16
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>Ϊ2M<32>ֽ<EFBFBD>,<2C><><EFBFBD><EFBFBD>32<33><32>Block,512<31><32>Sector
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ʼ<EFBFBD><CABC>SPI FLASH<53><48>IO<49><4F>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_Flash_Init(void)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
GPIO_InitTypeDef GPIO_InitStructure; //<2F><><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
|
|
|
|
RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOA, ENABLE); //<2F><>ʼ<EFBFBD><CABC>GPIOGʱ<47><CAB1>
|
|
|
|
|
RCC_AHB1PeriphClockCmd ( RCC_AHB1Periph_GPIOC, ENABLE); //<2F><>ʼ<EFBFBD><CABC>GPIODʱ<44><CAB1>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //<2F><><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //<2F>ٶ<EFBFBD>ѡ<EFBFBD><D1A1>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ʼ<EFBFBD><CABC> LED1 <20><><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
|
|
|
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
|
|
|
|
|
GPIO_Init(GPIOC, &GPIO_InitStructure);
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //<2F><><EFBFBD><EFBFBD>ģʽ
|
|
|
|
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //<2F><><EFBFBD><EFBFBD>
|
|
|
|
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //<2F>ٶ<EFBFBD>ѡ<EFBFBD><D1A1>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ʼ<EFBFBD><CABC> LED1 <20><><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
|
|
|
|
|
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
SPI_FLASH_Type=SPI_Flash_ReadID();//<2F><>ȡFLASH ID.
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u8 W25Q_ReadWriteByte(u8 da)
|
|
|
|
|
{
|
|
|
|
|
u8 i=0;
|
|
|
|
|
u8 ret=0;
|
|
|
|
|
for (i=0;i<8;i++)
|
|
|
|
|
{
|
|
|
|
|
W25Q_CLK=0;
|
|
|
|
|
delay_us(5);
|
|
|
|
|
if (da&0x80)
|
|
|
|
|
W25Q_MOSI=1;
|
|
|
|
|
else
|
|
|
|
|
W25Q_MOSI=0;
|
|
|
|
|
da<<=1;
|
|
|
|
|
delay_us(5);
|
|
|
|
|
W25Q_CLK=1;
|
|
|
|
|
delay_us(5);
|
|
|
|
|
ret<<=1;
|
|
|
|
|
ret|=W25Q_MISO;
|
|
|
|
|
delay_us(5);
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ȡSPI_FLASH<53><48>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//BIT7 6 5 4 3 2 1 0
|
|
|
|
|
//SPR RV TB BP2 BP1 BP0 WEL BUSY
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//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
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u8 SPI_Flash_ReadSR(void)
|
|
|
|
|
{
|
|
|
|
|
u8 byte=0;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(W25X_ReadStatusReg); //<2F><><EFBFBD>Ͷ<EFBFBD>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
byte=W25Q_ReadWriteByte(0Xff); //<2F><>ȡһ<C8A1><D2BB><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
return byte;
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//дSPI_FLASH״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|
|
|
|
//ֻ<><D6BB>SPR,TB,BP2,BP1,BP0(bit 7,5,4,3,2)<29><><EFBFBD><EFBFBD>д!!!
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_FLASH_Write_SR(u8 sr)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(W25X_WriteStatusReg); //<2F><><EFBFBD><EFBFBD>дȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(sr); //д<><D0B4>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD>
|
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//SPI_FLASHдʹ<D0B4><CAB9>
|
|
|
|
|
//<2F><>WEL<45><4C>λ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_FLASH_Write_Enable(void)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(W25X_WriteEnable); //<2F><><EFBFBD><EFBFBD>дʹ<D0B4><CAB9>
|
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//SPI_FLASHд<48><D0B4>ֹ
|
|
|
|
|
//<2F><>WEL<45><4C><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_FLASH_Write_Disable(void)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(W25X_WriteDisable); //<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ָֹ<D6B9><D6B8>
|
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ȡоƬID W25X16<31><36>ID:0XEF14
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u16 SPI_Flash_ReadID(void)
|
|
|
|
|
{
|
|
|
|
|
u16 Temp = 0;
|
|
|
|
|
W25Q_CS=0;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_ReadWriteByte(0x90);//<2F><><EFBFBD>Ͷ<EFBFBD>ȡID<49><44><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
W25Q_ReadWriteByte(0x00);
|
|
|
|
|
W25Q_ReadWriteByte(0x00);
|
|
|
|
|
W25Q_ReadWriteByte(0x00);
|
|
|
|
|
Temp|=W25Q_ReadWriteByte(0xFF)<<8;
|
|
|
|
|
Temp|=W25Q_ReadWriteByte(0xFF);
|
|
|
|
|
W25Q_CS=1;
|
|
|
|
|
return Temp;
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<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)
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u32 NumByteToRead)
|
|
|
|
|
{
|
|
|
|
|
u16 i;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(W25X_ReadData); //<2F><><EFBFBD>Ͷ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte((u8)((ReadAddr)>>16)); //<2F><><EFBFBD><EFBFBD>24bit<69><74>ַ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
W25Q_ReadWriteByte((u8)((ReadAddr)>>8));
|
|
|
|
|
W25Q_ReadWriteByte((u8)ReadAddr);
|
|
|
|
|
for(i=0;i<NumByteToRead;i++)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
pBuffer[i]=W25Q_ReadWriteByte(0XFF); //ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//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>!!!
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
|
|
|
|
|
{
|
|
|
|
|
u16 i;
|
|
|
|
|
SPI_FLASH_Write_Enable(); //SET WEL
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(W25X_PageProgram); //<2F><><EFBFBD><EFBFBD>дҳ<D0B4><D2B3><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte((u8)((WriteAddr)>>16)); //<2F><><EFBFBD><EFBFBD>24bit<69><74>ַ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
W25Q_ReadWriteByte((u8)((WriteAddr)>>8));
|
|
|
|
|
W25Q_ReadWriteByte((u8)WriteAddr);
|
2025-07-05 19:47:28 +08:00
|
|
|
|
for(i=0;i<NumByteToWrite;i++)W25Q_ReadWriteByte(pBuffer[i]);//ѭ<><D1AD>д<EFBFBD><D0B4>
|
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
|
|
|
|
SPI_Flash_Wait_Busy(); //<2F>ȴ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<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>ַ(24bit)
|
|
|
|
|
//NumByteToWrite:Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>(<28><><EFBFBD><EFBFBD>65535)
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//CHECK OK
|
|
|
|
|
void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u32 NumByteToWrite)
|
|
|
|
|
{
|
|
|
|
|
u16 pageremain;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
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>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
while(1)
|
|
|
|
|
{
|
|
|
|
|
SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain);
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if(NumByteToWrite==pageremain)break;//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
else //NumByteToWrite>pageremain
|
|
|
|
|
{
|
|
|
|
|
pBuffer+=pageremain;
|
|
|
|
|
WriteAddr+=pageremain;
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
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>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//д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)
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//u8 SPI_FLASH_BUF[4096];
|
|
|
|
|
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u32 NumByteToWrite)
|
|
|
|
|
{
|
|
|
|
|
u32 secpos;
|
|
|
|
|
u16 secoff;
|
|
|
|
|
u16 secremain;
|
|
|
|
|
u16 i;
|
|
|
|
|
u8 *SPI_FLASH_BUF=mymalloc(4096);
|
|
|
|
|
if (SPI_FLASH_BUF==0)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
mymemset(SPI_FLASH_BUF,0xaa,4096);
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
secpos=WriteAddr/4096;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ 0~511 for w25x16
|
|
|
|
|
secoff=WriteAddr%4096;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ƫ<EFBFBD><C6AB>
|
|
|
|
|
secremain=4096-secoff;//<2F><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>С
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4096<39><36><EFBFBD>ֽ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
while(1)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
SPI_Flash_Read(SPI_FLASH_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>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if(i<secremain)//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
SPI_Flash_Erase_Sector(secpos);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
for(i=0;i<secremain;i++) //<2F><><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
SPI_FLASH_BUF[i+secoff]=pBuffer[i];
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
}else SPI_Flash_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>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
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>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
myfree(SPI_FLASH_BUF);
|
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬ
|
|
|
|
|
//<2F><>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>:
|
2025-06-27 00:32:57 +08:00
|
|
|
|
//W25X16:25s
|
|
|
|
|
//W25X32:40s
|
|
|
|
|
//W25X64:40s
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F>ȴ<EFBFBD>ʱ<EFBFBD>䳬<EFBFBD><E4B3AC>...
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_Flash_Erase_Chip(void)
|
|
|
|
|
{
|
|
|
|
|
SPI_FLASH_Write_Enable(); //SET WEL
|
|
|
|
|
SPI_Flash_Wait_Busy();
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(W25X_ChipErase); //<2F><><EFBFBD><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
|
|
|
|
SPI_Flash_Wait_Busy(); //<2F>ȴ<EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//Dst_Addr:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ 0~511 for w25x16
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ɽ<EFBFBD><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>:150ms
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_Flash_Erase_Sector(u32 Dst_Addr)
|
|
|
|
|
{
|
|
|
|
|
//Dst_Addr*=4096;
|
|
|
|
|
SPI_FLASH_Write_Enable(); //SET WEL
|
|
|
|
|
SPI_Flash_Wait_Busy();
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(W25X_SectorErase); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
W25Q_ReadWriteByte((u8)((Dst_Addr)>>16)); //<2F><><EFBFBD><EFBFBD>24bit<69><74>ַ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
W25Q_ReadWriteByte((u8)((Dst_Addr)>>8));
|
|
|
|
|
W25Q_ReadWriteByte((u8)Dst_Addr);
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
|
|
|
|
SPI_Flash_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_Flash_Wait_Busy(void)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
while ((SPI_Flash_ReadSR()&0x01)==0x01); // <20>ȴ<EFBFBD>BUSYλ<59><CEBB><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_Flash_PowerDown(void)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_ReadWriteByte(W25X_PowerDown); //<2F><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
|
|
|
|
delay_us(3); //<2F>ȴ<EFBFBD>TPD
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
void SPI_Flash_WAKEUP(void)
|
|
|
|
|
{
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=0; //ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
W25Q_ReadWriteByte(W25X_ReleasePowerDown); // send W25X_PowerDown command 0xAB
|
2025-07-05 19:47:28 +08:00
|
|
|
|
W25Q_CS=1; //ȡ<><C8A1>Ƭѡ
|
|
|
|
|
delay_us(3); //<2F>ȴ<EFBFBD>TRES1
|
2025-06-27 00:32:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u16 SPI_Flash_GetType (void)
|
|
|
|
|
{
|
|
|
|
|
return SPI_FLASH_Type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|