lib_iso7816.c 10 KB

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