Skip to content

Instantly share code, notes, and snippets.

@benpicco-tmp
Created January 13, 2016 15:43
Show Gist options
  • Save benpicco-tmp/3c18eb4ad40600801d26 to your computer and use it in GitHub Desktop.
Save benpicco-tmp/3c18eb4ad40600801d26 to your computer and use it in GitHub Desktop.
static bool flash_busy(void) {
uint8_t cmd = CMD_RDSR;
uint8_t data;
spi_tx(config, &cmd, 1, &data , 1, 0);
return data & STAT_BSY;
}
int flash_erase_block(uint32_t address, block_erase_t mode) {
uint8_t cmd_buffer[4];
// enable write
cmd_buffer[0] = CMD_WREN;
spi_tx(config, cmd_buffer, 1, 0, 0, 0);
// erase
switch (mode) {
case BLOCK_4K: // 4K erase
cmd_buffer[0] = CMD_SE;
break;
case BLOCK_32K: // 32K erase
cmd_buffer[0] = CMD_BE32;
break;
case BLOCK_64K: // 64K erase
cmd_buffer[0] = CMD_BE64;
break;
case BLOCK_ALL:
cmd_buffer[0] = CMD_CE;
break;
default:
return -1;
}
if (mode == BLOCK_ALL) {
spi_tx(config, cmd_buffer, 1, 0, 0, 0);
} else {
cmd_buffer[1] = (address >> 16) & 0xff;
cmd_buffer[2] = (address >> 8) & 0xff;
cmd_buffer[3] = (address >> 0) & 0xff;
spi_tx(config, cmd_buffer, 4, 0, 0, 0);
}
while(flash_busy());
return 0;
}
int flash_write_page(uint32_t address, uint32_t len, const uint8_t *data) {
uint8_t cmd_buffer[4];
// enable write
cmd_buffer[0] = CMD_WREN;
spi_tx(config, cmd_buffer, 1, 0, 0, 0);
// write page
cmd_buffer[0] = CMD_PP;
cmd_buffer[1] = (address >> 16) & 0xff;
cmd_buffer[2] = (address >> 8) & 0xff;
cmd_buffer[3] = (address >> 0) & 0xff;
spi_tx(config, cmd_buffer, 4, (uint8_t *) data, len, SPI_DATA_IMMUTABLE);
while(flash_busy());
return 0; // spiffs wants it so
}
int flash_read_page(uint32_t address, uint32_t len, uint8_t *data) {
uint8_t cmd_buffer[5];
cmd_buffer[0] = CMD_FREAD;
cmd_buffer[1] = (address >> 16) & 0xff;
cmd_buffer[2] = (address >> 8) & 0xff;
cmd_buffer[3] = (address >> 0) & 0xff;
cmd_buffer[4] = 0;
spi_tx(config, cmd_buffer, 5, data, len, 0);
return 0; // spiffs wants it so
}
void flash_init(void) {
flash_spi_init();
uint8_t cmd_buffer[2];
// wait for the device to be ready
busy_wait(100);
// write enable (for writing status register)
cmd_buffer[0] = CMD_WREN;
spi_tx(config, cmd_buffer, 1, 0, 0, 0);
// write status reguster
cmd_buffer[0] = CMD_WRSR;
cmd_buffer[1] = 0;
spi_tx(config, cmd_buffer, 2, 0, 0, 0);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment