|
/* Loop while no Smartcard is detected 没有Smart Card */
while(CardInserted == 0)
{
}
/* Start SC Demo ---------------------------------------------------------*/
/* Wait A2R --------------------------------------------------------------*/
SCState = SC_POWER_ON; //给智能卡上电
SC_ADPU.Header.CLA = 0x00; //
SC_ADPU.Header.INS = SC_GET_A2R;
SC_ADPU.Header.P1 = 0x00;
SC_ADPU.Header.P2 = 0x00;
SC_ADPU.Body.LC = 0x00; //
// 返回应答复位信号
while(SCState != SC_ACTIVE_ON_T0)
{
SC_Handler(&SCState, &SC_ADPU, &SC_Responce); //
} /*识别出的协议是T0协议,则智能卡的状态是活跃的,可对智能卡进行文件操作 */
执行到这里时看了下SC_Responce结构体中的数据缓冲区是0,sw1,sw2全为0;而SC_A2R(SC_ATR)的TS和T0分别为3BT和3E,DATA缓冲区第一个元素是0X95,其他全为0;
SC_PTSConfig();
/* Inserts delay(400ms) for Smartcard clock resynchronisation */
Delay(400);
/* Select MF -------------------------------------------------------------*/
SC_ADPU.Header.CLA = SC_CLA_GSM11;
SC_ADPU.Header.INS = SC_SELECT_FILE;
SC_ADPU.Header.P1 = 0x00;
SC_ADPU.Header.P2 = 0x00;
SC_ADPU.Body.LC = 0x02;
for(i = 0; i < SC_ADPU.Body.LC; i++) // 数据长度
{
SC_ADPU.Body.Data[i] = MasterRoot[i]; // 主机设置
}
while(i < LC_MAX) // 20字节的0
{
SC_ADPU.Body.Data[i++] = 0;
}
SC_ADPU.Body.LE = 0; // 返回为0个字节长度
SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
执行到这里又看了下,SC_Responce结构体中的数据缓冲区第一个数据为0XA4其他全为0,sw1,sw2分别为0X9F和0X16,SC_A2R(SC_ATR)的数据不变。
我感觉到智能卡已经正常复位了,不知各位大侠怎么认为?
/* Get Response on MF ----------------------------------------------------*/
if(SC_Responce.SW1 == SC_DF_SELECTED)
{
SC_ADPU.Header.CLA = SC_CLA_GSM11;
SC_ADPU.Header.INS = SC_GET_RESPONCE;
SC_ADPU.Header.P1 = 0x00;
SC_ADPU.Header.P2 = 0x00;
SC_ADPU.Body.LC = 0x02; // 初始化为0,现更改为2
SC_ADPU.Body.LE = SC_Responce.SW2;
SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
}
/* Select ICCID ----------------------------------------------------------*/
if(((SC_Responce.SW1 << 8) | (SC_Responce.SW2)) == SC_OP_TERMINATED)
{
/* Check if the CHV1 is enabled */
if((SC_Responce.Data[13] & 0x80) == 0x00)
{
CHV1Status = 0x01;
}
/* Send APDU Command for ICCID selection */
SC_ADPU.Header.CLA = SC_CLA_GSM11;
SC_ADPU.Header.INS = SC_SELECT_FILE;
SC_ADPU.Header.P1 = 0x00;
SC_ADPU.Header.P2 = 0x00;
SC_ADPU.Body.LC = 0x02;
for(i = 0; i < SC_ADPU.Body.LC; i++)
{
SC_ADPU.Body.Data[i] = ICCID[i];
}
while(i < LC_MAX)
{
SC_ADPU.Body.Data[i++] = 0;
}
SC_ADPU.Body.LE = 0;
SC_Handler(&SCState, &SC_ADPU, &SC_Responce);
}
程序再向下走就是读回SC_A2R(SC_ATR)的sw1 为0x6e,sw2为0,其他缓冲区全为0了。看了下协议0x6e含义是卡不支持指令类型。 |
|