Created
January 13, 2016 15:43
-
-
Save benpicco-tmp/3c18eb4ad40600801d26 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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