dev_spiflash.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #ifndef __DEV_SPIFLASH_H__
  2. #define __DEV_SPIFLASH_H__
  3. #define SPIFLASH_CMD_WREN (0x06) //写使能
  4. #define SPIFLASH_CMD_WRDI (0x04) //写禁止
  5. #define SPIFLASH_CMD_WRSR (0X01) //写状态寄存器
  6. #define SPIFLASH_CMD_SE (0x20) //段擦除
  7. #define SPIFLASH_CMD_BE (0xD8) //块擦除
  8. #define SPIFLASH_CMD_CE (0xC7) //全擦除
  9. #define SPIFLASH_CMD_BE2 (0x52) //块擦除
  10. #define SPIFLASH_CMD_CE2 (0x60) //全擦除
  11. #define SPIFLASH_CMD_RDID (0x9F) //读JEDEC ID
  12. #define SPIFLASH_CMD_RDSR (0x05) //读状态寄存器
  13. #define SPIFLASH_CMD_READ (0x03) //读数据
  14. #define SPIFLASH_CMD_FTRD (0x0B) //快速读取
  15. #define SPIFLASH_CMD_DRD (0x3B) //双线读取
  16. #define SPIFLASH_CMD_TRD (0x6B) //三线读取
  17. #define SPIFLASH_CMD_PP (0x02) //写flash
  18. #define SPIFLASH_SR_SRWR (0x80)
  19. #define SPIFLASH_SR_TB (0x20)
  20. #define SPIFLASH_SR_BP2 (0x10)
  21. #define SPIFLASH_SR_BP1 (0x08)
  22. #define SPIFLASH_SR_BP0 (0x04)
  23. #define SPIFLASH_SR_WEL (0x02)
  24. #define SPIFLASH_SR_BUSY (0x01)
  25. #define SPIFLASH_ERASE_CHIP (1)
  26. #define SPIFLASH_ERASE_BLOCK (2)
  27. #define SPIFLASH_ERASE_SECTOR (3)
  28. #define SPIFLASH_RAW_LEN (256)
  29. #define SPIFLASH_PAGE_LEN (256)
  30. #define SPIFLASH_SECTOR_LEN (4096)
  31. #define SPIFLASH_BLOCK_LEN (65536)
  32. #define SPIFLASH_PP_RUN (1)
  33. #define SPIFLASH_PP_DONE (2)
  34. #define SPIFLASH_PP_ERROR (3)
  35. #define SPI_FLASH_PAGE_SIZE 256
  36. #define SPI_FLASH_SECTOR_SIZE (4 * 1024)
  37. #define SPI_FLASH_BLOCK_SIZE (64 * 1024)
  38. #define SPI_FLASH_BLOCK32K_SIZE (32 * 1024)
  39. #define SPI_FLASH_PAGE_MASK (SPI_FLASH_PAGE_SIZE - 1)
  40. #define SPI_FLASH_SECTOR_MASK (SPI_FLASH_SECTOR_SIZE - 1)
  41. #define SPI_FLASH_BLOCK_MASK (SPI_FLASH_BLOCK_SIZE - 1)
  42. #define SPI_FLASH_BLOCK32K_MASK (SPI_FLASH_BLOCK32K_SIZE - 1)
  43. typedef struct
  44. {
  45. uint64_t SPIEndTick; //SPI传输的结束时最大tick
  46. uint64_t FlashOPEndTick; //SPI的擦写操作结束时最大tick
  47. HANDLE NotifyTask; //设置了NotifyTask,则会在大量传输SPI数据时,休眠任务但是仍然能接收Event并在CB中处理
  48. CBFuncEx_t TaskCB;
  49. const uint8_t *TxBuf; //大量读写数据的缓存
  50. // uint8_t *RxBuf; //大量读写数据的缓存
  51. uint32_t CSDelayUS;
  52. uint32_t AddrStart; //读写的初始地址,或者擦除的地址
  53. uint32_t DataLen; //大量读写数据的长度
  54. uint32_t FinishLen; //已经写入的长度
  55. uint32_t Size; //flash的大小KB
  56. uint32_t EraseSectorWaitTime;
  57. uint32_t EraseBlockWaitTime;
  58. uint32_t ProgramWaitTimeUS;
  59. uint32_t EraseSectorTime;
  60. uint32_t EraseBlockTime;
  61. uint32_t ProgramTime;
  62. uint8_t State; //SPIFLASH主流程状态
  63. uint8_t IsPPErase; //是否是擦除的编程操作
  64. uint8_t PPDone; //SPIFLASH子流程中擦除或者编程开始执行,此位置1且flash不忙碌,说明擦除或者编程真正完成
  65. uint8_t SpiID;
  66. uint8_t FlashError;
  67. uint8_t SPIError; //spi故障位
  68. uint8_t FlashSR; //flash最近一次SR
  69. uint8_t FlashSRReadTime; //flash SR最多读取次数
  70. uint8_t FlashID[3];
  71. uint8_t Tx[SPIFLASH_RAW_LEN + 6]; //SPI发送缓冲,256+6字节
  72. uint8_t Rx[SPIFLASH_RAW_LEN + 6]; //SPI接收缓冲,256+6字节
  73. uint8_t IsBlockMode; //是否在擦读写操作时采用阻塞模式,如果是0,则需要调用SPIFlash_WaitOpDone来获取结果
  74. uint8_t IsSpiDMAMode;
  75. uint8_t CSPin;
  76. uint8_t IsInit;
  77. }SPIFlash_CtrlStruct;
  78. void SPIFlash_Init(SPIFlash_CtrlStruct *Ctrl, void *Config);
  79. int32_t SPIFlash_ID(SPIFlash_CtrlStruct *Ctrl);
  80. int32_t SPIFlash_ReadSR(SPIFlash_CtrlStruct *Ctrl);
  81. int32_t SPIFlash_WriteSR(SPIFlash_CtrlStruct *Ctrl, uint8_t SR);
  82. int32_t SPIFlash_CheckBusy(SPIFlash_CtrlStruct *Ctrl);
  83. uint8_t SPIFlash_WaitOpDone(SPIFlash_CtrlStruct *Ctrl);
  84. int32_t SPIFlash_WriteEnable(SPIFlash_CtrlStruct *Ctrl);
  85. uint8_t SPIFlash_BusyCheck(SPIFlash_CtrlStruct *Ctrl);
  86. uint8_t SPIFlash_WriteBusyCheck(SPIFlash_CtrlStruct *Ctrl);
  87. void SPIFlash_Reset(SPIFlash_CtrlStruct *Ctrl);
  88. int32_t SPIFlash_Read(SPIFlash_CtrlStruct *Ctrl, uint32_t Address, uint8_t *Buf, uint32_t Length, uint8_t FastRead);
  89. int32_t SPIFlash_Write(SPIFlash_CtrlStruct *Ctrl, uint32_t Address, const uint8_t *Buf, uint32_t Length);
  90. int32_t SPIFlash_Erase(SPIFlash_CtrlStruct *Ctrl, uint32_t Address, uint32_t Length);
  91. int32_t SPIFlash_State(SPIFlash_CtrlStruct *Ctrl);
  92. #endif