谢谢!
我参考的stsw-stm32011官网固件库。
/**
* @brief Manages the Smartcard transport layer: send APDU commands and receives
* the APDU responce.
* @param SC_ADPU: pointer to a SC_ADPU_Commands structure which will be initialized.
* @param SC_Response: pointer to a SC_ADPU_Responce structure which will be initialized.
* @retval None
*/
static void SC_SendData(SC_ADPU_Commands *SC_ADPU, SC_ADPU_Responce *SC_ResponceStatus)
{
uint32_t i = 0;
uint8_t locData = 0;
/* Reset responce buffer ---------------------------------------------------*/
for(i = 0; i < LC_MAX; i++)
{
SC_ResponceStatus->Data = 0;
}
SC_ResponceStatus->SW1 = 0;
SC_ResponceStatus->SW2 = 0;
/* Enable the DMA Receive (Set DMAR bit only) to enable interrupt generation
in case of a framing error FE */
USART_DMACmd(SC_USART, USART_DMAReq_Rx, ENABLE);
/* Send header -------------------------------------------------------------*/
SCData = SC_ADPU->Header.CLA;
USART_SendData(SC_USART, SCData);
while(USART_GetFlagStatus(SC_USART, USART_FLAG_TC) == RESET)
{
}
SCData = SC_ADPU->Header.INS;
USART_SendData(SC_USART, SCData);
while(USART_GetFlagStatus(SC_USART, USART_FLAG_TC) == RESET)
{
}
SCData = SC_ADPU->Header.P1;
USART_SendData(SC_USART, SCData);
while(USART_GetFlagStatus(SC_USART, USART_FLAG_TC) == RESET)
{
}
SCData = SC_ADPU->Header.P2;
USART_SendData(SC_USART, SCData);
while(USART_GetFlagStatus(SC_USART, USART_FLAG_TC) == RESET)
{
}
/* Send body length to/from SC ---------------------------------------------*/
if(SC_ADPU->Body.LC)
{
SCData = SC_ADPU->Body.LC;
USART_SendData(SC_USART, SCData);
while(USART_GetFlagStatus(SC_USART, USART_FLAG_TC) == RESET)
{
}
}
else if(SC_ADPU->Body.LE)
{
SCData = SC_ADPU->Body.LE;
USART_SendData(SC_USART, SCData);
while(USART_GetFlagStatus(SC_USART, USART_FLAG_TC) == RESET)
{
}
}
/* Flush the SC_USART DR */
(void)USART_ReceiveData(SC_USART);
/* --------------------------------------------------------
Wait Procedure byte from card:
1 - ACK
2 - NULL
3 - SW1; SW2
-------------------------------------------------------- */
if((USART_ByteReceive(&locData, SC_RECEIVE_TIMEOUT)) == SUCCESS)
{
if(((locData & (uint8_t)0xF0) == 0x60) || ((locData & (uint8_t)0xF0) == 0x90))
{
/* SW1 received */
SC_ResponceStatus->SW1 = locData;
if((USART_ByteReceive(&locData, SC_RECEIVE_TIMEOUT)) == SUCCESS)
{
/* SW2 received */
SC_ResponceStatus->SW2 = locData;
}
}
else if (((locData & (uint8_t)0xFE) == (((uint8_t)~(SC_ADPU->Header.INS)) & \
(uint8_t)0xFE))||((locData & (uint8_t)0xFE) == (SC_ADPU->Header.INS & (uint8_t)0xFE)))
{
SC_ResponceStatus->Data[0] = locData;/* ACK received */
}
}
/* If no status bytes received ---------------------------------------------*/
if(SC_ResponceStatus->SW1 == 0x00)
{
/* Send body data to SC--------------------------------------------------*/
if (SC_ADPU->Body.LC)
{
for(i = 0; i < SC_ADPU->Body.LC; i++)
{
SCData = SC_ADPU->Body.Data;
USART_SendData(SC_USART, SCData);
while(USART_GetFlagStatus(SC_USART, USART_FLAG_TC) == RESET)
{
}
}
/* Flush the SC_USART DR */
(void)USART_ReceiveData(SC_USART);
/* Disable the DMA Receive (Reset DMAR bit only) */
USART_DMACmd(SC_USART, USART_DMAReq_Rx, DISABLE);
}
/* Or receive body data from SC ------------------------------------------*/
else if (SC_ADPU->Body.LE)
{
for(i = 0; i < SC_ADPU->Body.LE; i++)
{
if(USART_ByteReceive(&locData, SC_RECEIVE_TIMEOUT) == SUCCESS)
{
SC_ResponceStatus->Data = locData;
}
}
}
/* Wait SW1 --------------------------------------------------------------*/
i = 0;
while(i < 10)
{
if(USART_ByteReceive(&locData, SC_RECEIVE_TIMEOUT) == SUCCESS)
{
SC_ResponceStatus->SW1 = locData;
i = 11;
}
else
{
i++;
}
}
/* Wait SW2 ------------------------------------------------------------*/
i = 0;
while(i < 10)
{
if(USART_ByteReceive(&locData, SC_RECEIVE_TIMEOUT) == SUCCESS)
{
SC_ResponceStatus->SW2 = locData;
i = 11;
}
else
{
i++;
}
}
}
}
是先发了APDU又判断接收9F和6C的,难道库是错的吗?
|