Da Vinci Firmware 1
Firmware for the DaVinci-M rocket avionics board.
Loading...
Searching...
No Matches
z_qflash_W25QXXX.c
Go to the documentation of this file.
1/*********************************************
2 * @file Z_QFLASH_W25QXXX.c
3 * @author mauro
4 * @date: 01 august 2024
5 * @version V.1.0.0
6 *
7 *********************************************
8 * this version of library uses QSPI port
9 * mode transmission
10 * this version of library uses QUADSPI flash mode
11 *********************************************
12 * it previously neets to setup
13 * configuration in Z_QFLASH_W25QXXX.h
14 *********************************************/
15
16
17#include "main.h"
18
19#include "z_qflash_W25QXXX.h"
20
21
22extern QSPI_HandleTypeDef FLASH_QSPI_PORT;
23
24static volatile uint8_t QSpiAvailable=1; // 0 if QuadSPI is busy; 1 if it is free (operation cplt); -1 if transmission error
25static volatile uint8_t QSpiReadDataAvailable=1; // 0 if QuadSPI is busy; 1 if it is free (operation cplt); -1 if transmission error
26
27
28
29/***********************************************
30 * @BRIEF It returns the status of the QSPI port
31 * @ingroup Winbond_Status
32 * @RETURN 1 QuadSPI port available
33 * 0 QuadSPI port busy
34 ***********************************************/
36 return QSpiAvailable;
37}
38
39
40
41
42/***********************************************
43 * @BRIEF Wait for a free QuadSPI port
44 * @ingroup Winbond_Status
45 * @PARAM timeout non 0 = time limit for data
46 * transfer complete
47 * 0 = indefinite waiting
48 ***********************************************/
50 uint32_t curtime = HAL_GetTick();
51
52 while ((!QSpiAvailable) && ((timeout==0) || ((HAL_GetTick()-curtime)<=timeout))) {};
53 if (!QSpiAvailable)
54 return HAL_ERROR;
55 return HAL_OK;
56};
57
58
59
60
61
62/***********************************************
63 * @BRIEF It returns the status of the QSPI
64 * receive command
65 * @ingroup Winbond_Status
66 * @RETURN 1 = data transmission completed:
67 * data requested is available
68 * 0 = data transmission still running
69 ***********************************************/
72}
73
74
75
76/***********************************************
77 * @BRIEF Wait for the completed data
78 * transfer (meaningless in polling
79 * mode
80 * @ingroup Winbond_Status
81 * @PARAM timeout non 0 = time limit for data
82 * transfer complete
83 * 0 = indefinite waiting
84 ***********************************************/
86 uint32_t curtime = HAL_GetTick();
87
88 while ((!QSpiReadDataAvailable) && ((timeout==0) || ((HAL_GetTick()-curtime)<=timeout))) {};
90 return HAL_ERROR;
91 return HAL_OK;
92};
93
94
95
96
97
98/************************************************
99 * @BRIEF Desault configuration
100 * of the "sCommand" parameters set
101 * for "HAL_QSPI_Command()"
102 * @ingroup Winbond_Init
103 * @PARAM SCommand parameters set to setup
104 ************************************************/
105void QFlash_DefaultCmd(QSPI_CommandTypeDef *sCommand) {
106
107 sCommand->InstructionMode = QFLASH_INSTRUCTION_MODE;
108 sCommand->AddressMode = QFLASH_ADDRESS_MODE;
109 sCommand->AddressSize = QFLASH_ADDRESS_SIZE;
110 sCommand->DataMode = QFLASH_DATA_MODE;
111 sCommand->AlternateByteMode = QFLASH_ALTERNATE_BYTE_MODE;
112 sCommand->DdrMode = QFLASH_DDR_MODE;
113 sCommand->DdrHoldHalfCycle = QFLASH_DDR_HOLD_HALF_CYCLE;
114 sCommand->SIOOMode = QFLASH_SIOO_MODE;
115 sCommand->DummyCycles = QFLASH_DUMMY_CYCLES;
116
117 return;
118}
119
120
121
122
123
124
125/******************************************************************
126 * @BRIEF Reset W25Q chip
127 * @ingroup Winbond_Init
128 ******************************************************************/
130 QSPI_CommandTypeDef sCommand = {0};
131
132 // send a "reset enable" command
133 QFlash_DefaultCmd(&sCommand);
134 sCommand.Instruction = W25_RESET_EN;
135 sCommand.AddressMode = QSPI_ADDRESS_NONE;
136 sCommand.DataMode = QSPI_DATA_NONE;
137
138#ifdef EXT_FLASH_QSPI_DMA_MODE
139 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
140#endif //EXT_FLASH_QSPI_DMA_MODE
141
142 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
143 return HAL_ERROR;
144 }
145 HAL_Delay(1); // 30us needed by resetting
146
147 // send a "reset" command
148 QFlash_DefaultCmd(&sCommand);
149 sCommand.Instruction = W25_RESET;
150 sCommand.AddressMode = QSPI_ADDRESS_NONE;
151 sCommand.DataMode = QSPI_DATA_NONE;
152
153#ifdef EXT_FLASH_QSPI_DMA_MODE
154 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
155#endif //EXT_FLASH_QSPI_DMA_MODE
156
157 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
158 return HAL_ERROR;
159 }
160 HAL_Delay(1); // 30us needed by resetting
161 return HAL_OK;
162
163}
164
165
166
167
168
169/******************************************************************
170 * @brief reads Jedec register
171 * @note "result[] string will contain:
172 * result[0] Jedec Manufacturer ID (0xEF means Winbond)
173 * result[1] Memory Type
174 * result[2] Capacity
175 ******************************************************************
176 * Memory Capacity code:
177 * 10H -> 5Mb 11H -> 10Mb 12H -> 20Mb
178 * 13H -> 40Mb 14H -> 80Mb 15H -> 16Mb
179 * 16H -> 32Mb 17H -> 64Mb 18H -> 128Mb
180 * 19H -> 256Mb 20H -> 512Mb 21H -> 1Gb
181 * @ingroup Winbond_Init
182 ******************************************************************/
184QSPI_CommandTypeDef sCommand = {0};
185
186 QFlash_DefaultCmd(&sCommand);
187 sCommand.Instruction = W25_JEDEC_ID;
188 sCommand.DataMode = QSPI_DATA_1_LINE;
189 sCommand.AddressMode = QSPI_ADDRESS_NONE;
190 sCommand.Address = 0;
191 sCommand.NbData = 3;
192 sCommand.DummyCycles = 0;
193
194#ifdef EXT_FLASH_QSPI_DMA_MODE
195 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
196 QSpiAvailable=0; //set QSPI busy
197 QSpiReadDataAvailable=0; //set data read unavailable yet
198 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
199 return HAL_ERROR;
200 }
201 if (HAL_QSPI_Receive_DMA(&FLASH_QSPI_PORT, dataptr) != HAL_OK) { // Receive data
202 return HAL_ERROR;
203 }
205#else
206 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
207 return HAL_ERROR;
208 }
209 if (HAL_QSPI_Receive(&FLASH_QSPI_PORT, dataptr, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
210 return HAL_ERROR;
211 }
212#endif //EXT_FLASH_QSPI_DMA_MODE
213
214 return HAL_OK;
215}
216
217
218
219
220/*********************************
221 * @brief reads SFDP register
222 * @ingroup Winbond_Init
223 * @RETURN 256byte SFDP register content:
224 *********************************/
226QSPI_CommandTypeDef sCommand = {0};
227
228 QFlash_DefaultCmd(&sCommand);
229 sCommand.Instruction = W25_R_SFPD_REG;
230 sCommand.DataMode = QSPI_DATA_1_LINE;
231 sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
232 sCommand.AddressSize = QSPI_ADDRESS_24_BITS;
233 sCommand.Address = 0;
234 sCommand.NbData = 256;
235 sCommand.DummyCycles = 8;
236
237#ifdef EXT_FLASH_QSPI_DMA_MODE
238 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
239 QSpiAvailable=0; //set QSPI busy
240 QSpiReadDataAvailable=0; //set data requested unavailable yet
241 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
242 return HAL_ERROR;
243 }
244 if (HAL_QSPI_Receive_DMA(&FLASH_QSPI_PORT, dataptr) != HAL_OK) { // Receive data
245 return HAL_ERROR;
246 }
248#else
249 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
250 return HAL_ERROR;
251 }
252 if (HAL_QSPI_Receive(&FLASH_QSPI_PORT, dataptr, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
253 return HAL_ERROR;
254 }
255#endif //EXT_FLASH_QSPI_DMA_MODE
256
257 return HAL_OK;
258}
259
260
261
262
263/******************************************************************
264 * @BRIEF reset memory chip, then
265 * read manufacutrer and device ID
266 * checking if the connected device is a Winbond Flash
267 * @ingroup Winbond_Init
268 ******************************************************************/
270uint8_t data[256];
271
272 HAL_Delay(6); // supposing init is called on system startup: 5 ms (tPUW) required after power-up to be fully available
273
274// reset the device (supposing it is a W25Q)
275 if (QFlash_Reset()!=HAL_OK)
276 return HAL_ERROR;
277
278// testing if an SFPD device is connected and working
279 for (uint8_t k=0;k!=3;k++)
280 data[k]=0xFF;
281 if (QFlash_ReadSFDP(data))
282 return HAL_ERROR;
283 if (!((data[0]=='S') && (data[1]=='F') && (data[2]=='D') && (data[3]=='P')))
284 if (!((data[0]=='S') && (data[2]=='F') && (data[5]=='D') && (data[7]=='P'))) //this is in case of dual flash configuration
285 return HAL_ERROR;
286
287//testing if it is a Winbond memory
288 if (QFlash_ReadJedecID(data)) //select the memSize byte
289 return HAL_ERROR;;
290 if (data[0] != 0xEF) // if ManufacturerID is not Winbond (0xEF)
291 return HAL_ERROR;
292
293 QSPI_CommandTypeDef sCmd_4byte = {0};
294 QFlash_DefaultCmd(&sCmd_4byte); // To get default instruction mode, etc.
295 sCmd_4byte.Instruction = W25_ENTER_4B_ADDR; // This is 0xB7
296 sCmd_4byte.AddressMode = QSPI_ADDRESS_NONE; // Correct, 0xB7 takes no address
297 sCmd_4byte.DataMode = QSPI_DATA_NONE; // Correct, 0xB7 has no data
298 sCmd_4byte.InstructionMode= QSPI_INSTRUCTION_1_LINE; // Correct, 0xB7 is a 1-line command
299 // DummyCycles, NbData, etc., default to 0 or are not relevant
300
301 // Handle QSpiAvailable if using DMA for this command
302 #ifdef EXT_FLASH_QSPI_DMA_MODE
304 // QSpiAvailable = 0; // Not strictly needed for a single HAL_QSPI_Command if it's blocking
305 // and not followed by DMA transmit/receive in THIS sequence.
306 // But good practice if other parts of the system rely on it.
307 #endif
308
309 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCmd_4byte, QFLASH_DEF_TIMEOUT) != HAL_OK) {
310 // #ifdef EXT_FLASH_QSPI_DMA_MODE
311 // QSpiAvailable = 1;
312 // #endif
313 return HAL_ERROR;
314 }
315
316
317#ifdef FLASH_QSPI_MEMORY_MAPPED
318// reset and tests are OK: enable memory mapped mode
319 if (QFlash_EnableMemoryMappedMode()==HAL_ERROR)
320 return HAL_ERROR;
321#endif //FLASH_QSPI_MEMORY_MAPPED
322
323 return HAL_OK; //return memSize as per table in Flash_ReadJedecID() definition
324}
325
326
327
328
329#ifdef FLASH_QSPI_MEMORY_MAPPED
330
331
332HAL_StatusTypeDef QFlash_EnableMemoryMappedMode(void) {
333 QSPI_CommandTypeDef sCommand = {0};
334 QSPI_MemoryMappedTypeDef sMemMappedCfg = {0};
335
336 // Setup reading command
337 QFlash_DefaultCmd(&sCommand);
338 sCommand.Instruction = QFLASH_READ_COMMAND;
339 sCommand.DummyCycles = QFLASH_READ_DUMMYC;
340 sCommand.AlternateBytes = QFLASH_ALT_BYTES;
341 sCommand.AlternateBytesSize = QFLASH_ALT_BYTES_S;
342 sCommand.AlternateByteMode = QFLASH_ALT_BYTES_M;
343
344 // Set memory-mapped mode CS and prefetch handling:
345 // timeout disabled: prefetch and CS always active
346 sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
347/*
348 // Set memory-mapped mode CS and prefetch handling
349 // timeout enabled: prefetch and CS disabled after 4 SPI clock cycles
350 sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_ENABLE;
351 sMemMappedCfg.TimeOutPeriod=4;
352*/
353
354
355#ifdef EXT_FLASH_QSPI_DMA_MODE
356 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
357#endif //EXT_FLASH_QSPI_DMA_MODE
358 if (HAL_QSPI_MemoryMapped(&FLASH_QSPI_PORT, &sCommand, &sMemMappedCfg) != HAL_OK) {
359 return HAL_ERROR;
360 }
361
362 return HAL_OK;
363}
364
365#else
366
367
368/**************************
369 * @BRIEF reads from Flash Eeprom
370 * using "communication mode" selected by
371 * command doesn't check for the BUSY flag in SR1
372 * that must be done before calling this function
373 * current version of library doesn't need it
374 * @PARAM addr EEPROM address to start reading
375 * data buffer to fill with read data
376 * dataSize number of bytes to read
377 * @ingroup Winbond_Memory
378 **************************/
379HAL_StatusTypeDef QFlash_Read(uint32_t address, uint8_t* buffer, uint32_t dataSize) {
380QSPI_CommandTypeDef sCommand = {0};
381
382 if (dataSize==0)
383 return HAL_OK;
384
385 QFlash_DefaultCmd(&sCommand);
386 sCommand.Instruction = QFLASH_READ_COMMAND;
387 sCommand.Address = address;
388 sCommand.NbData = dataSize;
389 sCommand.DummyCycles = QFLASH_READ_DUMMYC;
390 sCommand.AlternateBytes = QFLASH_ALT_BYTES;
391 sCommand.AlternateBytesSize = QFLASH_ALT_BYTES_S;
392 sCommand.AlternateByteMode = QFLASH_ALT_BYTES_M;
393
394#ifdef EXT_FLASH_QSPI_DMA_MODE
395 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
396 QSpiAvailable=0; //set QSPI busy
397 QSpiReadDataAvailable=0; //set data read unavailable yet
398 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
399 return HAL_ERROR;
400 }
401 if (HAL_QSPI_Receive_DMA(&FLASH_QSPI_PORT, buffer) != HAL_OK) { // Receive data
402 return HAL_ERROR;
403 }
404#ifdef FLASH_QSPI_WAIT_FOR_READING_COMPLETE
406#endif //FLASH_QSPI_WAIT_FOR_READING_COMPLETED
407
408#else
409 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
410 return HAL_ERROR;
411 }
412 if (HAL_QSPI_Receive(&FLASH_QSPI_PORT, buffer, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
413 return HAL_ERROR;
414 }
415#endif //EXT_FLASH_QSPI_DMA_MODE
416
417 return HAL_OK;
418}
419
420
426QSPI_CommandTypeDef sCommand = {0};
427
428
429//Send a "Write Enable" command
430 QFlash_DefaultCmd(&sCommand);
431 sCommand.Instruction = W25_W_ENABLE;
432 sCommand.DataMode = QSPI_DATA_NONE;
433 sCommand.AddressMode = QSPI_ADDRESS_NONE;
434
435#ifdef EXT_FLASH_QSPI_DMA_MODE
436 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
437#endif //EXT_FLASH_QSPI_DMA_MODE
438 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
439 return HAL_ERROR;
440 }
441
442/*
443//Wait for Write Enable bit set
444
445 QSPI_AutoPollingTypeDef sConfig;
446
447 QFlash_DefaultCmd(&sCommand);
448 sCommand.Instruction = W25_R_SR1;
449 sCommand.DataMode = QSPI_DATA_1_LINE;
450 sCommand.AddressMode = QSPI_ADDRESS_NONE;
451
452 sConfig.Mask = SR1_BIT_WEL;
453 sConfig.Match = 2;
454 sConfig.MatchMode = QSPI_MATCH_MODE_AND;
455 sConfig.StatusBytesSize = 1;
456 sConfig.Interval = 0x10;
457 sConfig.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
458
459 if (HAL_QSPI_AutoPolling(&FLASH_QSPI_PORT, &sCommand, &sConfig, QFLASH_BSY_TIMEOUT) != HAL_OK) {
460 return HAL_ERROR;
461 }
462*/
463
464 return HAL_OK;
465
466}
467
468
469
470
476 QSPI_CommandTypeDef sCommand = {0};
477
478 QFlash_DefaultCmd(&sCommand);
479 sCommand.Instruction = W25_W_DISABLE;
480 sCommand.DataMode = QSPI_DATA_NONE;
481 sCommand.AddressMode = QSPI_ADDRESS_NONE;
482
483#ifdef EXT_FLASH_QSPI_DMA_MODE
484 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
485#endif //EXT_FLASH_QSPI_DMA_MODE
486 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
487 return HAL_ERROR;
488 }
489
490 return HAL_OK;
491}
492
493
494
495
496
497/**********************************
498 * @BRIEF read STATUS REGISTER 1
499 * @PARAM dataptr points to a 1 byte registering the SR1 value
500 * @ingroup Winbond_Status
501 *********************************/
503QSPI_CommandTypeDef sCommand = {0};
504
505 QFlash_DefaultCmd(&sCommand);
506 sCommand.Instruction = W25_R_SR1;
507 sCommand.DataMode = QSPI_DATA_1_LINE;
508 sCommand.AddressMode = QSPI_ADDRESS_NONE;
509 sCommand.AddressSize = QSPI_ADDRESS_NONE;
510 sCommand.Address = 0x0;
511 sCommand.NbData = 1;
512
513#ifdef EXT_FLASH_QSPI_DMA_MODE
514 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
515 QSpiAvailable=0; //set QSPI busy
516 QSpiReadDataAvailable=0; //set data read unavailable yet
517 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
518 return HAL_ERROR;
519 }
520 if (HAL_QSPI_Receive_DMA(&FLASH_QSPI_PORT, dataptr) != HAL_OK) { // Receive data
521 return HAL_ERROR;
522 }
524#else
525 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
526 return HAL_ERROR;
527 }
528 if (HAL_QSPI_Receive(&FLASH_QSPI_PORT, dataptr, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
529 return HAL_ERROR;
530 }
531#endif //EXT_FLASH_QSPI_DMA_MODE
532
533 return HAL_OK;
534}
535
536
537
538
539
540/**********************************
541 * @BRIEF read STATUS REGISTER 2
542 * @PARAM dataptr points to a 1 byte registering the SR2 value
543 * @ingroup Winbond_Status
544 *********************************/
546
547QSPI_CommandTypeDef sCommand = {0};
548
549 QFlash_DefaultCmd(&sCommand);
550 sCommand.Instruction = W25_R_SR2;
551 sCommand.DataMode = QSPI_DATA_1_LINE;
552 sCommand.AddressMode = QSPI_ADDRESS_NONE;
553 sCommand.AddressSize = QSPI_ADDRESS_NONE;
554 sCommand.Address = 0x0;
555 sCommand.NbData = 1;
556
557#ifdef EXT_FLASH_QSPI_DMA_MODE
558 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
559 QSpiAvailable=0; //set QSPI busy
560 QSpiReadDataAvailable=0; //set data read unavailable yet
561 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
562 return HAL_ERROR;
563 }
564 if (HAL_QSPI_Receive_DMA(&FLASH_QSPI_PORT, dataptr) != HAL_OK) { // Receive data
565 return HAL_ERROR;
566 }
568#else
569 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
570 return HAL_ERROR;
571 }
572 if (HAL_QSPI_Receive(&FLASH_QSPI_PORT, dataptr, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
573 return HAL_ERROR;
574 }
575#endif //EXT_FLASH_QSPI_DMA_MODE
576
577 return HAL_OK;
578}
579
580
581
582
583
584/**********************************
585 * @BRIEF read STATUS REGISTER 3
586 * @PARAM dataptr points to a 1 byte registering the SR2 value
587 * @ingroup Winbond_Status
588 *********************************/
590QSPI_CommandTypeDef sCommand = {0};
591
592 QFlash_DefaultCmd(&sCommand);
593 sCommand.Instruction = W25_R_SR3;
594 sCommand.DataMode = QSPI_DATA_1_LINE;
595 sCommand.AddressMode = QSPI_ADDRESS_NONE;
596 sCommand.AddressSize = QSPI_ADDRESS_NONE;
597 sCommand.Address = 0x0;
598 sCommand.NbData = 1;
599
600#ifdef EXT_FLASH_QSPI_DMA_MODE
601 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
602 QSpiAvailable=0; //set QSPI busy
603 QSpiReadDataAvailable=0; //set data read unavailable yet
604 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
605 return HAL_ERROR;
606 }
607 if (HAL_QSPI_Receive_DMA(&FLASH_QSPI_PORT, dataptr) != HAL_OK) { // Receive data
608 return HAL_ERROR;
609 }
611#else
612 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
613 return HAL_ERROR;
614 }
615 if (HAL_QSPI_Receive(&FLASH_QSPI_PORT, dataptr, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
616 return HAL_ERROR;
617 }
618#endif //EXT_FLASH_QSPI_DMA_MODE
619
620 return HAL_OK;
621}
622
623
624
625
626
632 QSPI_CommandTypeDef sCommand = {0};
633
634 if (QFlash_WriteEnable())
635 return HAL_ERROR;
636
637 QFlash_DefaultCmd(&sCommand);
638 sCommand.Instruction = W25_W_SR2;
639 sCommand.DataMode = QSPI_DATA_1_LINE;
640 sCommand.AddressMode = QSPI_ADDRESS_NONE;
641 sCommand.AddressSize = QSPI_ADDRESS_NONE;
642 sCommand.Address = 0x0;
643 sCommand.NbData = 1;
644
645#ifdef EXT_FLASH_QSPI_DMA_MODE
646 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
647 QSpiAvailable=0; //set QSPI busy
648 QSpiReadDataAvailable=0; //set data read unavailable yet
649 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
650 return HAL_ERROR;
651 }
652 if (HAL_QSPI_Transmit_DMA(&FLASH_QSPI_PORT, &data) != HAL_OK) { // Receive data
653 return HAL_ERROR;
654 }
655#else
656 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
657 return HAL_ERROR;
658 }
659 if (HAL_QSPI_Transmit(&FLASH_QSPI_PORT, &data, QFLASH_DEF_TIMEOUT) != HAL_OK) {
660 return HAL_ERROR;
661 }
662#endif //EXT_FLASH_QSPI_DMA_MODE
663
665
666 return HAL_OK;
667}
668
669
670
671
677 QSPI_CommandTypeDef sCommand = {0};
678
679 if (QFlash_WriteEnable())
680 return HAL_ERROR;
681
682 QFlash_DefaultCmd(&sCommand);
683 sCommand.Instruction = W25_W_SR3;
684 sCommand.DataMode = QSPI_DATA_1_LINE;
685 sCommand.AddressMode = QSPI_ADDRESS_NONE;
686 sCommand.AddressSize = QSPI_ADDRESS_NONE;
687 sCommand.Address = 0x0;
688 sCommand.NbData = 1;
689
690#ifdef EXT_FLASH_QSPI_QDMA_MODE
691 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
692 QSpiAvailable=0; //set QSPI busy
693 QSpiReadDataAvailable=0; //set data read unavailable yet
694 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
695 return HAL_ERROR;
696 }
697 if (HAL_QSPI_Transmit_DMA(&FLASH_QSPI_PORT, &data) != HAL_OK) { // Receive data
698 return HAL_ERROR;
699 }
700#else
701 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
702 return HAL_ERROR;
703 }
704 if (HAL_QSPI_Transmit(&FLASH_QSPI_PORT, &data, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
705 return HAL_ERROR;
706 }
707#endif //EXT_FLASH_QSPI_DMA_MODE
708
710
711 return HAL_OK;
712}
713
714
715
716
717
718
719/*********************************
720 * @brief checks register 1
721 * @note just a funcion testing Status Register 1 reading It verifies flash is not busy and not write-enabled
722 * @ingroup Winbond_Status
723 *********************************/
725 HAL_StatusTypeDef result = HAL_OK;
726 uint8_t sr;
727
728 QFlash_ReadSR1(&sr);
729
730//bitwise test of the SR1 content
731 if (!((sr & 1)==0)) { //why flash is busy? It shouldn't
732 result=HAL_ERROR;
733 } else if (!((sr & 2)==0)) { //if write_enabled, disable it
735 HAL_Delay(1);
736 QFlash_ReadSR1(&sr);
737 if (!((sr & 2)==0)){ //why flash is still writeable? It shouldn't
738 result=HAL_ERROR;
739 }
740 }
741 return result;
742}
743
744
745
746
747
748
749
750
751
752
753
754
755
756/**************************
757 * @BRIEF keeps looping inside this function until "BUSY" bit in SR1 register
758 * becomes 0, meaning that the runnin data operation (writing or erasing)
759 * on the chip, ended
760 * @ingroup Winbond_Status
761 **************************/
763 QSPI_CommandTypeDef sCommand = {0};
764
765
766/* using HAL_QSPI_AutoPolling()*/
767
768QSPI_AutoPollingTypeDef sConfig;
769
770QFlash_DefaultCmd(&sCommand);
771 sCommand.Instruction = W25_R_SR1;
772 sCommand.AddressMode = QSPI_ADDRESS_NONE;
773 sCommand.DataMode = QSPI_DATA_1_LINE;
774
775 sConfig.Mask = SR1_BIT_BSY;
776 sConfig.Match = 0;
777 sConfig.MatchMode = QSPI_MATCH_MODE_AND;
778 sConfig.StatusBytesSize = 1;
779 sConfig.Interval = 0x10;
780 sConfig.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE;
781
782#ifdef EXT_FLASH_QSPI_DMA_MODE
783 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
784#endif //EXT_FLASH_QSPI_DMA_MODE
785
786 if (HAL_QSPI_AutoPolling(&FLASH_QSPI_PORT, &sCommand, &sConfig, QFLASH_BSY_TIMEOUT) != HAL_OK) {
787 return HAL_ERROR;
788 }
789
790/* alternative implementation "SPI style"
791 * looping, directly reading Status Register 1
792 * until Busy flag resets
793 * (k just count loops)
794 */
795/*
796 uint8_t sr;
797 uint32_t k=0;
798 do {
799 sr=QFlash_ReadSR1();
800 sr=(sr & 1);
801 k+=1;
802 } while (sr);
803
804*/
805
806 return HAL_OK;
807
808}
809
810
811
812
813
814
815
816/***********************************************************************
817 * @BRIEF it writes into a single FLASH page
818 * function doesn't check for the BUSY flag in SR1
819 * function doesn't check for the EEPROM writing enabled
820 * function doesn't wait for the writing complete
821 * function doesn't check for the EEPROM page boundary override
822 * @PARAM addr EEPROM address to start writing
823 * data buffer containing data to write into EEPROM
824 * dataSize number of bytes to write
825 * @ingroup Winbond_Memory
826 ***********************************************************************/
827HAL_StatusTypeDef QFlash_WriteASinglePage(uint32_t addr, uint8_t* dataptr, uint32_t dataSize){
828 QSPI_CommandTypeDef sCommand = {0};
829
830 QFlash_DefaultCmd(&sCommand);
831 if (!dataSize)
832 return HAL_OK;
833
834 sCommand.Instruction = QFLASH_WRITE_COMMAND;
835 sCommand.AddressMode = QSPI_ADDRESS_1_LINE; //TODO EVENTUALMENTE RICOMMENTA
836 sCommand.DataMode = QFLASH_WDATA_MODE;
837 sCommand.NbData = dataSize;
838 sCommand.Address = addr;
839
840#ifdef EXT_FLASH_QSPI_DMA_MODE
841 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
842 QSpiAvailable=0; //set QSPI busy
843 QSpiReadDataAvailable=0; //set data read unavailable yet
844 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
845 return HAL_ERROR;
846 }
847 if (HAL_QSPI_Transmit_DMA(&FLASH_QSPI_PORT, dataptr) != HAL_OK) { // Receive data
848 return HAL_ERROR;
849 }
850#else
851 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
852 return HAL_ERROR;
853 }
854 if (HAL_QSPI_Transmit(&FLASH_QSPI_PORT, dataptr, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
855 return HAL_ERROR;
856 }
857#endif //EXT_FLASH_QSPI_DMA_MODE
858 return HAL_OK;
859}
860
861
862
863
864/**********************************************************************
865 * @BRIEF function writing into EEPROM
866 * Handling "write enable" commands
867 * It splits (if needed) received data into the single pages,
868 * lounching writing sessions for each page
869 * and waiting the writing complete each time
870 * @PARAM addr EEPROM address to start writing
871 * data buffer containing data to write into EEPROM
872 * dataSize number of bytes to write
873 * @ingroup Winbond_Memory
874 ***********************************************************************/
875HAL_StatusTypeDef QFlash_Write(uint32_t addr, uint8_t* data, uint32_t dataSize){
876uint32_t quota;
877uint32_t inpage_addr;
878
879 if (dataSize==0)
880 return HAL_OK;
881
882 // quota is the data size transferred until now
883 quota=0;
884
885 // define the starting write position inside the first Flash page to write...
886 inpage_addr=addr & (EXT_FLASH_PAGE_SIZE-1);
887
888 // ... so I can detect if more than 1 Flash page has still to be written
889 while ((dataSize-quota+inpage_addr)>EXT_FLASH_PAGE_SIZE){
890 //loop here, writing separate flash pages...
891
892 if (QFlash_WriteEnable())
893 return HAL_ERROR;
894 if (QFlash_WriteASinglePage(addr+quota,data+quota,EXT_FLASH_PAGE_SIZE-inpage_addr))
895 return HAL_ERROR;
896
897 quota+=(EXT_FLASH_PAGE_SIZE-inpage_addr);
898 if(quota>=67108864 - 211200){
899 __asm("nop");
900 }
901 // having aligned data to page border on the first writing
902 // next writings start from 0 position inside a page
903 inpage_addr=0;
905 }
906 // now just write the last Flash page...
907 if (dataSize-quota) { // ... if any
908
909 if (QFlash_WriteEnable())
910 return HAL_ERROR;
911 if (QFlash_WriteASinglePage(addr+quota,data+quota,dataSize-quota))
912 return HAL_ERROR;
914 }
915 return HAL_OK;
916}
917
918
919
920
921/**********************************
922 * @BRIEF Erase to 0XFF all bytes in a 4k block
923 * 4k block bounary is 0x1000, that means:
924 * 0x1000, 0x2000, 0x3000, ...
925 * waiting the writing complete in each page
926 * @PARAM addr starting erase address
927 * (it must be a 4k sector boundary)
928 * @ingroup Winbond_Memory
929 *********************************/
931 QSPI_CommandTypeDef sCommand = {0};
932
933 QFlash_DefaultCmd(&sCommand);
935 return HAL_ERROR;
936 if (QFlash_WriteEnable())
937 return HAL_ERROR;
938 sCommand.Instruction = W25_S_ERASE4K_4B;
939 sCommand.DataMode = QSPI_DATA_NONE;
940 sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
941 sCommand.NbData = 0;
942 sCommand.Address = addr;
943
944#ifdef EXT_FLASH_QSPI_DMA_MODE
945 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
946#endif //EXT_FLASH_QSPI_DMA_MODE
947 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
948 return HAL_ERROR;
949 }
950
952 return HAL_ERROR;
953 return HAL_OK;
954}
955
956
957
958
959/**********************************
960 * @BRIEF Erase to 0XFF all bytes in a 32k block
961 * 32k block bounary is 0x08000, that means:
962 * 0x008000, 0x010000, 0x018000, ...
963 * waiting the writing complete in each page
964 * @PARAM addr starting erase address
965 * (it must be a 32k block boundary)
966 * @ingroup Winbond_Memory
967 *********************************/
969 QSPI_CommandTypeDef sCommand = {0};
970
971 QFlash_DefaultCmd(&sCommand);
973 return HAL_ERROR;
974 if (QFlash_WriteEnable())
975 return HAL_ERROR;
976 sCommand.Instruction = W25_B_ERASE32K;
977 sCommand.DataMode = QSPI_DATA_NONE;
978 sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
979 sCommand.NbData = 0;
980 sCommand.Address = addr;
981
982#ifdef EXT_FLASH_QSPI_DMA_MODE
983 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
984#endif //EXT_FLASH_QSPI_DMA_MODE
985
986 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
987 return HAL_ERROR;
988 }
989
991 return HAL_ERROR;
992 return HAL_OK;
993}
994
995
996
997
998
999/**********************************
1000 * @BRIEF Erase to 0XFF all bytes in a 64k block
1001 * 64k block bounary is 0x08000, that means:
1002 * 0x010000, 0x020000, 0x030000, ...
1003 * waiting the writing complete in each page
1004 * @PARAM addr starting erase address
1005 * (it must be a 64k block boundary)
1006 * @ingroup Winbond_Memory
1007 *********************************/
1009 QSPI_CommandTypeDef sCommand = {0};
1010
1011 QFlash_DefaultCmd(&sCommand);
1013 return HAL_ERROR;
1014 if (QFlash_WriteEnable())
1015 return HAL_ERROR;
1016 sCommand.Instruction = W25_B_ERASE64K_4B;
1017 sCommand.DataMode = QSPI_DATA_NONE;
1018 sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
1019 sCommand.NbData = 0;
1020 sCommand.Address = addr;
1021
1022#ifdef EXT_FLASH_QSPI_DMA_MODE
1023 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
1024#endif //EXT_FLASH_QSPI_DMA_MODE
1025
1026 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
1027 return HAL_ERROR;
1028 }
1029
1031 return HAL_ERROR;
1032 return HAL_OK;
1033}
1034
1035
1036
1037
1038/**********************************
1039 * @BRIEF Full chip erase to 0XFF
1040 * Chip Erase may need up to 100s
1041 * (typ. 20s)
1042 * waiting the writing complete in each page
1043 * @ingroup Winbond_Memory
1044 *********************************/
1046 QSPI_CommandTypeDef sCommand = {0};
1047
1048 QFlash_DefaultCmd(&sCommand);
1050 return HAL_ERROR;
1051
1052 if (QFlash_WriteEnable())
1053 return HAL_ERROR;
1054 sCommand.Instruction = W25_CH_ERASE;
1055 sCommand.DataMode = QSPI_DATA_NONE;
1056 sCommand.AddressMode = QSPI_ADDRESS_NONE;
1057
1058#ifdef EXT_FLASH_QSPI_DMA_MODE
1059 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
1060#endif //EXT_FLASH_QSPI_DMA_MODE
1061
1062 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
1063 return HAL_ERROR;
1064 }
1065
1067 return HAL_ERROR;
1068 return HAL_OK;
1069}
1070
1071
1072
1073
1074
1075/**********************************
1076 * @BRIEF Initiates a powerdown
1077 * after a powerDown only accepted a porweUp command
1078 * opwerDown operation is 3us long
1079 * @ingroup Winbond_Status
1080 *********************************/
1082 QSPI_CommandTypeDef sCommand = {0};
1083
1084 QFlash_DefaultCmd(&sCommand);
1086 return HAL_ERROR;
1087 sCommand.Instruction = W25_POWERDOWN;
1088 sCommand.DataMode = QSPI_DATA_NONE;
1089 sCommand.AddressMode = QSPI_ADDRESS_NONE;
1090
1091#ifdef EXT_FLASH_QSPI_DMA_MODE
1092 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
1093#endif //EXT_FLASH_QSPI_DMA_MODE
1094
1095 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
1096 return HAL_ERROR;
1097 }
1098
1099 return HAL_OK;
1100}
1101
1102
1103
1104
1105
1106
1107
1108/**********************************
1109 * @BRIEF Release from powerdown (3 us to restart) or read device ID
1110 * @ingroup Winbond_Status
1111 *********************************/
1113 QSPI_CommandTypeDef sCommand = {0};
1114
1115 QFlash_DefaultCmd(&sCommand);
1117 return HAL_ERROR;
1118 sCommand.Instruction = W25_POWERUP_ID;
1119 sCommand.DataMode = QSPI_DATA_NONE;
1120 sCommand.AddressMode = QSPI_ADDRESS_NONE;
1121
1122#ifdef EXT_FLASH_QSPI_DMA_MODE
1123 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
1124#endif //EXT_FLASH_QSPI_DMA_MODE
1125
1126 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
1127 return HAL_ERROR;
1128 }
1129
1130 return HAL_OK;
1131}
1132
1133
1134
1135
1136/**********************************
1137 * @BRIEF read device id from chip
1138 * @PARAM dataptr receives Device ID
1139 * @ingroup Winbond_Init
1140 *********************************/
1142QSPI_CommandTypeDef sCommand = {0};
1143
1144 QFlash_DefaultCmd(&sCommand);
1145 sCommand.Instruction = W25_POWERUP_ID;
1146 sCommand.DataMode = QSPI_DATA_1_LINE;
1147 sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
1148 sCommand.AddressSize = QSPI_ADDRESS_24_BITS; // I need to send 3 dummy bytes avter command
1149 sCommand.Address = 0;
1150 sCommand.NbData = 1; //after 3 dummy bytes I can read the Device ID
1151 sCommand.DummyCycles = 0;
1152
1153#ifdef EXT_FLASH_QSPI_DMA_MODE
1154 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
1155 QSpiAvailable=0; //set QSPI busy
1156 QSpiReadDataAvailable=0; //set data read unavailable yet
1157 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
1158 return HAL_ERROR;
1159 }
1160 if (HAL_QSPI_Receive_DMA(&FLASH_QSPI_PORT, dataptr) != HAL_OK) { // Receive data
1161 return HAL_ERROR;
1162 }
1164#else
1165 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
1166 return HAL_ERROR;
1167 }
1168 if (HAL_QSPI_Receive(&FLASH_QSPI_PORT, dataptr, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
1169 return HAL_ERROR;
1170 }
1171#endif //EXT_FLASH_QSPI_DMA_MODE
1172
1173 return HAL_OK;
1174}
1175
1176
1177
1178
1184QSPI_CommandTypeDef sCommand = {0};
1185
1186 QFlash_DefaultCmd(&sCommand);
1187 sCommand.Instruction = W25_MAN_DEVICE_ID;
1188 sCommand.DataMode = QSPI_DATA_1_LINE;
1189 sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
1190 sCommand.AddressSize = QSPI_ADDRESS_24_BITS; // I need to send 3 dummy bytes avter command
1191 sCommand.Address = 0;
1192 sCommand.NbData = 2; //after 3 dummy bytes I can read the Device ID
1193 sCommand.DummyCycles = 0;
1194
1195#ifdef EXT_FLASH_QSPI_DMA_MODE
1196 while (!QSpiAvailable) {}; // waiting for a free QSPI port.
1197 QSpiAvailable=0; //set QSPI busy
1198 QSpiReadDataAvailable=0; //set data read unavailable yet
1199 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
1200 return HAL_ERROR;
1201 }
1202 if (HAL_QSPI_Receive_DMA(&FLASH_QSPI_PORT, (uint8_t *) dataptr) != HAL_OK) { // Receive data
1203 return HAL_ERROR;
1204 }
1206#else
1207 if (HAL_QSPI_Command(&FLASH_QSPI_PORT, &sCommand, QFLASH_DEF_TIMEOUT) != HAL_OK) { //Send command
1208 return HAL_ERROR;
1209 }
1210 if (HAL_QSPI_Receive(&FLASH_QSPI_PORT, (uint8_t *) dataptr, QFLASH_DEF_TIMEOUT) != HAL_OK) { // Receive data
1211 return HAL_ERROR;
1212 }
1213#endif //EXT_FLASH_QSPI_DMA_MODE
1214
1215 return HAL_OK;
1216}
1217
1218
1219#endif //FLASH_QSPI_MEMORY_MAPPED
1220
1221
1222
1223/**************************************
1224 * functions required for TouchGFX
1225 * integration
1226 **************************************/
1227
1228
1230// nothing to do, being reading always in polling mode
1231 return;
1232}
1233
1234void DataReader_ReadData(uint32_t address24, uint8_t* buffer, uint32_t length){
1235#ifdef FLASH_QSPI_MEMORY_MAPPED
1236 memcpy(buffer, (void *)0x90000000+address24, length);
1237#else
1238 QFlash_Read(address24, buffer, length);
1239#endif //FLASH_QSPI_MEMORY_MAPPED
1240}
1241
1242
1243void DataReader_StartDMAReadData(uint32_t address24, uint8_t* buffer, uint32_t length){
1244//currently using polling mode
1245#ifdef FLASH_QSPI_MEMORY_MAPPED
1246 memcpy(buffer, (void *)0x90000000+address24, length);
1247#else
1248 QFlash_Read(address24, buffer, length);
1249#endif //FLASH_QSPI_MEMORY_MAPPED
1250}
1251
1252
1253void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *l_hqspi) {
1254 if (l_hqspi==&FLASH_QSPI_PORT) {
1255 QSpiAvailable=1; //set QuadSPI port available flag
1256 }
1257}
1258
1259
1260void HAL_QSPI_RxCpltCallback (QSPI_HandleTypeDef *l_hqspi){
1261 if (l_hqspi==&FLASH_QSPI_PORT) {
1262 QSpiAvailable=1; //set QuadSPI port available
1263 QSpiReadDataAvailable=1; //set data requested available flag
1264 }
1265}
1266
1267
1268void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *l_hqspi) {
1269 if (l_hqspi==&FLASH_QSPI_PORT) {
1270 QSpiAvailable=1; //set QuadSPI port available flag
1271 }
1272}
1273
1274
1275/************************************************************
1276 * @BRIEF set to -1 global QSPI port availability flag
1277 * in case of reading data, set to -1 even
1278 * the Data availability flag
1279 * @ingroup Winbond_Status
1280 ************************************************************/
1281void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *l_hqspi){
1282 if (l_hqspi==&FLASH_QSPI_PORT) {
1283 QSpiAvailable=-1; //set QuadSPI port error
1284 if (!QSpiReadDataAvailable) //if a data reading is running
1285 QSpiReadDataAvailable=-1; //notify the data reading failed
1286 }
1287}
1288
void HAL_QSPI_TxCpltCallback(QSPI_HandleTypeDef *l_hqspi)
void HAL_QSPI_CmdCpltCallback(QSPI_HandleTypeDef *l_hqspi)
void HAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef *l_hqspi)
void HAL_QSPI_ErrorCallback(QSPI_HandleTypeDef *l_hqspi)
#define EXT_FLASH_PAGE_SIZE
256 bytes per programmable page.
HAL_StatusTypeDef QFlash_Reset()
HAL_StatusTypeDef QFlash_ReadSR3(uint8_t *dataptr)
HAL_StatusTypeDef QFlash_PowerDown()
HAL_StatusTypeDef QFlash_ReadSR2(uint8_t *dataptr)
HAL_StatusTypeDef QFlash_CheckSR1()
HAL_StatusTypeDef QFlash_PowerUp()
HAL_StatusTypeDef QFlash_ReadSR1(uint8_t *dataptr)
HAL_StatusTypeDef QFlash_WaitForWritingComplete()
HAL_StatusTypeDef QFlash_ReadDevID(uint8_t *dataptr)
HAL_StatusTypeDef QFlash_ReadManufactutrerAndDevID(uint16_t *dataptr)
read id of the winbond
HAL_StatusTypeDef QFlash_ReadJedecID(uint8_t *dataptr)
HAL_StatusTypeDef QFlash_ReadSFDP(uint8_t *dataptr)
HAL_StatusTypeDef QFlash_Init()
#define QFLASH_DEF_TIMEOUT
#define W25_POWERDOWN
#define QFLASH_INSTRUCTION_MODE
#define SR1_BIT_BSY
#define W25_ENTER_4B_ADDR
#define QFLASH_WRITE_COMMAND
#define W25_RESET_EN
#define W25_B_ERASE32K
#define QFLASH_ADDRESS_SIZE
#define QFLASH_ALTERNATE_BYTE_MODE
#define W25_R_SR1
#define W25_R_SFPD_REG
#define W25_POWERUP_ID
#define QFLASH_READ_DUMMYC
#define W25_MAN_DEVICE_ID
#define QFLASH_ADDRESS_MODE
#define QFLASH_DUMMY_CYCLES
#define W25_JEDEC_ID
#define W25_RESET
#define W25_W_DISABLE
#define QFLASH_DATA_MODE
#define W25_B_ERASE64K_4B
#define QFLASH_READ_COMMAND
#define QFLASH_SIOO_MODE
#define W25_W_SR3
#define QFLASH_ALT_BYTES_M
#define QFLASH_ALT_BYTES
#define QFLASH_ALT_BYTES_S
#define QFLASH_DDR_HOLD_HALF_CYCLE
#define W25_CH_ERASE
#define W25_W_SR2
#define W25_R_SR3
#define QFLASH_BSY_TIMEOUT
#define W25_S_ERASE4K_4B
#define W25_W_ENABLE
#define QFLASH_DDR_MODE
#define W25_R_SR2
#define QFLASH_WDATA_MODE
HAL_StatusTypeDef QFlash_BErase32k(uint32_t addr)
HAL_StatusTypeDef QFlash_SErase4k(uint32_t addr)
HAL_StatusTypeDef QFlash_BErase64k(uint32_t addr)
HAL_StatusTypeDef QFlash_ChipErase()
HAL_StatusTypeDef QFlash_Write(uint32_t addr, uint8_t *data, uint32_t dataSize)
HAL_StatusTypeDef QFlash_Read(uint32_t address, uint8_t *buffer, uint32_t dataSize)
HAL_StatusTypeDef QFlash_WaitForDataAvailable(uint32_t timeout)
HAL_StatusTypeDef QFlash_WaitForQSPIAvailable(uint32_t timeout)
HAL_StatusTypeDef QFlash_WriteSR2(uint8_t data)
writes to register 2
uint8_t QFlash_IsQSPIAvailable()
void QFlash_DefaultCmd(QSPI_CommandTypeDef *sCommand)
HAL_StatusTypeDef QFlash_WriteDisable()
disables writes
HAL_StatusTypeDef QFlash_WriteSR3(uint8_t data)
writes to register 3
uint8_t QFlash_IsDataAvailable()
HAL_StatusTypeDef QFlash_WriteEnable()
enables writes
void DataReader_ReadData(uint32_t address24, uint8_t *buffer, uint32_t length)
void DataReader_WaitForReceiveDone()
void DataReader_StartDMAReadData(uint32_t address24, uint8_t *buffer, uint32_t length)
: Header for main.c file. This file contains the common defines of the application.
static volatile uint8_t QSpiAvailable
static volatile uint8_t QSpiReadDataAvailable
QSPI_HandleTypeDef FLASH_QSPI_PORT
HAL_StatusTypeDef QFlash_WriteASinglePage(uint32_t addr, uint8_t *dataptr, uint32_t dataSize)
Driver for W25Qxxx series Quad-SPI NOR Flash memory.
HAL_StatusTypeDef
HAL Status structures definition.
@ HAL_ERROR
@ HAL_OK