| 179 | } |
| 180 | |
| 181 | void SerialFlashChip::write(uint32_t addr, const void *buf, uint32_t len) |
| 182 | { |
| 183 | const uint8_t *p = (const uint8_t *)buf; |
| 184 | uint32_t max, pagelen; |
| 185 | |
| 186 | //Serial.printf("WR: addr %08X, len %d\n", addr, len); |
| 187 | do { |
| 188 | if (busy) wait(); |
| 189 | SPIPORT.beginTransaction(SPICONFIG); |
| 190 | CSASSERT(); |
| 191 | // write enable command |
| 192 | SPIPORT.transfer(0x06); |
| 193 | CSRELEASE(); |
| 194 | max = 256 - (addr & 0xFF); |
| 195 | pagelen = (len <= max) ? len : max; |
| 196 | //Serial.printf("WR: addr %08X, pagelen %d\n", addr, pagelen); |
| 197 | delayMicroseconds(1); // TODO: reduce this, but prefer safety first |
| 198 | CSASSERT(); |
| 199 | if (flags & FLAG_32BIT_ADDR) { |
| 200 | SPIPORT.transfer(0x02); // program page command |
| 201 | SPIPORT.transfer16(addr >> 16); |
| 202 | SPIPORT.transfer16(addr); |
| 203 | } else { |
| 204 | SPIPORT.transfer16(0x0200 | ((addr >> 16) & 255)); |
| 205 | SPIPORT.transfer16(addr); |
| 206 | } |
| 207 | addr += pagelen; |
| 208 | len -= pagelen; |
| 209 | do { |
| 210 | SPIPORT.transfer(*p++); |
| 211 | } while (--pagelen > 0); |
| 212 | CSRELEASE(); |
| 213 | busy = 4; |
| 214 | SPIPORT.endTransaction(); |
| 215 | } while (len > 0); |
| 216 | } |
| 217 | |
| 218 | void SerialFlashChip::eraseAll() |
| 219 | { |
no outgoing calls
no test coverage detected