sqiflash  2.0.0.0
sqiflash.h
Go to the documentation of this file.
1 /****************************************************************************
2 ** Copyright (C) 2020 MikroElektronika d.o.o.
3 ** Contact: https://www.mikroe.com/contact
4 **
5 ** Permission is hereby granted, free of charge, to any person obtaining a copy
6 ** of this software and associated documentation files (the "Software"), to deal
7 ** in the Software without restriction, including without limitation the rights
8 ** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 ** copies of the Software, and to permit persons to whom the Software is
10 ** furnished to do so, subject to the following conditions:
11 ** The above copyright notice and this permission notice shall be
12 ** included in all copies or substantial portions of the Software.
13 **
14 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
16 ** OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18 ** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
19 ** OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20 ** USE OR OTHER DEALINGS IN THE SOFTWARE.
21 ****************************************************************************/
22 
28 #ifndef SQIFLASH_H
29 #define SQIFLASH_H
30 
31 #ifdef __cplusplus
32 extern "C"{
33 #endif
34 
39 #ifdef PREINIT_SUPPORTED
40 #include "preinit.h"
41 #endif
42 
43 #ifdef MikroCCoreVersion
44  #if MikroCCoreVersion >= 1
45  #include "delays.h"
46  #endif
47 #endif
48 
49 #include "drv_digital_out.h"
50 #include "drv_digital_in.h"
51 #include "drv_spi_master.h"
52 #include "spi_specifics.h"
53 
74 #define SQIFLASH_STATUS_WEL 0x02
75 #define SQIFLASH_STATUS_WSE 0x04
76 #define SQIFLASH_STATUS_WSP 0x08
77 #define SQIFLASH_STATUS_WPLD 0x10
78 #define SQIFLASH_STATUS_SEC 0x20
79 #define SQIFLASH_STATUS_RES 0x40
80 #define SQIFLASH_STATUS_BUSY 0x80
81 #define SQIFLASH_CFG_RES 0x01
82 #define SQIFLASH_CFG_IOC 0x02
83 #define SQIFLASH_CFG_BPNV 0x08
84 #define SQIFLASH_CFG_WPEN 0x80
85 
90 #define SQIFLASH_INSTR_NOP 0x00
91 #define SQIFLASH_INSTR_RSTEN 0x66
92 #define SQIFLASH_INSTR_RST 0x99
93 #define SQIFLASH_INSTR_EQIO 0x38
94 #define SQIFLASH_INSTR_RSTQIO 0xFF
95 #define SQIFLASH_INSTR_RDSR 0x05
96 #define SQIFLASH_INSTR_WRSR 0x01
97 #define SQIFLASH_INSTR_RDCR 0x35
98 #define SQIFLASH_INSTR_READ 0x03
99 #define SQIFLASH_INSTR_HS_READ 0x0B
100 #define SQIFLASH_INSTR_SQOR 0x6B
101 #define SQIFLASH_INSTR_SQIOR 0xEB
102 #define SQIFLASH_INSTR_SDOR 0x3B
103 #define SQIFLASH_INSTR_SDIOR 0xBB
104 #define SQIFLASH_INSTR_SB 0xC0
105 #define SQIFLASH_INSTR_RBSQI 0x0C
106 #define SQIFLASH_INSTR_RBSPI 0xEC
107 #define SQIFLASH_INSTR_JEDECID 0x9F
108 #define SQIFLASH_INSTR_QUAD_JID 0xAF
109 #define SQIFLASH_INSTR_SFDP 0x5A
110 #define SQIFLASH_INSTR_WREN 0x06
111 #define SQIFLASH_INSTR_WRDI 0x04
112 #define SQIFLASH_INSTR_SE 0x20
113 #define SQIFLASH_INSTR_BE 0xD8
114 #define SQIFLASH_INSTR_CE 0xC7
115 #define SQIFLASH_INSTR_PP 0x02
116 #define SQIFLASH_INSTR_SPI_QUAD 0x32
117 #define SQIFLASH_INSTR_WRSU 0xB0
118 #define SQIFLASH_INSTR_WRRE 0x30
119 #define SQIFLASH_INSTR_RBPR 0x72
120 #define SQIFLASH_INSTR_WBPR 0x42
121 #define SQIFLASH_INSTR_LBPR 0x8D
122 #define SQIFLASH_INSTR_NVWLDR 0xE8
123 #define SQIFLASH_INSTR_ULBPR 0x98
124 #define SQIFLASH_INSTR_RSID 0x88
125 #define SQIFLASH_INSTR_PSID 0xA5
126 #define SQIFLASH_INSTR_LSID 0x85
127 #define SQIFLASH_START_PAGE_ADDRESS 0x010000ul
128 #define SQIFLASH_END_PAGE_ADDRESS 0x7FFFFFul
129 #define SQIFLASH_FLASH_PAGE_SIZE 256
130 
139 #define SQIFLASH_SET_DATA_SAMPLE_EDGE SET_SPI_DATA_SAMPLE_EDGE
140 #define SQIFLASH_SET_DATA_SAMPLE_MIDDLE SET_SPI_DATA_SAMPLE_MIDDLE
141  // sqiflash_set
143 
158 #define SQIFLASH_MAP_MIKROBUS( cfg, mikrobus ) \
159  cfg.miso = MIKROBUS( mikrobus, MIKROBUS_MISO ); \
160  cfg.mosi = MIKROBUS( mikrobus, MIKROBUS_MOSI ); \
161  cfg.sck = MIKROBUS( mikrobus, MIKROBUS_SCK ); \
162  cfg.cs = MIKROBUS( mikrobus, MIKROBUS_CS ); \
163  cfg.sq3 = MIKROBUS( mikrobus, MIKROBUS_RST ); \
164  cfg.sq2 = MIKROBUS( mikrobus, MIKROBUS_PWM )
165  // sqiflash_map // sqiflash
168 
173 typedef struct
174 {
175  // Output pins
176  digital_out_t sq3;
177  digital_out_t sq2;
179  // Modules
180  spi_master_t spi;
182  pin_name_t chip_select;
184 } sqiflash_t;
185 
190 typedef struct
191 {
192  // Communication gpio pins
193  pin_name_t miso;
194  pin_name_t mosi;
195  pin_name_t sck;
196  pin_name_t cs;
198  // Additional gpio pins
199  pin_name_t sq3;
200  pin_name_t sq2;
202  // static variable
203  uint32_t spi_speed;
204  spi_master_mode_t spi_mode;
205  spi_master_chip_select_polarity_t cs_polarity;
208 
213 typedef enum
214 {
216  SQIFLASH_ERROR = -1
217 
219 
236 
250 
264 err_t sqiflash_generic_write ( sqiflash_t *ctx, uint8_t reg, uint8_t *data_in, uint8_t len );
265 
279 err_t sqiflash_generic_read ( sqiflash_t *ctx, uint8_t reg, uint8_t *data_out, uint8_t len );
280 
290 uint8_t sqiflash_busy ( sqiflash_t *ctx );
291 
301 
310 
320 
330 
340 
351 
361 
370 
379 
387 
396 
420 
421 
445 
455 void sqiflash_spi_get_security_id ( sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count );
456 
466 void sqiflash_sqi_get_security_id ( sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count );
467 
482 void sqiflash_set_security_id ( sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count );
483 
494 
506 void sqiflash_spi_get_bpr ( sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count );
507 
519 void sqiflash_sqi_get_bpr ( sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count );
520 
530 void sqiflash_set_bpr ( sqiflash_t *ctx, uint8_t *buffer );
531 
544 
555 void sqiflash_nonvolatile_write_lock ( sqiflash_t *ctx, uint8_t *buffer );
556 
568 
589 void sqiflash_read_generic ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
590 
605 void sqiflash_highspeed_r_read ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
606 
624 void sqiflash_quad_write ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
625 
641 void sqiflash_write_generic ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
642 
656 
671 void sqiflash_quad_out_read ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
672 
688 void sqiflash_quad_io_read ( sqiflash_t *ctx, uint32_t address, uint8_t mode,
689  uint8_t *buffer, uint32_t data_count );
690 
709 
726 void sqiflash_set_burst ( sqiflash_t *ctx, uint8_t length );
727 
753 void sqiflash_read_sqi_burst_wrap ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
754 
780 void sqiflash_read_spi_burst_wrap ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
781 
794 void sqiflash_read_dual_output ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
795 
831 void sqiflash_read_dual_io ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
832 
843 void sqiflash_sector_erase ( sqiflash_t *ctx, uint32_t address );
844 
857 void sqiflash_block_erase ( sqiflash_t *ctx, uint32_t address );
858 
869 
884 void sqiflash_get_sfdp_params ( sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count );
885 
896 
907 
918 
929 
940 
951 
963 
973 void sqiflash_write_status_reg ( sqiflash_t *ctx, uint8_t s_reg );
974 
984 
995 
996 #ifdef __cplusplus
997 }
998 #endif
999 #endif // SQIFLASH_H
1000  // sqiflash
1002 
1003 // ------------------------------------------------------------------------ END
sqiflash_quad_enable
void sqiflash_quad_enable(sqiflash_t *ctx)
SQI FLASH Quad Enable.
sqiflash_program_status
uint8_t sqiflash_program_status(sqiflash_t *ctx)
SQI FLASH Program Status.
sqiflash_read_dual_output
void sqiflash_read_dual_output(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH Read Dual Output.
sqiflash_cfg_t::sck
pin_name_t sck
Definition: sqiflash.h:195
sqiflash_get_sfdp_params
void sqiflash_get_sfdp_params(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH get Serial Flash Discoverable.
sqiflash_erase_status
uint8_t sqiflash_erase_status(sqiflash_t *ctx)
SQI FLASH Erase Status.
sqiflash_security_status
uint8_t sqiflash_security_status(sqiflash_t *ctx)
SQI FLASH Security Status.
sqiflash_cfg_t::mosi
pin_name_t mosi
Definition: sqiflash.h:194
sqiflash_lock_security_id
void sqiflash_lock_security_id(sqiflash_t *ctx)
SQI FLASH Lock Security Status.
sqiflash_write_resume
void sqiflash_write_resume(sqiflash_t *ctx)
SQI FLASH Write Resume.
sqiflash_device_type
uint8_t sqiflash_device_type(sqiflash_t *ctx)
SQI FLASH Device Type.
sqiflash_write_status_reg
void sqiflash_write_status_reg(sqiflash_t *ctx, uint8_t s_reg)
SQI FLASH Write Status Register.
sqiflash_quad_out_read
void sqiflash_quad_out_read(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH Quad Output Read.
spi_specifics.h
This file contains SPI specific macros, functions, etc.
sqiflash_block_erase
void sqiflash_block_erase(sqiflash_t *ctx, uint32_t address)
SQI FLASH Block Erase.
sqiflash_quad_device_id
uint8_t sqiflash_quad_device_id(sqiflash_t *ctx)
SQI FLASH Quad Device ID.
sqiflash_cfg_t::miso
pin_name_t miso
Definition: sqiflash.h:193
sqiflash_set_burst
void sqiflash_set_burst(sqiflash_t *ctx, uint8_t length)
SQI FLASH Set Burst.
sqiflash_chip_erase
void sqiflash_chip_erase(sqiflash_t *ctx)
SQI FLASH Chip Erase.
sqiflash_write_enable
void sqiflash_write_enable(sqiflash_t *ctx)
SQI FLASH Write Enable.
sqiflash_write_status
uint8_t sqiflash_write_status(sqiflash_t *ctx)
SQI FLASH Write Status.
sqiflash_hold_disable
void sqiflash_hold_disable(sqiflash_t *ctx)
SQI FLASH Hold Disable.
sqiflash_t
SQI FLASH Click context object.
Definition: sqiflash.h:174
sqiflash_init
err_t sqiflash_init(sqiflash_t *ctx, sqiflash_cfg_t *cfg)
SQI FLASH initialization function.
sqiflash_read_spi_burst_wrap
void sqiflash_read_spi_burst_wrap(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH Read Burst with Wrap through SPI.
sqiflash_t::sq3
digital_out_t sq3
Definition: sqiflash.h:176
sqiflash_set_security_id
void sqiflash_set_security_id(sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count)
SQI FLASH Set Security ID.
sqiflash_cfg_t::cs_polarity
spi_master_chip_select_polarity_t cs_polarity
Definition: sqiflash.h:205
sqiflash_global_block_unlock
void sqiflash_global_block_unlock(sqiflash_t *ctx)
SQI FLASH Global Block Unlock.
sqiflash_cfg_t
SQI FLASH Click configuration object.
Definition: sqiflash.h:191
sqiflash_write_generic
void sqiflash_write_generic(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH Write.
sqiflash_generic_read
err_t sqiflash_generic_read(sqiflash_t *ctx, uint8_t reg, uint8_t *data_out, uint8_t len)
SQI FLASH data reading function.
SQIFLASH_OK
@ SQIFLASH_OK
Definition: sqiflash.h:215
sqiflash_write_protect_enable
void sqiflash_write_protect_enable(sqiflash_t *ctx)
SQI FLASH Write Protect Enable .
sqiflash_cfg_setup
void sqiflash_cfg_setup(sqiflash_cfg_t *cfg)
SQI FLASH configuration object setup function.
sqiflash_device_manufac
uint8_t sqiflash_device_manufac(sqiflash_t *ctx)
SQI FLASH Device Manufacturer.
sqiflash_sqi_get_bpr
void sqiflash_sqi_get_bpr(sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count)
SQI FLASH Get Block Protection Register SQI.
sqiflash_sqi_get_security_id
void sqiflash_sqi_get_security_id(sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count)
SQI FLASH Get Security ID SQI.
sqiflash_read_sqi_burst_wrap
void sqiflash_read_sqi_burst_wrap(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH Read Burst with Wrap through SQI.
sqiflash_hold_enable
void sqiflash_hold_enable(sqiflash_t *ctx)
SQI FLASH Hold Enable.
sqiflash_cfg_t::sq3
pin_name_t sq3
Definition: sqiflash.h:199
sqiflash_write_disable
void sqiflash_write_disable(sqiflash_t *ctx)
SQI FLASH Write Disable.
sqiflash_quad_reset
void sqiflash_quad_reset(sqiflash_t *ctx)
SQI FLASH Quad Reset.
sqiflash_read_generic
void sqiflash_read_generic(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH Read.
sqiflash_quad_device_type
uint8_t sqiflash_quad_device_type(sqiflash_t *ctx)
SQI FLASH Quad Device Type.
sqiflash_sector_erase
void sqiflash_sector_erase(sqiflash_t *ctx, uint32_t address)
SQI FLASH Sector Erase.
sqiflash_t::sq2
digital_out_t sq2
Definition: sqiflash.h:177
sqiflash_device_id
uint8_t sqiflash_device_id(sqiflash_t *ctx)
SQI FLASH Device ID.
sqiflash_quad_io_read
void sqiflash_quad_io_read(sqiflash_t *ctx, uint32_t address, uint8_t mode, uint8_t *buffer, uint32_t data_count)
SQI FLASH Quad I/O Read.
sqiflash_get_config_reg
uint8_t sqiflash_get_config_reg(sqiflash_t *ctx)
SQI FLASH Get Config Register.
sqiflash_generic_write
err_t sqiflash_generic_write(sqiflash_t *ctx, uint8_t reg, uint8_t *data_in, uint8_t len)
SQI FLASH data writing function.
SQIFLASH_ERROR
@ SQIFLASH_ERROR
Definition: sqiflash.h:216
address
uint32_t address
Definition: main.c:35
sqiflash_cfg_t::spi_mode
spi_master_mode_t spi_mode
Definition: sqiflash.h:204
sqiflash_write_suspend
void sqiflash_write_suspend(sqiflash_t *ctx)
SQI FLASH Write Suspend.
sqiflash_t::chip_select
pin_name_t chip_select
Definition: sqiflash.h:182
sqiflash_get_status_reg
uint8_t sqiflash_get_status_reg(sqiflash_t *ctx)
SQI FLASH Get Status Register.
sqiflash_lock_bpr
void sqiflash_lock_bpr(sqiflash_t *ctx)
SQI FLASH Lock Block Protection Register.
sqiflash_cfg_t::sq2
pin_name_t sq2
Definition: sqiflash.h:200
sqiflash_cfg_t::cs
pin_name_t cs
Definition: sqiflash.h:196
sqiflash_spi_get_security_id
void sqiflash_spi_get_security_id(sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count)
SQI FLASH Get Security ID SPI.
sqiflash_protect_status
uint8_t sqiflash_protect_status(sqiflash_t *ctx)
SQI FLASH Protect Status.
sqiflash_quad_write
void sqiflash_quad_write(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH Quad Write.
sqiflash_write_protect_disable
void sqiflash_write_protect_disable(sqiflash_t *ctx)
SQI FLASH Write Protect Disable.
sqiflash_cfg_t::spi_speed
uint32_t spi_speed
Definition: sqiflash.h:203
sqiflash_quad_device_manufac
uint8_t sqiflash_quad_device_manufac(sqiflash_t *ctx)
SQI FLASH Quad Device Manufacturer.
sqiflash_highspeed_r_read
void sqiflash_highspeed_r_read(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH High Speed Read.
sqiflash_t::spi
spi_master_t spi
Definition: sqiflash.h:180
sqiflash_busy
uint8_t sqiflash_busy(sqiflash_t *ctx)
SQI FLASH Busy.
sqiflash_return_value_t
sqiflash_return_value_t
SQI FLASH Click return value data.
Definition: sqiflash.h:214
sqiflash_set_bpr
void sqiflash_set_bpr(sqiflash_t *ctx, uint8_t *buffer)
SQI FLASH Set Block Protection Register.
sqiflash_spi_get_bpr
void sqiflash_spi_get_bpr(sqiflash_t *ctx, uint8_t *buffer, uint32_t data_count)
SQI FLASH Get Block Protection Register SPI.
sqiflash_read_dual_io
void sqiflash_read_dual_io(sqiflash_t *ctx, uint32_t address, uint8_t *buffer, uint32_t data_count)
SQI FLASH Read Dual I/O.
sqiflash_nonvolatile_write_lock
void sqiflash_nonvolatile_write_lock(sqiflash_t *ctx, uint8_t *buffer)
SQI FLASH Non-Volatile Write-Lock.
sqiflash_reset
void sqiflash_reset(sqiflash_t *ctx)
SQI FLASH Reset.