55
66#include "flash.h"
77#include "w25q64jv.h"
8+ #include "w25q128jv.h"
89
910static uint8_t flash_page_bitmap [W25Q64JV_FLASH_SIZE / W25Q64JV_PAGE_SIZE / 8 ];
1011
@@ -15,6 +16,7 @@ static int get_bitmap(uint32_t bitNo);
1516void flash_init (void )
1617{
1718 QSPI_W25Q64JV_Reset ();
19+ SPI_W25Q128JV_Reset ();
1820 for (int i = 0 ; i < (W25Q64JV_FLASH_SIZE / W25Q64JV_PAGE_SIZE / 8 ); i ++ )
1921 {
2022 set_bitmap (i );
@@ -29,12 +31,17 @@ void flash_init(void)
2931 //}
3032}
3133
32- void flash_read (uint32_t WriteAddr , uint8_t * pData , uint32_t Size )
34+ void flash_read (uint32_t ReadAddr , uint8_t * pData , uint32_t Size )
3335{
34- if (WriteAddr & 0x90000000 )
36+ if (( ReadAddr & 0x90000000 ) == 0x90000000 )
3537 {
36- WriteAddr -= 0x90000000 ;
37- QSPI_W25Q64JV_Read (pData , WriteAddr , Size );
38+ ReadAddr -= 0x90000000 ;
39+ QSPI_W25Q64JV_Read (pData , ReadAddr , Size );
40+ }
41+ else if ((ReadAddr & 0xA0000000 ) == 0xA0000000 )
42+ {
43+ ReadAddr -= 0xA0000000 ;
44+ SPI_W25Q128JV_Read (pData , ReadAddr , Size );
3845 }
3946}
4047
@@ -43,7 +50,7 @@ void flash_write(uint32_t WriteAddr, uint8_t *pData, uint32_t Size)
4350 uint32_t sector_num ;
4451 uint32_t page_num ;
4552
46- if (WriteAddr & 0x90000000 )
53+ if (( WriteAddr & 0x90000000 ) == 0x90000000 )
4754 {
4855 WriteAddr -= 0x90000000 ;
4956 page_num = WriteAddr / W25Q64JV_PAGE_SIZE ;
@@ -61,6 +68,24 @@ void flash_write(uint32_t WriteAddr, uint8_t *pData, uint32_t Size)
6168 page_num = WriteAddr / W25Q64JV_PAGE_SIZE ;
6269 set_bitmap (page_num ); // 设置page位图,表示此page已经被使用.
6370 }
71+ else if ((WriteAddr & 0xA0000000 ) == 0xA0000000 )
72+ {
73+ WriteAddr -= 0xA0000000 ;
74+ page_num = WriteAddr / W25Q128JV_PAGE_SIZE ;
75+ if (get_bitmap (page_num )) // 检测page是否pageprogram.
76+ {
77+ sector_num = WriteAddr / W25Q128JV_SECTOR_SIZE ; // 计算出page所在sector的首地址
78+ page_num = sector_num * (W25Q128JV_SECTOR_SIZE / W25Q128JV_PAGE_SIZE ); // 被擦除的sector对应的page首地址
79+ SPI_W25Q128JV_EraseSector (sector_num * W25Q128JV_SECTOR_SIZE );
80+ for (uint32_t i = page_num ; i < (page_num + W25Q128JV_SECTOR_SIZE / W25Q128JV_PAGE_SIZE ); i ++ )
81+ {
82+ clr_bitmap (i ); // 清除被擦除page的位图
83+ }
84+ }
85+ SPI_W25Q128JV_Write (pData , WriteAddr , Size );
86+ page_num = WriteAddr / W25Q128JV_PAGE_SIZE ;
87+ set_bitmap (page_num ); // 设置page位图,表示此page已经被使用.
88+ }
6489}
6590
6691static void clr_bitmap (uint32_t bitNo )
0 commit comments