| const uint8_t *p = (const uint8_t *)buf; | const uint8_t *p = (const uint8_t *)buf; | ||||
| uint32_t max, pagelen; | uint32_t max, pagelen; | ||||
| //Serial.println("write"); | |||||
| //Serial.printf("WR: addr %08X, len %d\n", addr, len); | |||||
| do { | do { | ||||
| if (busy) wait(); | if (busy) wait(); | ||||
| //Serial.printf("pagelen=%d\n", pagelen); | |||||
| SPI.beginTransaction(SPICONFIG); | SPI.beginTransaction(SPICONFIG); | ||||
| CSASSERT(); | CSASSERT(); | ||||
| // write enable command | // write enable command | ||||
| CSRELEASE(); | CSRELEASE(); | ||||
| max = 256 - (addr & 0xFF); | max = 256 - (addr & 0xFF); | ||||
| pagelen = (len <= max) ? len : max; | pagelen = (len <= max) ? len : max; | ||||
| len -= pagelen; | |||||
| //Serial.printf("WR: addr %08X, pagelen %d\n", addr, pagelen); | |||||
| CSASSERT(); | CSASSERT(); | ||||
| if (flags & FLAG_32BIT_ADDR) { | if (flags & FLAG_32BIT_ADDR) { | ||||
| //Serial.printf("write 32 bit addr %08X %02X\n", addr, addr >> 24); | |||||
| SPI.transfer(0x02); | |||||
| SPI.transfer(0x02); // program page command | |||||
| SPI.transfer16(addr >> 16); | SPI.transfer16(addr >> 16); | ||||
| SPI.transfer16(addr); | SPI.transfer16(addr); | ||||
| } else { | } else { | ||||
| SPI.transfer16(0x0200 | ((addr >> 16) & 255)); | SPI.transfer16(0x0200 | ((addr >> 16) & 255)); | ||||
| SPI.transfer16(addr); | SPI.transfer16(addr); | ||||
| } | } | ||||
| // program page command | |||||
| addr += pagelen; | |||||
| len -= pagelen; | |||||
| do { | do { | ||||
| SPI.transfer(*p++); | SPI.transfer(*p++); | ||||
| } while (--pagelen > 0); | } while (--pagelen > 0); | ||||
| CSRELEASE(); | CSRELEASE(); | ||||
| SPI.endTransaction(); | |||||
| busy = 1; | busy = 1; | ||||
| //Serial.printf("busy=%d\n", busy); | |||||
| SPI.endTransaction(); | |||||
| } while (len > 0); | } while (len > 0); | ||||
| } | } | ||||