123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- /**
- ******************************************************************************
- * @file lib_iso7816.c
- * @author Application Team
- * @version V4.4.0
- * @date 2018-09-27
- * @brief ISO7816 library.
- ******************************************************************************
- * @attention
- *
- ******************************************************************************
- */
- #include "lib_iso7816.h"
- #include "lib_clk.h"
- //registers default reset values
- #define ISO7816_BAUDDIVL_RSTValue 0
- #define ISO7816_BAUDDIVH_RSTValue 0
- #define ISO7816_CFG_RSTValue 0
- #define ISO7816_CLK_RSTValue 0
- #define ISO7816_INFO_RC_MASK (0xECUL) //R/C
- #define ISO7816_INFO_RW_MASK (0x13UL) //R/W
- /**
- * @brief ISO7816 initialization.
- * @param ISO7816x: ISO78160~ISO78161
- Init_Struct:iso7816 configuration.
- FirstBit:
- ISO7816_FIRSTBIT_LSB
- ISO7816_FIRSTBIT_MSB
- ACKLen:
- ISO7816_ACKLEN_1
- ISO7816_ACKLEN_2
- Parity:
- ISO7816_PARITY_EVEN
- ISO7816_PARITY_ODD
- Baudrate: Baud rate value
- * @retval None
- */
- void ISO7816_Init(ISO7816_TypeDef *ISO7816x, ISO7816_InitType *Init_Struct)
- {
- uint32_t tmp;
- uint16_t div;
- uint32_t pclk;
-
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_ISO7816_FIRSTBIT(Init_Struct->FirstBit));
- assert_parameters(IS_ISO7816_ACKLEN(Init_Struct->ACKLen));
- assert_parameters(IS_ISO7816_PARITY(Init_Struct->Parity));
- assert_parameters(IS_ISO7816_BAUDRATE(Init_Struct->Baudrate));
- tmp = ISO7816x->INFO;
- tmp &= ~(ISO7816_INFO_LSB|ISO7816_INFO_RC_MASK);
- tmp |= Init_Struct->FirstBit;
- ISO7816x->INFO = tmp;
- tmp = ISO7816x->CFG;
- tmp &= ~(ISO7816_CFG_ACKLEN\
- |BIT3\
- |BIT2\
- |ISO7816_CFG_CHKP);
- tmp |= (Init_Struct->ACKLen\
- |Init_Struct->Parity);
- ISO7816x->CFG = tmp;
- pclk = CLK_GetPCLKFreq();
- div = 0x10000 - (pclk/Init_Struct->Baudrate);
- ISO7816x->BAUDDIVH = (div>>8) & ISO7816_BAUDDIVH;
- ISO7816x->BAUDDIVL = div & ISO7816_BAUDDIVL;
- }
- /**
- * @brief Fills each InitStruct member with its default value.
- * @param InitStruct: pointer to an ISO7816_InitType structure which will be initialized.
- * @retval None
- */
- void ISO7816_StructInit(ISO7816_InitType *InitStruct)
- {
- /*--------------- Reset ISO7816 init structure parameters values ---------------*/
- /* Initialize the ACKLen member */
- InitStruct->ACKLen = ISO7816_ACKLEN_1;
- /* Initialize the Baudrate member */
- InitStruct->Baudrate = 9600;
- /* Initialize the FirstBit member */
- InitStruct->FirstBit = ISO7816_FIRSTBIT_MSB;
- /* Initialize the Parity member */
- InitStruct->Parity = ISO7816_PARITY_EVEN;
- }
- /**
- * @brief Initializes the ISO7816 peripheral registers to their default reset
- values.
- * @param ISO7816x: ISO78160~ISO78161
- * @retval None
- */
- void ISO7816_DeInit(ISO7816_TypeDef *ISO7816x)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
-
- ISO7816x->CFG &= ~ISO7816_CFG_EN;
- /* clear interrupt flag */
- ISO7816x->INFO = ISO7816_INFO_RC_MASK;
- ISO7816x->BAUDDIVH = ISO7816_BAUDDIVH_RSTValue;
- ISO7816x->BAUDDIVL = ISO7816_BAUDDIVL_RSTValue;
- ISO7816x->CFG = ISO7816_CFG_RSTValue;
- ISO7816x->CLK = ISO7816_CLK_RSTValue;
- }
- /**
- * @brief ISO7816 enable control.
- * @param ISO7816x: ISO78160~ISO78161
- NewState:
- ENABLE
- DISABLE
- * @retval None.
- */
- void ISO7816_Cmd(ISO7816_TypeDef *ISO7816x, uint32_t NewState)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_FUNCTIONAL_STATE(NewState));
-
- if (NewState == ENABLE)
- {
- ISO7816x->CFG |= ISO7816_CFG_EN;
- }
- else
- {
- ISO7816x->CFG &= ~ISO7816_CFG_EN;
- }
- }
- /**
- * @brief ISO7816 Baudrate control.
- * @param ISO7816x: ISO78160~ISO78161
- BaudRate:
- * @retval None
- */
- void ISO7816_BaudrateConfig(ISO7816_TypeDef *ISO7816x, uint32_t BaudRate)
- {
- uint32_t pclk;
- uint16_t div;
-
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_ISO7816_BAUDRATE(BaudRate));
-
- pclk = CLK_GetPCLKFreq();
- div = 0x10000 - (pclk/BaudRate);
- ISO7816x->BAUDDIVH = (div>>8) & ISO7816_BAUDDIVH;
- ISO7816x->BAUDDIVL = div & ISO7816_BAUDDIVL;
- }
- /**
- * @brief ISO7816 clock divider configure.
- * @param ISO7816x: ISO78160~ISO78161
- Prescaler:1~128
- * @retval None
- */
- void ISO7816_CLKDIVConfig(ISO7816_TypeDef *ISO7816x, uint32_t Prescaler)
- {
- uint32_t tmp;
-
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_ISO7816_PRESCALER(Prescaler));
-
- tmp = ISO7816x->CLK;
- tmp &= ~ISO7816_CLK_CLKDIV;
- tmp |= ((Prescaler - 1) & ISO7816_CLK_CLKDIV);
- ISO7816x->CLK = tmp;
- }
- /**
- * @brief ISO7816 clock output enable control.
- * @param ISO7816x: ISO78160~ISO78161
- NewState:
- ENABLE
- DISABLE
- * @retval None
- */
- void ISO7816_CLKOutputCmd(ISO7816_TypeDef *ISO7816x, uint32_t NewState)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_FUNCTIONAL_STATE(NewState));
-
- if (NewState != DISABLE)
- {
- ISO7816x->CLK |= ISO7816_CLK_CLKEN;
- }
- else
- {
- ISO7816x->CLK &= ~ISO7816_CLK_CLKEN;
- }
- }
- /**
- * @brief Read data.
- * @param ISO7816: ISO78160~ISO78161
- * @retval The received data.
- */
- uint8_t ISO7816_ReceiveData(ISO7816_TypeDef *ISO7816x)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- return ISO7816x->DATA;
- }
- /**
- * @brief Write data.
- * @param ISO7816x: ISO78160~ISO78161
- * @retval None
- */
- void ISO7816_SendData(ISO7816_TypeDef *ISO7816x, uint8_t ch)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
-
- ISO7816x->DATA = ch;
- }
- /**
- * @brief Interrupt configure.
- * @param ISO7816x: ISO78160~ISO78161
- INTMask:
- This parameter can be any combination of the following values
- ISO7816_INT_RXOV
- ISO7816_INT_RX
- ISO7816_INT_TX
- NewState:
- ENABLE
- DISABLE
- * @retval None
- */
- void ISO7816_INTConfig(ISO7816_TypeDef *ISO7816x, uint32_t INTMask, uint8_t NewState)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_ISO7816_INT(INTMask));
- assert_parameters(IS_FUNCTIONAL_STATE(NewState));
-
- if (NewState == ENABLE)
- {
- ISO7816x->CFG |= INTMask;
- }
- else
- {
- ISO7816x->CFG &= ~INTMask;
- }
- }
- /**
- * @brief Get interrupt state
- * @param ISO7816x: ISO78160~ISO78161
- INTMask:
- ISO7816_INTSTS_RXOV
- ISO7816_INTSTS_RX
- ISO7816_INTSTS_TX
- * @retval 1: state set
- 0: state reset
- */
- uint8_t ISO7816_GetINTStatus(ISO7816_TypeDef *ISO7816x, uint32_t INTMask)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_ISO7816_INTFLAGR(INTMask));
-
- if (ISO7816x->INFO & INTMask)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- /**
- * @brief Clear interrupt state.
- * @param ISO7816x: ISO78160~ISO78161
- INTMask:
- This parameter can be any combination of the following values
- ISO7816_INTSTS_RXOV
- ISO7816_INTSTS_RX
- ISO7816_INTSTS_TX
- * @retval None
- */
- void ISO7816_ClearINTStatus(ISO7816_TypeDef *ISO7816x, uint32_t INTMask)
- {
- uint32_t tmp;
-
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_ISO7816_INTFLAGC(INTMask));
-
- tmp = ISO7816x->INFO;
- tmp &= ~ISO7816_INFO_RC_MASK;
- tmp |= INTMask;
- ISO7816x->INFO = tmp;
- }
- /**
- * @brief Get peripheral flag.
- * @param ISO7816x: ISO78160~ISO78161
- FlagMask:
- ISO7816_FLAG_SDERR
- ISO7816_FLAG_RCERR
- * @retval 1: state set
- 0: state reset
- */
- uint8_t ISO7816_GetFlag(ISO7816_TypeDef *ISO7816x, uint32_t FlagMask)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_ISO7816_FLAGR(FlagMask));
-
- if (ISO7816x->INFO&FlagMask)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- /**
- * @brief Clear peripheral flag.
- * @param ISO7816x: ISO78160~ISO78161
- FlagMask:
- This parameter can be any combination of the following values
- ISO7816_FLAG_SDERR
- ISO7816_FLAG_RCERR
- * @retval None
- */
- void ISO7816_ClearFlag(ISO7816_TypeDef *ISO7816x, uint32_t FlagMask)
- {
- uint32_t tmp;
-
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
- assert_parameters(IS_ISO7816_FLAGC(FlagMask));
-
- tmp = ISO7816x->INFO;
- tmp &= ~ISO7816_INFO_RC_MASK;
- tmp |= FlagMask;
- ISO7816x->INFO = tmp;
- }
- /**
- * @brief Get last transmit ACK.
- * @param ISO7816: ISO78160~ISO78161
- * @retval ACK value
- */
- uint8_t ISO7816_GetLastTransmitACK(ISO7816_TypeDef *ISO7816x)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
-
- if (ISO7816x->INFO&ISO7816_INFO_RCACK)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
-
- /**
- * @brief Get last receive check sum bit.
- * @param ISO7816: ISO78160~ISO78161
- * @retval CHKSUM bit value
- */
- uint8_t ISO7816_GetLastReceiveCHKSUM(ISO7816_TypeDef *ISO7816x)
- {
- /* Check parameters */
- assert_parameters(IS_ISO7816_ALL_INSTANCE(ISO7816x));
-
- if (ISO7816x->INFO&ISO7816_INFO_CHKSUM)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- /*********************************** END OF FILE ******************************/
|