ntag5link  2.0.0.0
ntag5link.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 NTAG5LINK_H
29 #define NTAG5LINK_H
30 
31 #ifdef __cplusplus
32 extern "C"{
33 #endif
34 
35 #include "mikrosdk_version.h"
36 
37 #ifdef __GNUC__
38 #if mikroSDK_GET_VERSION < 20800ul
39 #include "rcu_delays.h"
40 #else
41 #include "delays.h"
42 #endif
43 #endif
44 
45 #include "drv_digital_out.h"
46 #include "drv_digital_in.h"
47 #include "drv_i2c_master.h"
48 
69 #define NTAG5LINK_CONFIG_SIGNATURE 0x1000
70 #define NTAG5LINK_CONFIG_HEADER 0x1008
71 #define NTAG5LINK_CONFIG_ID 0x1009
72 #define NTAG5LINK_CONFIG_NFC_GCH 0x100C
73 #define NTAG5LINK_CONFIG_NFC_CCH 0x100D
74 #define NTAG5LINK_CONFIG_NFC_AUTH_LIMIT 0x100E
75 #define NTAG5LINK_CONFIG_NFC_KH0 0x1010
76 #define NTAG5LINK_CONFIG_NFC_KP0 0x1011
77 #define NTAG5LINK_CONFIG_NFC_KH1 0x1012
78 #define NTAG5LINK_CONFIG_NFC_KP1 0x1013
79 #define NTAG5LINK_CONFIG_NFC_KH2 0x1014
80 #define NTAG5LINK_CONFIG_NFC_KP2 0x1015
81 #define NTAG5LINK_CONFIG_NFC_KH3 0x1016
82 #define NTAG5LINK_CONFIG_NFC_KP3 0x1017
83 #define NTAG5LINK_CONFIG_KEY_0 0x1020
84 #define NTAG5LINK_CONFIG_KEY_1 0x1024
85 #define NTAG5LINK_CONFIG_KEY_2 0x1028
86 #define NTAG5LINK_CONFIG_KEY_3 0x102C
87 #define NTAG5LINK_CONFIG_I2C_KH 0x1030
88 #define NTAG5LINK_CONFIG_I2C_PP_AND_PPC 0x1031
89 #define NTAG5LINK_CONFIG_I2C_AUTH_LIMIT 0x1032
90 #define NTAG5LINK_CONFIG_I2C_PWD_0 0x1033
91 #define NTAG5LINK_CONFIG_I2C_PWD_1 0x1034
92 #define NTAG5LINK_CONFIG_I2C_PWD_2 0x1035
93 #define NTAG5LINK_CONFIG_I2C_PWD_3 0x1036
94 #define NTAG5LINK_CONFIG_CONFIG 0x1037
95 #define NTAG5LINK_CONFIG_SYNC_DATA_BLOCK 0x1038
96 #define NTAG5LINK_CONFIG_PWM_GPIO_CONFIG 0x1039
97 #define NTAG5LINK_CONFIG_PWM0_ON_OFF 0x103A
98 #define NTAG5LINK_CONFIG_PWM1_ON_OFF 0x103B
99 #define NTAG5LINK_CONFIG_WDT_CFG_AND_SRAM_COPY 0x103C
100 #define NTAG5LINK_CONFIG_EH_AND_ED_CONFIG 0x103D
101 #define NTAG5LINK_CONFIG_I2C_SLAVE_MASTER_CFG 0x103E
102 #define NTAG5LINK_CONFIG_SEC_SRAM_AND_PP_AREA_1 0x103F
103 #define NTAG5LINK_CONFIG_SRAM_DEFAULT 0x1045
104 #define NTAG5LINK_CONFIG_AFI 0x1055
105 #define NTAG5LINK_CONFIG_DSFID 0x1056
106 #define NTAG5LINK_CONFIG_EAS_ID 0x1057
107 #define NTAG5LINK_CONFIG_NFC_PP_AREA_0_AND_PPC 0x1058
108 #define NTAG5LINK_CONFIG_NFC_LOCK_BLOCK 0x106A
109 #define NTAG5LINK_CONFIG_I2C_LOCK_BLOCK 0x108A
110 #define NTAG5LINK_CONFIG_NFC_SECTION_LOCK 0x1092
111 #define NTAG5LINK_CONFIG_I2C_SECTION_LOCK 0x1094
112 #define NTAG5LINK_CONFIG_I2C_PWD_0_AUTH 0x1096
113 #define NTAG5LINK_CONFIG_I2C_PWD_1_AUTH 0x1097
114 #define NTAG5LINK_CONFIG_I2C_PWD_2_AUTH 0x1098
115 #define NTAG5LINK_CONFIG_I2C_PWD_3_AUTH 0x1099
116 
121 #define NTAG5LINK_SESSION_REG_STATUS 0x10A0
122 #define NTAG5LINK_SESSION_REG_CONFIG 0x10A1
123 #define NTAG5LINK_SESSION_REG_SYNC_DATA_BLOCK 0x10A2
124 #define NTAG5LINK_SESSION_REG_PWM_GPIO_CONFIG 0x10A3
125 #define NTAG5LINK_SESSION_REG_PWM0_ON_OFF 0x10A4
126 #define NTAG5LINK_SESSION_REG_PWM1_ON_OFF 0x10A5
127 #define NTAG5LINK_SESSION_REG_WDT_CONFIG 0x10A6
128 #define NTAG5LINK_SESSION_REG_EH_CONFIG 0x10A7
129 #define NTAG5LINK_SESSION_REG_ED_CONFIG 0x10A8
130 #define NTAG5LINK_SESSION_REG_I2C_SLAVE_CONFIG 0x10A9
131 #define NTAG5LINK_SESSION_REG_RESET_GEN 0x10AA
132 #define NTAG5LINK_SESSION_REG_ED_INTR_CLEAR 0x10AB
133 #define NTAG5LINK_SESSION_REG_I2C_MASTER_CONFIG 0x10AC
134 #define NTAG5LINK_SESSION_REG_I2C_MASTER_STATUS 0x10AD
135 #define NTAG5LINK_SESSION_REG_BYTE_0 0x00
136 #define NTAG5LINK_SESSION_REG_BYTE_1 0x01
137 #define NTAG5LINK_SESSION_REG_BYTE_2 0x02
138 #define NTAG5LINK_SESSION_REG_BYTE_3 0x03
139  // ntag5link_reg
141 
156 #define NTAG5LINK_USER_MEMORY_ADDRESS_MIN 0x0000
157 #define NTAG5LINK_USER_MEMORY_ADDRESS_MAX 0x01FF
158 #define NTAG5LINK_CONFIG_MEMORY_ADDRESS_MIN 0x1000
159 #define NTAG5LINK_CONFIG_MEMORY_ADDRESS_MAX 0x109F
160 #define NTAG5LINK_SESSION_REG_ADDRESS_MIN 0x10A0
161 #define NTAG5LINK_SESSION_REG_ADDRESS_MAX 0x10AF
162 #define NTAG5LINK_MEMORY_BLOCK_SIZE 4
163 
168 #define NTAG5LINK_CONFIG_0_SRAM_COPY_ENABLE 0x80
169 #define NTAG5LINK_CONFIG_0_EH_LOW_FIELD_STR 0x08
170 #define NTAG5LINK_CONFIG_0_EH_HIGH_FIELD_STR 0x0C
171 #define NTAG5LINK_CONFIG_0_LOCK_SESSION_REG 0x02
172 #define NTAG5LINK_CONFIG_0_AUTO_STANDBY_MODE_EN 0x01
173 #define NTAG5LINK_CONFIG_1_EH_ARBITER_MODE_EN 0x80
174 #define NTAG5LINK_CONFIG_1_USE_CASE_I2C_SLAVE 0x00
175 #define NTAG5LINK_CONFIG_1_USE_CASE_I2C_MASTER 0x10
176 #define NTAG5LINK_CONFIG_1_USE_CASE_GPIO_PWM 0x20
177 #define NTAG5LINK_CONFIG_1_USE_CASE_3_STATE 0x30
178 #define NTAG5LINK_CONFIG_1_ARBITER_NORMAL_MODE 0x00
179 #define NTAG5LINK_CONFIG_1_ARBITER_SRAM_MIRROR 0x04
180 #define NTAG5LINK_CONFIG_1_ARBITER_SRAM_PT 0x08
181 #define NTAG5LINK_CONFIG_1_ARBITER_SRAM_PHDC 0x0C
182 #define NTAG5LINK_CONFIG_1_SRAM_ENABLE 0x02
183 #define NTAG5LINK_CONFIG_1_PT_TRANSFER_I2C_NFC 0x00
184 #define NTAG5LINK_CONFIG_1_PT_TRANSFER_NFC_I2C 0x01
185 #define NTAG5LINK_CONFIG_2_GPIO1_IN_DISABLE 0x00
186 #define NTAG5LINK_CONFIG_2_GPIO1_IN_PULL_UP 0x40
187 #define NTAG5LINK_CONFIG_2_GPIO1_IN_ENABLE 0x80
188 #define NTAG5LINK_CONFIG_2_GPIO1_IN_PULL_DOWN 0xC0
189 #define NTAG5LINK_CONFIG_2_GPIO0_IN_DISABLE 0x00
190 #define NTAG5LINK_CONFIG_2_GPIO0_IN_PULL_UP 0x10
191 #define NTAG5LINK_CONFIG_2_GPIO0_IN_ENABLE 0x20
192 #define NTAG5LINK_CONFIG_2_GPIO0_IN_PULL_DOWN 0x30
193 #define NTAG5LINK_CONFIG_2_EXT_CMD_SUPPORT 0x08
194 #define NTAG5LINK_CONFIG_2_LOCK_BLK_CMD_SUPPORT 0x04
195 #define NTAG5LINK_CONFIG_2_GPIO1_HIGH_SLEW_RATE 0x02
196 #define NTAG5LINK_CONFIG_2_GPIO0_HIGH_SLEW_RATE 0x01
197 
202 #define NTAG5LINK_CAPABILITY_CONTAINER_ADDRESS 0x0000
203 #define NTAG5LINK_CAPABILITY_CONTAINER 0xE1, 0x40, 0x80, 0x01
204 #define NTAG5LINK_NDEF_MESSAGE_START_ADDRESS 0x0001
205 #define NTAG5LINK_TYPE_NDEF_MESSAGE 0x03
206 #define NTAG5LINK_NDEF_RECORD_HEADER 0xD1
207 #define NTAG5LINK_NDEF_TYPE_LENGTH 0x01
208 #define NTAG5LINK_NDEF_URI_TYPE 'U'
209 #define NTAG5LINK_NDEF_MESSAGE_END_MARK 0xFE
210 
215 #define NTAG5LINK_URI_PREFIX_0 0x00
216 #define NTAG5LINK_URI_PREFIX_1 0x01
217 #define NTAG5LINK_URI_PREFIX_2 0x02
218 #define NTAG5LINK_URI_PREFIX_3 0x03
219 #define NTAG5LINK_URI_PREFIX_4 0x04
220 #define NTAG5LINK_URI_PREFIX_5 0x05
221 #define NTAG5LINK_URI_PREFIX_6 0x06
222 #define NTAG5LINK_URI_PREFIX_7 0x07
223 #define NTAG5LINK_URI_PREFIX_8 0x08
224 #define NTAG5LINK_URI_PREFIX_9 0x09
225 #define NTAG5LINK_URI_PREFIX_10 0x0A
226 #define NTAG5LINK_URI_PREFIX_11 0x0B
227 #define NTAG5LINK_URI_PREFIX_12 0x0C
228 #define NTAG5LINK_URI_PREFIX_13 0x0D
229 #define NTAG5LINK_URI_PREFIX_14 0x0E
230 #define NTAG5LINK_URI_PREFIX_15 0x0F
231 #define NTAG5LINK_URI_PREFIX_16 0x10
232 #define NTAG5LINK_URI_PREFIX_17 0x11
233 #define NTAG5LINK_URI_PREFIX_18 0x12
234 #define NTAG5LINK_URI_PREFIX_19 0x13
235 #define NTAG5LINK_URI_PREFIX_20 0x14
236 #define NTAG5LINK_URI_PREFIX_21 0x15
237 #define NTAG5LINK_URI_PREFIX_22 0x16
238 #define NTAG5LINK_URI_PREFIX_23 0x17
239 #define NTAG5LINK_URI_PREFIX_24 0x18
240 #define NTAG5LINK_URI_PREFIX_25 0x19
241 #define NTAG5LINK_URI_PREFIX_26 0x1A
242 #define NTAG5LINK_URI_PREFIX_27 0x1B
243 #define NTAG5LINK_URI_PREFIX_28 0x1C
244 #define NTAG5LINK_URI_PREFIX_29 0x1D
245 #define NTAG5LINK_URI_PREFIX_30 0x1E
246 #define NTAG5LINK_URI_PREFIX_31 0x1F
247 #define NTAG5LINK_URI_PREFIX_32 0x20
248 #define NTAG5LINK_URI_PREFIX_33 0x21
249 #define NTAG5LINK_URI_PREFIX_34 0x22
250 #define NTAG5LINK_URI_PREFIX_35 0x23
257 #define NTAG5LINK_DEVICE_ADDRESS 0x54
258  // ntag5link_set
260 
275 #define NTAG5LINK_MAP_MIKROBUS( cfg, mikrobus ) \
276  cfg.scl = MIKROBUS( mikrobus, MIKROBUS_SCL ); \
277  cfg.sda = MIKROBUS( mikrobus, MIKROBUS_SDA ); \
278  cfg.hpd = MIKROBUS( mikrobus, MIKROBUS_RST ); \
279  cfg.ed = MIKROBUS( mikrobus, MIKROBUS_INT )
280  // ntag5link_map // ntag5link
283 
284 
289 typedef union
290 {
291  uint8_t value_bytes[ 4 ];
292  uint32_t value;
294 
299 typedef struct
300 {
301  // Output pins
302  digital_out_t hpd;
304  // Input pins
305  digital_in_t ed;
307  // Modules
308  i2c_master_t i2c;
310  // I2C slave address
311  uint8_t slave_address;
313 } ntag5link_t;
314 
319 typedef struct
320 {
321  pin_name_t scl;
322  pin_name_t sda;
324  pin_name_t hpd;
325  pin_name_t ed;
327  uint32_t i2c_speed;
328  uint8_t i2c_address;
331 
336 typedef enum
337 {
339  NTAG5LINK_ERROR = -1
340 
342 
359 
375 
390 
404 err_t ntag5link_write_memory_block ( ntag5link_t *ctx, uint16_t block_addr, ntag5link_block_t *block );
405 
419 err_t ntag5link_read_memory_block ( ntag5link_t *ctx, uint16_t block_addr, ntag5link_block_t *block );
420 
436 err_t ntag5link_write_multiple_memory_block ( ntag5link_t *ctx, uint16_t block_addr,
437  ntag5link_block_t *block, uint8_t num_blocks );
438 
454 err_t ntag5link_read_multiple_memory_block ( ntag5link_t *ctx, uint16_t block_addr,
455  ntag5link_block_t *block, uint8_t num_blocks );
456 
471 err_t ntag5link_write_session_register ( ntag5link_t *ctx, uint16_t block_addr, uint8_t byte_num,
472  uint8_t mask, uint8_t data_in );
473 
487 err_t ntag5link_read_session_register ( ntag5link_t *ctx, uint16_t block_addr, uint8_t byte_num, uint8_t *data_out );
488 
504 err_t ntag5link_write_ndef_uri_record ( ntag5link_t *ctx, uint8_t uri_prefix, uint8_t *uri_data, uint8_t data_len );
505 
517 
532 err_t ntag5link_write_message_to_memory ( ntag5link_t *ctx, uint16_t block_addr, uint8_t *message, uint16_t message_len );
533 
548 err_t ntag5link_read_message_from_memory ( ntag5link_t *ctx, uint16_t block_addr, uint8_t *message, uint16_t message_len );
549 
559 
569 
579 
580 #ifdef __cplusplus
581 }
582 #endif
583 #endif // NTAG5LINK_H
584  // ntag5link
586 
587 // ------------------------------------------------------------------------ END