Loading...
Searching...
No Matches
w25q128.c
1/***********************************************************************************
2 * @file flash.c *
3 * @author Matt Ricci *
4 * @addtogroup Flash *
5 * @brief Brief description of the file's purpose. *
6 * *
7 * @{ *
8 ***********************************************************************************/
9
10#include "w25q128.h"
11#include "string.h"
12
13/* =============================================================================== */
24 W25Q128_t *flash,
25 SPI_t *spi,
26 GPIOpin_t cs
27) {
28 flash->base = spi;
29 flash->cs = cs;
30 flash->pageSize = W25Q128_PAGE_SIZE;
31 flash->pageCount = W25Q128_PAGE_COUNT;
32 flash->erase = W25Q128_erase;
35
36 return *flash;
37}
38
39/********************************* PRIVATE METHODS *********************************/
40
41#ifndef DOXYGEN_PRIVATE
42
43/* =============================================================================== */
52 SPI_t *spi = flash->base;
53 GPIOpin_t cs = flash->cs;
54
55 cs.reset(&cs);
56 spi->transmit(spi, W25Q128_WRITE_ENABLE);
57 cs.set(&cs);
58}
59
60/* =============================================================================== */
69void _W25Q128_readStatus1(W25Q128_t *flash, uint8_t *status) {
70 SPI_t *spi = flash->base;
71 GPIOpin_t cs = flash->cs;
72
73 cs.reset(&cs);
74 *status = spi->transmit(spi, W25Q128_READ_STATUS_REGISTER_1);
75 *status = spi->transmit(spi, 0x0F);
76 cs.set(&cs);
77}
78
79/* =============================================================================== */
88void _W25Q128_readStatus2(W25Q128_t *flash, uint8_t *status) {
89 SPI_t *spi = flash->base;
90 GPIOpin_t cs = flash->cs;
91
92 cs.reset(&cs);
93 *status = spi->transmit(spi, W25Q128_READ_STATUS_REGISTER_2);
94 *status = spi->transmit(spi, 0x0F);
95 cs.set(&cs);
96}
97
98/* =============================================================================== */
107void _W25Q128_readStatus3(W25Q128_t *flash, uint8_t *status) {
108 SPI_t *spi = flash->base;
109 GPIOpin_t cs = flash->cs;
110
111 cs.reset(&cs);
112 *status = spi->transmit(spi, W25Q128_READ_STATUS_REGISTER_3);
113 *status = spi->transmit(spi, 0x0F);
114 cs.set(&cs);
115}
116
117#endif
118
119/********************************* DEVICE METHODS **********************************/
120
121/* =============================================================================== */
131 SPI_t *spi = flash->base;
132 GPIOpin_t cs = flash->cs;
133
134 uint8_t status = 0;
135
136 // Send Erase Chip instruction
137 cs.reset(&cs);
138 spi->transmit(spi, W25Q128_ERASE_CHIP);
139 cs.set(&cs);
140
141 // Wait until chip BUSY is clear
142 do {
143 _W25Q128_readStatus1(flash, &status);
144 } while (status & 0x01);
145}
146
147/* =============================================================================== */
157void W25Q128_writePage(W25Q128_t *flash, uint32_t address, uint8_t *data) {
159 SPI_t *spi = flash->base;
160 GPIOpin_t cs = flash->cs;
161
162 uint8_t status = 0;
163
164 cs.reset(&cs);
165
166 // Send Page Program instruction and 24-bit address
167 spi->transmit(spi, W25Q128_PAGE_PROGRAM);
168 spi->transmit(spi, (address & 0xFF0000) >> 16);
169 spi->transmit(spi, (address & 0xFF00) >> 8);
170 spi->transmit(spi, (address & 0xFF));
171
172 // Send page data
173 for (int i = 0; i < 256; i++) {
174 spi->transmit(spi, data[i]);
175 }
176
177 cs.set(&cs);
178
179 // Wait until chip BUSY is clear
180 do {
181 _W25Q128_readStatus1(flash, &status);
182 } while (status & 0x1);
183}
184
185/* =============================================================================== */
195void W25Q128_readPage(W25Q128_t *flash, uint32_t address, volatile uint8_t *data) {
196 SPI_t *spi = flash->base;
197 GPIOpin_t cs = flash->cs;
198
199 cs.reset(&cs);
200
201 // Send Read Data instruction and 24-bit address
202 spi->transmit(spi, W25Q128_READ_DATA);
203 spi->transmit(spi, (address & 0xFF0000) >> 16);
204 spi->transmit(spi, (address & 0xFF00) >> 8);
205 spi->transmit(spi, (address & 0xFF));
206
207 for (int i = 0; i < 256; i++) {
208 data[i] = spi->transmit(spi, 0x0F);
209 }
210
211 cs.set(&cs);
212}
213
void(* set)(struct GPIOpin *)
Definition gpiopin.h:155
void(* reset)(struct GPIOpin *)
Definition gpiopin.h:156
Struct definition for a GPIO pin.
Definition gpiopin.h:151
uint16_t(* transmit)(struct SPI *, uint16_t)
SPI transmit method.
Definition spi.h:139
Struct definition for SPI interface. Provides the interface for API consumers to interact with the SP...
Definition spi.h:134
void(* readPage)(struct W25Q128 *, uint32_t, volatile uint8_t *)
Read page method.
Definition w25q128.h:37
int pageSize
Number of bytes per page.
Definition w25q128.h:34
void(* writePage)(struct W25Q128 *, uint32_t, uint8_t *)
Write page method.
Definition w25q128.h:38
GPIOpin_t cs
Chip select GPIO.
Definition w25q128.h:33
void(* erase)(struct W25Q128 *)
Chip erase method.
Definition w25q128.h:36
SPI_t * base
Parent SPI interface.
Definition w25q128.h:32
long pageCount
Total number of pages.
Definition w25q128.h:35
void _W25Q128_writeEnable(W25Q128_t *flash)
Send Write Enable instruction to the flash device.
Definition w25q128.c:51
void W25Q128_erase(W25Q128_t *)
Erase flash chip.
Definition w25q128.c:129
void W25Q128_readPage(W25Q128_t *, uint32_t, volatile uint8_t *)
Read from flash.
Definition w25q128.c:195
void _W25Q128_readStatus2(W25Q128_t *flash, uint8_t *status)
Read from Status Register 2.
Definition w25q128.c:88
void _W25Q128_readStatus3(W25Q128_t *flash, uint8_t *status)
Read from Status Register 3.
Definition w25q128.c:107
W25Q128_t W25Q128_init(W25Q128_t *flash, SPI_t *spi, GPIOpin_t cs)
Initialise flash struct.
Definition w25q128.c:23
void _W25Q128_readStatus1(W25Q128_t *flash, uint8_t *status)
Read from Status Register 1.
Definition w25q128.c:69
void W25Q128_writePage(W25Q128_t *, uint32_t, uint8_t *)
Write page to flash.
Definition w25q128.c:157