打印
[STM32F1]

再问读取SIM卡的问题

[复制链接]
1576|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JY-DX-JY|  楼主 | 2015-6-10 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在做一款产品,需要读SIM卡。用的卡是一个过期的旧卡,虽然不能用了,但是读里面的信息应该没问题。
我仿照STM32固件库写程序,如下
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);
      if(SCState == SC_POWER_OFF)
      {
        /* Power ON the card */
        SC_PowerCmd(DISABLE);                                                       //因为经过一个三角管反向,所以成禁止了

        /* Reset the card */
        SC_Reset(Bit_RESET);
        SCState = SC_POWER_ON;
      }

   USART_SendData(USART1,SCState);
   Delay(2000);
    }
死在这个循环里了。
我把状态打出来,发现是01 00
/* Exported types ------------------------------------------------------------*/
typedef enum
{
  SC_POWER_ON = 0x00,
  SC_RESET_LOW = 0x01,
  SC_RESET_HIGH = 0x02,
  SC_ACTIVE = 0x03,
  SC_ACTIVE_ON_T0 = 0x04,
  SC_POWER_OFF = 0x05
} SC_State;

就是上电和复位低。我量了,复位是高。
还有,时钟有波形,数据没有。
请大神指教,哪里出了问题?谢谢!
沙发
JY-DX-JY|  楼主 | 2015-6-10 11:24 | 只看该作者
时钟频率大概3.6MHz的样子,也不知道对不对。

使用特权

评论回复
板凳
JY-DX-JY|  楼主 | 2015-6-10 11:45 | 只看该作者
我尝试着发送数据,倒是看到数据波形了,可是波形幅值很小,按理说我供电3.3V,幅值也应该是3.3V吧。
可实际波形远远不到3.3V。

使用特权

评论回复
地板
aozima| | 2015-6-10 14:16 | 只看该作者
SC_PowerCmd(DISABLE);                                                       //因为经过一个三角管反向,所以成禁止了

这种建议去修改 SC_PowerCmd 函数里面的实现,不然不明所以。

使用特权

评论回复
5
LZR13179| | 2015-6-10 14:43 | 只看该作者
看一下SIM上电复位(冷复位)是有ATR能否正确的返回0X3B。。。。这样的数据

使用特权

评论回复
6
JY-DX-JY|  楼主 | 2015-6-10 16:03 | 只看该作者
case SC_ACTIVE:
   GPIO_ResetBits(GPIOB, GPIO_Pin_15);
      if (SC_ADPU->Header.INS == SC_GET_A2R)
      {
        if(SC_decode_Answer2reset(&SC_ATR_Table[0]) == T0_PROTOCOL)
        {
          (*SCState) = SC_ACTIVE_ON_T0;
     
        }
        else
        {
          (*SCState) = SC_POWER_OFF;
     GPIO_SetBits(GPIOB, GPIO_Pin_15);
        }
    USART_SendData(USART1,SC_decode_Answer2reset(&SC_ATR_Table[0]));
    for(i=3000;i>0;i--);
      }
   
    break;
谢谢!现在跟踪调试,发现进到激活模式了。
if(SC_decode_Answer2reset(&SC_ATR_Table[0]) == T0_PROTOCOL)
这一句如果相等表示T0协议,可是我的数据是0x01,难道是T1协议吗?
还是哪里出错了?

使用特权

评论回复
7
JY-DX-JY|  楼主 | 2015-6-10 16:11 | 只看该作者
case SC_RESET_LOW:
   //GPIO_ResetBits(GPIOB, GPIO_Pin_15);
      /* Check responce with reset low ---------------------------------------*/
      for (i = 0; i < length; i++)
      {
        if((USART_ByteReceive(&Data, SC_RECEIVE_TIMEOUT)) == SUCCESS)
        {
          card = Data;
        }
      }
   
      if(card[0])                               //card[0]是0x3b,表示什么意思呢?
      {
        (*SCState) = SC_ACTIVE;
        SC_Reset(SC_Reset_H);
      }
      else
      {
        (*SCState) = SC_RESET_HIGH;
      }
   //GPIO_SetBits(GPIOB, GPIO_Pin_15);
    break;

使用特权

评论回复
8
JY-DX-JY|  楼主 | 2015-6-10 17:27 | 只看该作者
case SC_RESET_LOW:
   
      if(SC_ADPU->Header.INS == SC_GET_A2R)
      {
        /* If card is detected then Power ON, Card Reset and wait for an answer) */
        //if (SC_Detect())
    if (SC_Detect()==0)
        {
          while(((*SCState) != SC_POWER_OFF) && ((*SCState) != SC_ACTIVE))
          {
      
            SC_AnswerReq(SCState, &SC_ATR_Table[0], 40); /* Check for answer to reset */
      
      
          }
     
        }
        else
        {
          (*SCState) = SC_POWER_OFF;
        }
   
      }
我进到红色的那个函数里,参数是40个数据:
static void SC_AnswerReq(SC_State *SCState, uint8_t *card, uint8_t length)
{
  uint8_t Data = 0;
  uint32_t i = 0;
  switch(*SCState)
  {
    case SC_RESET_LOW:
   //GPIO_ResetBits(GPIOB, GPIO_Pin_15);
      /* Check responce with reset low ---------------------------------------*/
      for (i = 0; i < length; i++)
      {
        if((USART_ByteReceive(&Data, SC_RECEIVE_TIMEOUT)) == SUCCESS)
        {
          card = Data;
     
        }
      }
   for (i = 0; i < length; i++)
      {
    USART_SendData(USART1,card);                                                      //在这里我把数据通过串口打印出来
    for(ii=0;ii<3000;ii++);                                                
   }
   while(1);

      if(card[0])
      {
        (*SCState) = SC_ACTIVE;
        SC_Reset(SC_Reset_H);
      }
      else
      {
        (*SCState) = SC_RESET_HIGH;
      }
   //GPIO_SetBits(GPIOB, GPIO_Pin_15);
    break;
3B 1A 11 D1 00 33 00 53 49 4D 20 9F 16 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
四十个数据如上所示。苦于不知道什么意思。大神指教,有什么问题?谢谢!

使用特权

评论回复
9
JY-DX-JY|  楼主 | 2015-6-10 17:36 | 只看该作者


看了下7816传输协议,一种是IC卡支持T=0,另一种支持T=1,莫非我的卡是T=1?
还有,0x3b是正向约定。

使用特权

评论回复
10
sinshine| | 2015-6-10 18:26 | 只看该作者
JY-DX-JY 发表于 2015-6-10 17:36
看了下7816传输协议,一种是IC卡支持T=0,另一种支持T=1,莫非我的卡是T=1?
还有,0x3b是正向约定。
...

国内的sim卡我还没见到过有T1的。 从ATR里看出,这是T0的

使用特权

评论回复
11
mmuuss586| | 2015-6-10 19:10 | 只看该作者

这个不熟,只能支持下;

使用特权

评论回复
12
JY-DX-JY|  楼主 | 2015-6-10 21:38 | 只看该作者
sinshine 发表于 2015-6-10 18:26
国内的sim卡我还没见到过有T1的。 从ATR里看出,这是T0的

你好!怎么看出是T0的?请指教,谢谢!

使用特权

评论回复
13
LZR13179| | 2015-6-11 08:57 | 只看该作者
JY-DX-JY 发表于 2015-6-10 21:38
你好!怎么看出是T0的?请指教,谢谢!

你还是先看看ISO7816协议文档

使用特权

评论回复
14
LZR13179| | 2015-6-11 08:58 | 只看该作者
这个是ISO7816的原版协议

ISO IEC 7816-3-2006.pdf

634.03 KB

使用特权

评论回复
评论
yangxf1217 2015-6-11 09:40 回复TA
好同志! 
15
JY-DX-JY|  楼主 | 2015-6-11 09:28 | 只看该作者
谢谢!我看看

使用特权

评论回复
16
JY-DX-JY|  楼主 | 2015-6-11 09:45 | 只看该作者
本帖最后由 JY-DX-JY 于 2015-6-11 10:07 编辑

3B是正向约定,1A应该表示TA1存在,10个历史字节。
TA1=11,Fi=372,最大5MHz,Di=1
D1,00,33,00,53,49,4D,20,9F,16是10个历史字节。

使用特权

评论回复
17
JY-DX-JY|  楼主 | 2015-6-11 10:11 | 只看该作者
可是看不出来是T=0,还是T=1呀?我迷惑了,高手指教!

使用特权

评论回复
18
sinshine| | 2015-6-11 10:26 | 只看该作者
JY-DX-JY 发表于 2015-6-11 10:11
可是看不出来是T=0,还是T=1呀?我迷惑了,高手指教!

ATR里没有TD1的。下面是协议里的原文
⎯ If TD1 is absent, then the only offer is T=0.

使用特权

评论回复
19
JY-DX-JY|  楼主 | 2015-6-11 10:28 | 只看该作者
谢谢!我知道了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3351

帖子

30

粉丝