/*
 * Flash.h
 *
 *  Created on: 2024年5月16日
 *      Author: 34509
 */

#ifndef HARDWARE_SPI_FLASH_H_
#define HARDWARE_SPI_FLASH_H_

#include "ch32l103.h"
  

/*****************************************
*@Note
  Winbond W25Qxx SPIFLASH

pins:
    CS   —— PB12(SPI2_NSS)
    DO   —— PB14(SPI2_MISO)
    WP   —— 3.3V
    DI   —— PB15(SPI2_MOSI)
    CLK  —— PB13(SPI2_SCK)
    HOLD —— 3.3V

*******************************************/
#define RCC_APB2Periph_GPIOX RCC_PB2Periph_GPIOB
#define RCC_APB1Periph_SPIX RCC_PB1Periph_SPI2

#define CS_PIN GPIO_Pin_12
#define CS_GPIO GPIOB

#define DO_PIN GPIO_Pin_14
#define DO_GPIO GPIOB

#define DI_PIN GPIO_Pin_15
#define DI_GPIO GPIOB

#define CLK_PIN GPIO_Pin_13
#define CLK_GPIO GPIOB

#define SPIX SPI2

/* Winbond SPI Falsh ID */
#define W25Q80  0XEF13
#define W25Q16  0XEF14
#define W25Q32  0XEF15
#define W25Q64  0XEF16
#define W25Q128 0XEF17



/* Winbond SPIFalsh Instruction List 指令表  */
#define W25X_WriteEnable          0x06
#define W25X_WriteDisable         0x04
#define W25X_ReadStatusReg        0x05
#define W25X_WriteStatusReg       0x01
#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

void SPI_Flash_Init(void);
u8 SPI_ReadWriteByte(u8 TxData);
u8 SPI_Flash_ReadSR(void);
void SPI_FLASH_Write_SR(u8 sr);
void SPI_Flash_Wait_Busy(void);
void SPI_FLASH_Write_Enable(void);
void SPI_FLASH_Write_Disable(void);
u16 SPI_Flash_ReadID(void);
void SPI_Flash_Erase_Sector(u32 Dst_Addr);
void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 size);
void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 size);
void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 size);
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 size);
void SPI_Flash_Erase_Chip(void);
void SPI_Flash_PowerDown(void);
void SPI_Flash_WAKEUP(void);

void SPI_Flash_TEST(void);

#endif /* HARDWARE_SPI_FLASH_H_ */