1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
| void w25qxx\_write(w25qxx\_t \*w25qxx, uint8\_t \*pBuffer, uint32\_t WriteAddr, uint32\_t NumByteToWrite) {
\_\_w25qxx\_wait\_busy(w25qxx);
uint8\_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;
Addr = WriteAddr % w25qxx->page_size;
count = w25qxx->page_size - Addr;
NumOfPage = NumByteToWrite / w25qxx->page_size;
NumOfSingle = NumByteToWrite % w25qxx->page_size;
if (Addr == 0) { if (NumOfPage == 0) { w25qxx\_write\_page(w25qxx, pBuffer, WriteAddr, NumByteToWrite); } else {
while (NumOfPage--) { w25qxx\_write\_page(w25qxx, pBuffer, WriteAddr, w25qxx->page_size); WriteAddr += w25qxx->page_size; pBuffer += w25qxx->page_size; }
w25qxx\_write\_page(w25qxx, pBuffer, WriteAddr, NumOfSingle); } }
else { if (NumOfPage == 0) {
if (NumOfSingle > count) { temp = NumOfSingle - count;
w25qxx\_write\_page(w25qxx, pBuffer, WriteAddr, count);
WriteAddr += count;
pBuffer += count;
w25qxx\_write\_page(w25qxx, pBuffer, WriteAddr, temp); } else { w25qxx\_write\_page(w25qxx, pBuffer, WriteAddr, NumByteToWrite); } } else { NumByteToWrite -= count; NumOfPage = NumByteToWrite / w25qxx->page_size; NumOfSingle = NumByteToWrite % w25qxx->page_size;
w25qxx\_write\_page(w25qxx, pBuffer, WriteAddr, count);
WriteAddr += count;
pBuffer += count;
while (NumOfPage--) { w25qxx\_write\_page(w25qxx, pBuffer, WriteAddr, w25qxx->page_size); WriteAddr += w25qxx->page_size; pBuffer += w25qxx->page_size; } if (NumOfSingle != 0) { w25qxx\_write\_page(w25qxx, pBuffer, WriteAddr, NumOfSingle); } } }
\_\_w25qxx\_wait\_busy(w25qxx); }
void w25qxx\_write\_page(w25qxx\_t \*w25qxx, uint8\_t \*p_puffer, uint32\_t write_addr, uint32\_t bytes_to_write) { uint16\_t i; \_\_w25qxx\_write\_enable(w25qxx); \_\_w25qxx\_cs\_low(w25qxx); \_\_w25qxx\_spi\_readwrite\_byte(w25qxx, W25X_PageProgram);
\_\_w25qxx\_spi\_readwrite\_byte(w25qxx, (uint8\_t) ((write_addr) >> 16)); \_\_w25qxx\_spi\_readwrite\_byte(w25qxx, (uint8\_t) ((write_addr) >> 8)); \_\_w25qxx\_spi\_readwrite\_byte(w25qxx, (uint8\_t) write_addr); for (i = 0; i < bytes_to_write; i++) \_\_w25qxx\_spi\_readwrite\_byte(w25qxx, p_puffer[i]); \_\_w25qxx\_cs\_high(w25qxx); \_\_w25qxx\_wait\_busy(w25qxx); }
void w25qxx\_page\_program(w25qxx\_t \*w25qxx, uint32\_t page_addr, const uint8\_t \*ptr_buff) { \_\_w25qxx\_wait\_busy(w25qxx); \_\_w25qxx\_write\_enable(w25qxx);
\_\_w25qxx\_cs\_low(w25qxx);
uint32\_t byte_addr = page_addr \* w25qxx->page_size;
uint8\_t add_hi = (uint8\_t) ((byte_addr & 0x00FF0000) >> 16); uint8\_t add_mid = (uint8\_t) ((byte_addr & 0x0000FF00) >> 8); uint8\_t add_lo = (uint8\_t) (byte_addr);
\_\_w25qxx\_spi\_readwrite\_byte(w25qxx, W25X_PageProgram);
\_\_w25qxx\_spi\_readwrite\_byte(w25qxx, add_hi); \_\_w25qxx\_spi\_readwrite\_byte(w25qxx, add_mid); \_\_w25qxx\_spi\_readwrite\_byte(w25qxx, add_lo);
for (uint32\_t i = 0; i < w25qxx->page_size; i++) { \_\_w25qxx\_spi\_readwrite\_byte(w25qxx, ptr_buff[i]); }
\_\_w25qxx\_cs\_high(w25qxx); }
void w25qxx\_write\_sector(w25qxx\_t \*w25qxx, uint8\_t \*pBuffer, uint32\_t WriteAddr, uint32\_t count) { \_\_w25qxx\_wait\_busy(w25qxx); \_\_w25qxx\_write\_enable(w25qxx);
uint32\_t page_cnt; uint32\_t page_addr;
for (int i = 0; i < count; i++) { w25qxx\_sector\_erase\_4kb(w25qxx, (sector + i) \* w25qxx->page_size \* PAGES_PER_SECTOR); }
page_addr = sector \* PAGES_PER_SECTOR; page_cnt = count \* PAGES_PER_SECTOR;
\_\_w25qxx\_cs\_low(w25qxx); for (uint32\_t cnt = 0; cnt < page_cnt; cnt++) { \_\_w25qxx\_wait\_busy(w25qxx); w25qxx\_page\_program(w25qxx, page_addr, buff + w25qxx->page_size \* cnt); page_addr += 1; } \_\_w25qxx\_cs\_high(w25qxx); }
|