HAL_Project/Project -APP-V1.0/Hardware/W25QXX/w25qxx.c.orig

170 lines
8.3 KiB
C
Raw Permalink Normal View History

2025-05-09 15:43:42 +08:00
#include "main.h"
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>W25Qxx */
/*<2A><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0<EFBFBD><30><EFBFBD><EFBFBD>ȷ */
/*-------------------------------------------------*/
uint8_t W25Qxx_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
GPIOD_RCC_ENABLE; //ʹ<>ܶ˿<DCB6><44><CAB1>
GPIO_Initure.Pin=GPIO_PIN_12; //<2F><><EFBFBD><EFBFBD>PD0
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_FREQ_HIGH; //<2F><><EFBFBD><EFBFBD>ģʽ
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //<2F><><EFBFBD><EFBFBD>
CS_DISENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
SPI2_Init(); //<2F><>ʼ<EFBFBD><CABC>SPI2<49>ӿ<EFBFBD>
if(W25Qxx_ReadID()==W25QxxID){ //<2F><>ȡID<49><44><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>if
W25Qxx_Write_Enable(); //дʹ<D0B4><CAB9>
}else return 1; //<2F><>ȡID<49><44><EFBFBD>󣬷<EFBFBD><F3A3ACB7><EFBFBD>1
return 0; //<2F><>ȷ <20><><EFBFBD><EFBFBD>0
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Qxx<78><78>дʹ<D0B4><CAB9> */
/*<2A><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> */
/*-------------------------------------------------*/
void W25Qxx_Write_Enable(void)
{
W25Qxx_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
CS_ENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
SPI2_WriteByte(W25Qxx_WriteEnable); //<2F><><EFBFBD><EFBFBD>дʹ<D0B4><CAB9>
CS_DISENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Qxx<78><78>д<EFBFBD><D0B4>ֹ */
/*<2A><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> */
/*-------------------------------------------------*/
void W25QXX_Write_Disable(void)
{
W25Qxx_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
CS_ENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
SPI2_WriteByte(W25Qxx_WriteDisable); //<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ֹ
CS_DISENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡW25QxxоƬID */
/*<2A><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0XEF17 <20><>W25Qxx<78><78>ID */
/*-------------------------------------------------*/
uint16_t W25Qxx_ReadID(void)
{
uint8_t wdata[6] = {0x90,0x00,0x00,0x00,0x00,0x00}; //<2F><>ȡIDָ<44><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t rdata[6]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
W25Qxx_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
CS_ENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
SPI2_WriteRead(wdata,rdata,6); //<2F><><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CS_DISENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
return (rdata[4]*256 + rdata[5]); //<2F><><EFBFBD><EFBFBD>ID
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Qxx<78>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> */
/*-------------------------------------------------*/
void W25Qxx_Wait_Busy(void)
{
uint8_t res;
do{
CS_ENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
SPI2_WriteByte(W25Qxx_ReadStatusReg1); //<2F><><EFBFBD>Ͷ<EFBFBD>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
res = SPI2_ReadByte(); //<2F><>ȡ״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD>1
CS_DISENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
}while((res&0x01)==0x01); //<2F>ȴ<EFBFBD>BUSYλ<59><CEBB><EFBFBD>գ<EFBFBD><D5A3><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Qxx<78><78><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4KB<4B><42> */
/*<2A><> <20><><EFBFBD><EFBFBD>NBsector:<3A>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>0~4095<39><35> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> */
/*-------------------------------------------------*/
void W25Qxx_Erase_Sector(uint16_t NBsector)
{
uint8_t wdata[4]; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
wdata[0] = W25Qxx_SectorErase; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
wdata[1] = (NBsector*4096)>>16; //A23~A16<31><36>ַλ
wdata[2] = (NBsector*4096)>>8; //A15~A8<41><38>ַλ
wdata[3] = (NBsector*4096)>>0; //A7~A0<41><30>ַλ
W25Qxx_Write_Enable(); //дʹ<D0B4><CAB9>
W25Qxx_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
CS_ENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
SPI2_Write(wdata,4); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CS_DISENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
W25Qxx_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Qxx<78><78><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>飨64KB<4B><42> */
/*<2A><> <20><><EFBFBD><EFBFBD>NBsector:<3A>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD> <20><>0~255<35><35> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> */
/*-------------------------------------------------*/
void W25Qxx_Erase_Block(uint8_t NBBlock)
{
uint8_t wdata[4]; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
wdata[0] = W25Qxx_BlockErase; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
wdata[1] = (NBBlock*16*4096)>>16; //A23~A16<31><36>ַλ
wdata[2] = (NBBlock*16*4096)>>8; //A15~A8<41><38>ַλ
wdata[3] = (NBBlock*16*4096)>>0; //A7~A0<41><30>ַλ
W25Qxx_Write_Enable(); //дʹ<D0B4><CAB9>
W25Qxx_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
CS_ENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
SPI2_Write(wdata,4); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CS_DISENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
W25Qxx_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Qxxд<78><D0B4>һҳ<D2BB><D2B3><EFBFBD>ݣ<EFBFBD>256<35>ֽڣ<D6BD> */
/*<2A><> <20><><EFBFBD><EFBFBD>wdata:<3A><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><> <20><><EFBFBD><EFBFBD>NBPage:<3A>ڼ<EFBFBD><DABC><EFBFBD>ҳ<EFBFBD><D2B3>0~65535<33><35> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> */
/*-------------------------------------------------*/
void W25Qxx_Write_Page(uint8_t* wbuff, uint16_t NBPage)
{
uint8_t wdata[4]; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
wdata[0] = W25Qxx_PageProgram; //ҳ<><D2B3>256B<36><42>д<EFBFBD><D0B4>ָ<EFBFBD><D6B8>
wdata[1] = (NBPage*256)>>16; //A23~A16<31><36>ַλ
wdata[2] = (NBPage*256)>>8; //A15~A8<41><38>ַλ
wdata[3] = (NBPage*256)>>0; //A7~A0<41><30>ַλ
W25Qxx_Write_Enable(); //дʹ<D0B4><CAB9>
W25Qxx_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
CS_ENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
SPI2_Write(wdata,4); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI2_Write(wbuff,256); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CS_DISENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
}
/*-------------------------------------------------*/
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W25Qxx<78><78>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> */
/*<2A><> <20><><EFBFBD><EFBFBD>rdata:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><> <20><><EFBFBD><EFBFBD>rAddr:<3A><>ȡ<EFBFBD>Ŀ<EFBFBD>ʼ<EFBFBD><CABC>ַ */
/*<2A><> <20><><EFBFBD><EFBFBD>len:<3A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD> */
/*<2A><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD> */
/*-------------------------------------------------*/
void W25Qxx_Read(uint8_t* rdata,uint32_t rAddr,uint32_t len)
{
uint8_t wdata[4]; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
wdata[0] = W25Qxx_ReadData; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
wdata[1] = rAddr>>16; //A23~A16<31><36>ַλ
wdata[2] = rAddr>>8; //A15~A8<41><38>ַλ
wdata[3] = rAddr>>0; //A7~A0<41><30>ַλ
W25Qxx_Wait_Busy(); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
CS_ENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
SPI2_Write(wdata,4); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SPI2_Read(rdata,len); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CS_DISENABLE; //CS<43><53>Ч<EFBFBD>ź<EFBFBD>
}