1 /**
2 ******************************************************************************
3 * @file lib_iso7816.c
4 * @author Application Team
5 * @version V1.1.0
6 * @date 2019-10-28
7 * @brief ISO7816 library.
8 ******************************************************************************
9 * @attention
10 *
11 ******************************************************************************
12 */
13 #include "lib_iso7816.h"
14 #include "lib_clk.h"
15
16 //registers default reset values
17 #define ISO7816_BAUDDIVL_RSTValue (0UL)
18 #define ISO7816_BAUDDIVH_RSTValue (0UL)
19 #define ISO7816_CFG_RSTValue (0x400)
20 #define ISO7816_CLK_RSTValue (0UL)
21 #define ISO7816_INFO_RC_MASK (0x3ECUL)
22
23
24 /**
25 * @brief Initializes the ISO7816 peripheral registers to their default reset values.
26 * @param ISO7816x: ISO78160~ISO78161
27 * @retval None
28 */
ISO7816_DeInit(ISO7816_Type * ISO7816x)29 void ISO7816_DeInit(ISO7816_Type *ISO7816x)
30 {
31 /* Check parameters */
32 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
33
34 ISO7816x->CFG &= ~ISO7816_CFG_EN;
35
36 ISO7816x->INFO = ISO7816_INFO_RC_MASK; /* clear interrupt flag */
37 ISO7816x->BAUDDIVH = ISO7816_BAUDDIVH_RSTValue;
38 ISO7816x->BAUDDIVL = ISO7816_BAUDDIVL_RSTValue;
39 ISO7816x->CFG = ISO7816_CFG_RSTValue;
40 ISO7816x->CLK = ISO7816_CLK_RSTValue;
41 }
42
43
44 /**
45 * @brief Fills each InitStruct member with its default value.
46 * @param InitStruct: pointer to an ISO7816_InitType structure which will be initialized.
47 * @retval None
48 */
ISO7816_StructInit(ISO7816_InitType * InitStruct)49 void ISO7816_StructInit(ISO7816_InitType *InitStruct)
50 {
51 /*--------------- Reset ISO7816 init structure parameters values ---------------*/
52 /* Initialize the FirstBit member */
53 InitStruct->FirstBit = ISO7816_FIRSTBIT_MSB;
54 /* Initialize the Parity member */
55 InitStruct->Parity = ISO7816_PARITY_EVEN;
56 /* Initialize the Baudrate member */
57 InitStruct->Baudrate = 9600;
58 /* Initialize the TXRetry member */
59 InitStruct->TXRetry = ISO7816_TXRTY_0;
60 /* Initialize the RXACKLength member */
61 InitStruct->RXACKLength = ISO7816_RXACKLEN_2;
62 /* Initialize the TXNACKLength member */
63 InitStruct->TXNACKLength = ISO7816_TXNACKLEN_0;
64 }
65
66 /**
67 * @brief Initializes ISO7816.
68 * @param ISO7816x: ISO78160~ISO78161
69 Init_Struct:iso7816 configuration.
70 FirstBit:
71 ISO7816_FIRSTBIT_MSB
72 ISO7816_FIRSTBIT_LSB
73 Parity:
74 ISO7816_PARITY_EVEN
75 ISO7816_PARITY_ODD
76 Baudrate: baudrate value to configure, 200UL ~ 2625000UL
77 TXRetry:
78 ISO7816_TXRTY_0 ~ ISO7816_TXRTY_15
79 RXACKLength:
80 ISO7816_RXACKLEN_2
81 ISO7816_RXACKLEN_1
82 TXNACKLength:
83 ISO7816_TXNACKLEN_0
84 ISO7816_TXNACKLEN_1
85 ISO7816_TXNACKLEN_2
86 * @retval None
87 */
ISO7816_Init(ISO7816_Type * ISO7816x,ISO7816_InitType * Init_Struct)88 void ISO7816_Init(ISO7816_Type *ISO7816x, ISO7816_InitType *Init_Struct)
89 {
90 uint32_t tmp;
91 uint16_t div;
92 uint32_t pclk;
93
94 /* Check parameters */
95 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
96 assert_parameters(IS_ISO7816_FIRSTBIT(Init_Struct->FirstBit));
97 assert_parameters(IS_ISO7816_PARITY(Init_Struct->Parity));
98 assert_parameters(IS_ISO7816_BAUDRATE(Init_Struct->Baudrate));
99 assert_parameters(IS_ISO7816_TXRTY(Init_Struct->TXRetry));
100 assert_parameters(IS_ISO7816_RXACKLEN(Init_Struct->RXACKLength));
101 assert_parameters(IS_ISO7816_TXNACKLEN(Init_Struct->TXNACKLength));
102
103 tmp = ISO7816x->CFG;
104 tmp &= ~(ISO7816_CFG_ACKLEN\
105 |ISO7816_CFG_AUTORXACK\
106 |ISO7816_CFG_LSB\
107 |ISO7816_CFG_CHKP\
108 |ISO7816_CFG_RXACKSET\
109 |ISO7816_CFG_TXRTYCNT);
110 tmp |= (Init_Struct->FirstBit\
111 |Init_Struct->Parity\
112 |Init_Struct->TXRetry\
113 |Init_Struct->RXACKLength\
114 |Init_Struct->TXNACKLength);
115 ISO7816x->CFG = tmp;
116
117 pclk = CLK_GetPCLKFreq();
118 div = 0x10000 - (pclk/Init_Struct->Baudrate);
119 ISO7816x->BAUDDIVH = (div>>8) & ISO7816_BAUDDIVH_BAUDDIVH;
120 ISO7816x->BAUDDIVL = div & ISO7816_BAUDDIVL_BAUDDIVL;
121 }
122
123 /**
124 * @brief Enables or disables ISO7816.
125 * @param ISO7816x: ISO78160~ISO78161
126 NewState:
127 ENABLE
128 DISABLE
129 * @retval None.
130 */
ISO7816_Cmd(ISO7816_Type * ISO7816x,uint32_t NewState)131 void ISO7816_Cmd(ISO7816_Type *ISO7816x, uint32_t NewState)
132 {
133 /* Check parameters */
134 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
135 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
136
137 if (NewState == ENABLE)
138 {
139 ISO7816x->CFG |= ISO7816_CFG_EN;
140 }
141 else
142 {
143 ISO7816x->CFG &= ~ISO7816_CFG_EN;
144 }
145 }
146
147 /**
148 * @brief Configures ISO7816 baudrate.
149 * @param ISO7816x: ISO78160~ISO78161
150 BaudRate:Baud rate value
151 * @retval None
152 */
ISO7816_BaudrateConfig(ISO7816_Type * ISO7816x,uint32_t BaudRate)153 void ISO7816_BaudrateConfig(ISO7816_Type *ISO7816x, uint32_t BaudRate)
154 {
155 uint32_t pclk;
156 uint16_t div;
157
158 /* Check parameters */
159 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
160 assert_parameters(IS_ISO7816_BAUDRATE(BaudRate));
161
162 pclk = CLK_GetPCLKFreq();
163 div = 0x10000 - (pclk/BaudRate);
164 ISO7816x->BAUDDIVH = (div>>8) & ISO7816_BAUDDIVH_BAUDDIVH;
165 ISO7816x->BAUDDIVL = div & ISO7816_BAUDDIVL_BAUDDIVL;
166 }
167
168 /**
169 * @brief Configures ISO7816 clock divider.
170 * @param ISO7816x: ISO78160~ISO78161
171 Prescaler:1~128
172 * @retval None
173 */
ISO7816_CLKDIVConfig(ISO7816_Type * ISO7816x,uint32_t Prescaler)174 void ISO7816_CLKDIVConfig(ISO7816_Type *ISO7816x, uint32_t Prescaler)
175 {
176 uint32_t tmp;
177
178 /* Check parameters */
179 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
180 assert_parameters(IS_ISO7816_PRESCALER(Prescaler));
181
182 tmp = ISO7816x->CLK;
183 tmp &= ~ISO7816_CLK_CLKDIV;
184 tmp |= (Prescaler - 1);
185 ISO7816x->CLK = tmp;
186 }
187
188 /**
189 * @brief Enables or disables ISO7816 clock output function.
190 * @param ISO7816x: ISO78160~ISO78161
191 NewState:
192 ENABLE
193 DISABLE
194 * @retval None
195 */
ISO7816_CLKOutputCmd(ISO7816_Type * ISO7816x,uint32_t NewState)196 void ISO7816_CLKOutputCmd(ISO7816_Type *ISO7816x, uint32_t NewState)
197 {
198 /* Check parameters */
199 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
200 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
201
202 if (NewState != DISABLE)
203 {
204 ISO7816x->CLK |= ISO7816_CLK_CLKEN;
205 }
206 else
207 {
208 ISO7816x->CLK &= ~ISO7816_CLK_CLKEN;
209 }
210 }
211
212 /**
213 * @brief Reads ISO7816 data.
214 * @param ISO7816: ISO78160~ISO78161
215 * @retval The received data.
216 */
ISO7816_ReceiveData(ISO7816_Type * ISO7816x)217 uint8_t ISO7816_ReceiveData(ISO7816_Type *ISO7816x)
218 {
219 /* Check parameters */
220 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
221
222 return ISO7816x->DATA;
223 }
224
225 /**
226 * @brief Writes ISO7816 data.
227 * @param ISO7816x: ISO78160~ISO78161
228 * ch: data to send
229 * @retval None
230 */
ISO7816_SendData(ISO7816_Type * ISO7816x,uint8_t ch)231 void ISO7816_SendData(ISO7816_Type *ISO7816x, uint8_t ch)
232 {
233 /* Check parameters */
234 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
235
236 ISO7816x->DATA = ch;
237 }
238
239 /**
240 * @brief ENables or disables ISO7816 interrupt.
241 * @param ISO7816x: ISO78160~ISO78161
242 INTMask:
243 This parameter can be any combination of the following values
244 ISO7816_INT_TXRTYERR
245 ISO7816_INT_RXOV
246 ISO7816_INT_RX
247 ISO7816_INT_TXDONE
248 ISO7816_INT_RXERR
249 NewState:
250 ENABLE
251 DISABLE
252 * @retval None
253 */
ISO7816_INTConfig(ISO7816_Type * ISO7816x,uint32_t INTMask,uint8_t NewState)254 void ISO7816_INTConfig(ISO7816_Type *ISO7816x, uint32_t INTMask, uint8_t NewState)
255 {
256 /* Check parameters */
257 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
258 assert_parameters(IS_ISO7816_INT(INTMask));
259 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
260
261 if (NewState == ENABLE)
262 {
263 ISO7816x->CFG |= INTMask;
264 }
265 else
266 {
267 ISO7816x->CFG &= ~INTMask;
268 }
269 }
270
271 /**
272 * @brief Gets ISO7816 interrupt state.
273 * @param ISO7816x: ISO78160~ISO78161
274 INTMask:
275 ISO7816_INTSTS_TXRTYERR
276 ISO7816_INTSTS_TXDONE
277 ISO7816_INTSTS_RXOV
278 ISO7816_INTSTS_RX
279 ISO7816_INTSTS_RXERR
280 * @retval 1: state set
281 0: state reset
282 */
ISO7816_GetINTStatus(ISO7816_Type * ISO7816x,uint32_t INTMask)283 uint8_t ISO7816_GetINTStatus(ISO7816_Type *ISO7816x, uint32_t INTMask)
284 {
285 /* Check parameters */
286 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
287 assert_parameters(IS_ISO7816_INTFLAGR(INTMask));
288
289 if (ISO7816x->INFO & INTMask)
290 {
291 return 1;
292 }
293 else
294 {
295 return 0;
296 }
297 }
298
299 /**
300 * @brief Clears ISO7816 interrupt state.
301 * @param ISO7816x: ISO78160~ISO78161
302 INTMask:
303 This parameter can be any combination of the following values
304 ISO7816_INTSTS_TXRTYERR
305 ISO7816_INTSTS_TXDONE
306 ISO7816_INTSTS_RXOV
307 ISO7816_INTSTS_RX
308 ISO7816_INTSTS_RXERR
309 * @retval None
310 */
ISO7816_ClearINTStatus(ISO7816_Type * ISO7816x,uint32_t INTMask)311 void ISO7816_ClearINTStatus(ISO7816_Type *ISO7816x, uint32_t INTMask)
312 {
313 uint32_t tmp;
314
315 /* Check parameters */
316 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
317 assert_parameters(IS_ISO7816_INTFLAGC(INTMask));
318
319 tmp = ISO7816x->INFO;
320 tmp &= ~ISO7816_INFO_RC_MASK;
321 tmp |= INTMask;
322 ISO7816x->INFO = tmp;
323 }
324
325 /**
326 * @brief Gets ISO7816 peripheral flag.
327 * @param ISO7816x: ISO78160~ISO78161
328 FlagMask:
329 ISO7816_FLAG_DMATXDONE
330 * @retval 1: state set
331 0: state reset
332 */
ISO7816_GetFlag(ISO7816_Type * ISO7816x,uint32_t FlagMask)333 uint8_t ISO7816_GetFlag(ISO7816_Type *ISO7816x, uint32_t FlagMask)
334 {
335 /* Check parameters */
336 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
337 assert_parameters(IS_ISO7816_FLAGR(FlagMask));
338
339 if (ISO7816x->INFO & FlagMask)
340 {
341 return 1;
342 }
343 else
344 {
345 return 0;
346 }
347 }
348
349 /**
350 * @brief Clears ISO7816 peripheral flag.
351 * @param ISO7816x: ISO78160~ISO78161
352 FlagMask:
353 ISO7816_FLAG_DMATXDONE
354 * @retval None
355 */
ISO7816_ClearFlag(ISO7816_Type * ISO7816x,uint32_t FlagMask)356 void ISO7816_ClearFlag(ISO7816_Type *ISO7816x, uint32_t FlagMask)
357 {
358 /* Check parameters */
359 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
360 assert_parameters(IS_ISO7816_FLAGC(FlagMask));
361
362 ISO7816x->INFO |= FlagMask;
363 }
364
365 /**
366 * @brief Gets last transmited ACK.
367 * @param ISO7816: ISO78160~ISO78161
368 * @retval ACK value
369 */
ISO7816_GetLastTransmitACK(ISO7816_Type * ISO7816x)370 uint8_t ISO7816_GetLastTransmitACK(ISO7816_Type *ISO7816x)
371 {
372 /* Check parameters */
373 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
374
375 if (ISO7816x->INFO&ISO7816_INFO_RXACK)
376 {
377 return 1;
378 }
379 else
380 {
381 return 0;
382 }
383 }
384
385 /**
386 * @brief Gets last received check sum bit.
387 * @param ISO7816: ISO78160~ISO78161
388 * @retval CHKSUM bit value
389 */
ISO7816_GetLastReceiveCHKSUM(ISO7816_Type * ISO7816x)390 uint8_t ISO7816_GetLastReceiveCHKSUM(ISO7816_Type *ISO7816x)
391 {
392 /* Check parameters */
393 assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
394
395 if (ISO7816x->INFO&ISO7816_INFO_CHKSUM)
396 {
397 return 1;
398 }
399 else
400 {
401 return 0;
402 }
403 }
404
405 /*********************************** END OF FILE ******************************/
406