#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include "stm32f10x_conf.h"
#include "stm32f10x_gpio.h"
#include "core_cm3.h"
#include "drv_m25p16.h"
#include <drv_spi.h>
#include <drv_system.h>
Go to the source code of this file.
Functions | |
void | m25p16_eraseCompletely () |
void | m25p16_eraseSector (uint32_t address) |
const flashGeometry_t * | m25p16_getGeometry () |
bool | m25p16_init () |
bool | m25p16_isReady () |
void | m25p16_pageProgram (uint32_t address, const uint8_t *data, int length) |
void | m25p16_pageProgramBegin (uint32_t address) |
void | m25p16_pageProgramContinue (const uint8_t *data, int length) |
void | m25p16_pageProgramFinish () |
static void | m25p16_performOneByteCommand (uint8_t command) |
int | m25p16_readBytes (uint32_t address, uint8_t *buffer, int length) |
static bool | m25p16_readIdentification () |
static uint8_t | m25p16_readStatus () |
bool | m25p16_waitForReady (uint32_t timeoutMillis) |
static void | m25p16_writeEnable () |
Variables | |
static bool | couldBeBusy = false |
static flashGeometry_t | geometry = {.pageSize = M25P16_PAGESIZE} |
#define BULK_ERASE_TIMEOUT_MILLIS 21000 |
Definition at line 79 of file drv_m25p16.c.
#define DEFAULT_TIMEOUT_MILLIS 6 |
Definition at line 75 of file drv_m25p16.c.
#define DISABLE_M25P16 GPIO_SetBits(M25P16_CS_GPIO, M25P16_CS_PIN) |
Definition at line 71 of file drv_m25p16.c.
#define ENABLE_M25P16 GPIO_ResetBits(M25P16_CS_GPIO, M25P16_CS_PIN) |
Definition at line 72 of file drv_m25p16.c.
#define JEDEC_ID_MICRON_M25P16 0x202015 |
Definition at line 65 of file drv_m25p16.c.
#define JEDEC_ID_MICRON_N25Q064 0x20BA17 |
Definition at line 66 of file drv_m25p16.c.
#define JEDEC_ID_MICRON_N25Q128 0x20ba18 |
Definition at line 68 of file drv_m25p16.c.
#define JEDEC_ID_WINBOND_W25Q128 0xEF4018 |
Definition at line 69 of file drv_m25p16.c.
#define JEDEC_ID_WINBOND_W25Q64 0xEF4017 |
Definition at line 67 of file drv_m25p16.c.
#define M25P16_CS_GPIO NAZE_SPI_CS_GPIO |
Definition at line 41 of file drv_m25p16.c.
#define M25P16_CS_PIN NAZE_SPI_CS_PIN |
Definition at line 42 of file drv_m25p16.c.
#define M25P16_INSTRUCTION_BULK_ERASE 0xC7 |
Definition at line 59 of file drv_m25p16.c.
#define M25P16_INSTRUCTION_PAGE_PROGRAM 0x02 |
Definition at line 57 of file drv_m25p16.c.
#define M25P16_INSTRUCTION_RDID 0x9F |
Definition at line 51 of file drv_m25p16.c.
#define M25P16_INSTRUCTION_READ_BYTES 0x03 |
Definition at line 52 of file drv_m25p16.c.
#define M25P16_INSTRUCTION_READ_STATUS_REG 0x05 |
Definition at line 53 of file drv_m25p16.c.
#define M25P16_INSTRUCTION_SECTOR_ERASE 0xD8 |
Definition at line 58 of file drv_m25p16.c.
#define M25P16_INSTRUCTION_WRITE_DISABLE 0x04 |
Definition at line 56 of file drv_m25p16.c.
#define M25P16_INSTRUCTION_WRITE_ENABLE 0x06 |
Definition at line 55 of file drv_m25p16.c.
#define M25P16_INSTRUCTION_WRITE_STATUS_REG 0x01 |
Definition at line 54 of file drv_m25p16.c.
#define M25P16_SPI_INSTANCE NAZE_SPI_INSTANCE |
Definition at line 43 of file drv_m25p16.c.
#define M25P16_STATUS_FLAG_WRITE_ENABLED 0x02 |
Definition at line 62 of file drv_m25p16.c.
#define M25P16_STATUS_FLAG_WRITE_IN_PROGRESS 0x01 |
Definition at line 61 of file drv_m25p16.c.
#define NAZE_CS_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOB |
Definition at line 38 of file drv_m25p16.c.
#define NAZE_SPI_CS_GPIO GPIOB |
Definition at line 36 of file drv_m25p16.c.
#define NAZE_SPI_CS_PIN GPIO_Pin_12 |
Definition at line 37 of file drv_m25p16.c.
#define NAZE_SPI_INSTANCE SPI2 |
Definition at line 35 of file drv_m25p16.c.
#define SECTOR_ERASE_TIMEOUT_MILLIS 5000 |
Definition at line 78 of file drv_m25p16.c.
#define U_ID_0 (*(uint32_t*)0x1FFFF7E8) |
Definition at line 31 of file drv_m25p16.c.
#define U_ID_1 (*(uint32_t*)0x1FFFF7EC) |
Definition at line 32 of file drv_m25p16.c.
#define U_ID_2 (*(uint32_t*)0x1FFFF7F0) |
Definition at line 33 of file drv_m25p16.c.
void m25p16_eraseCompletely | ( | ) |
Definition at line 243 of file drv_m25p16.c.
void m25p16_eraseSector | ( | uint32_t | address | ) |
Erase a sector full of bytes to all 1's at the given byte offset in the flash chip.
Definition at line 228 of file drv_m25p16.c.
const flashGeometry_t* m25p16_getGeometry | ( | ) |
Fetch information about the detected flash chip layout.
Can be called before calling m25p16_init() (the result would have totalSize = 0).
Definition at line 330 of file drv_m25p16.c.
bool m25p16_init | ( | ) |
Initialize the driver, must be called before any other routines.
Attempts to detect a connected m25p16. If found, true is returned and device capacity can be fetched with m25p16_getGeometry().
Definition at line 217 of file drv_m25p16.c.
bool m25p16_isReady | ( | ) |
Definition at line 128 of file drv_m25p16.c.
void m25p16_pageProgram | ( | uint32_t | address, |
const uint8_t * | data, | ||
int | length | ||
) |
Write bytes to a flash page. Address must not cross a page boundary.
Bits can only be set to zero, not from zero back to one again. In order to set bits to 1, use the erase command.
Length must be smaller than the page size.
This will wait for the flash to become ready before writing begins.
Datasheet indicates typical programming time is 0.8ms for 256 bytes, 0.2ms for 64 bytes, 0.05ms for 16 bytes. (Although the maximum possible write time is noted as 5ms).
If you want to write multiple buffers (whose sum of sizes is still not more than the page size) then you can break this operation up into one beginProgram call, one or more continueProgram calls, and one finishProgram call.
Definition at line 290 of file drv_m25p16.c.
void m25p16_pageProgramBegin | ( | uint32_t | address | ) |
Definition at line 252 of file drv_m25p16.c.
void m25p16_pageProgramContinue | ( | const uint8_t * | data, |
int | length | ||
) |
Definition at line 265 of file drv_m25p16.c.
void m25p16_pageProgramFinish | ( | ) |
Definition at line 270 of file drv_m25p16.c.
|
static |
Send the given command byte to the device.
Definition at line 93 of file drv_m25p16.c.
int m25p16_readBytes | ( | uint32_t | address, |
uint8_t * | buffer, | ||
int | length | ||
) |
Read length
bytes into the provided buffer
from the flash starting from the given address
(which need not lie on a page boundary).
Waits up to DEFAULT_TIMEOUT_MILLIS milliseconds for the flash to become ready before reading.
The number of bytes actually read is returned, which can be zero if an error or timeout occurred.
Definition at line 307 of file drv_m25p16.c.
|
static |
Read chip identification and geometry information (into global geometry
).
Returns true if we get valid ident, false if something bad happened like there is no M25P16.
Definition at line 153 of file drv_m25p16.c.
|
static |
Definition at line 114 of file drv_m25p16.c.
bool m25p16_waitForReady | ( | uint32_t | timeoutMillis | ) |
Definition at line 136 of file drv_m25p16.c.
|
static |
The flash requires this write enable command to be sent before commands that would cause a write like program and erase.
Definition at line 106 of file drv_m25p16.c.
|
static |
Definition at line 88 of file drv_m25p16.c.
|
static |
Definition at line 81 of file drv_m25p16.c.