接触式IC卡 - STM32(Smart Card)

3 篇文章 0 订阅
3 篇文章 0 订阅

目录

1、复位

1.1、冷复位

1.2、热复位

2、Smart Card功能

2.1、初始配置

2.2、波特率计算

2.3、IO收发代码

2.4、IC通讯测试


接触IC的硬件通讯其实不难理解,上层逻辑层就复杂了,可根据ISO7816-3中规定的标准一一完善即可。这是一个漫长切枯燥的过程,但是一般都是站在巨人的肩膀上完善优化就好,自己动手慢慢敲可不太容易。

逻辑协议是根具ISO7816来的,硬件平台是多变的。更换一个硬件平台做到底层修改即可。

1、复位

接触IC主要就两个操作,复位激活+APDU,

复位有冷复位和热复位两种,复位只负责接收数据,APDU有发有收。

1.1、冷复位

就是准备复位之前VCC是没电的,RST也是保持低电平的,准备冷复位后,给VCC供电,给CLK,tb后在置高RST,控制冷复位就完成了,接下来等待接收ATR。

1.2、热复位

在已经有VCC和CLK的的情况下,将RST拉低一段时间,然后等待ATR自动应答就行了。

2、Smart Card功能

2.1、初始配置

测试使用的是STM32F103,USARTx都带有Smart Card功能。UARTx则没有。

初始化就上面两个地方,这里没选择 Card Clock功能,单独用了一个定时器提供4Mhz的PWM信号。

 然后重要的就是波特率怎么计算。

2.2、波特率计算

电路I/O上一个bit的标称持续时间为“基本时间单位”,表示为etu。etu应等于电路CLK上的F/D时钟周期,其中F和D为传输参数:F为时钟速率转换整数,D为波特率调整整数

 1etu在串口通讯中就是一个bit的时间,

                baud rate = 1/1etu 

其中 D初始值为1,F初始为 372. f clk时钟设置为4Mhz,

则 1etu = 93us,  baud rate = 10,752.68,

所以就用上图中的Smart Card 波特率设置为10752.

上式中的D和F会更具ATR中的值会相应变化,这个得啃ISO规范去了。

说完波特率,来试试复位获取ATR。

硬件逻辑就是复位之后,卡片就会像串口一样通过IO发送数据给读卡器。那么复位后只要等待接收即可。

Smart Card智能卡功能是采用单线单IO通讯的,不用切换管脚也不用其他配置,只是在发送的过程中可能Smart Card模块会被误判为接收到新数据而置位接收标志,所以发送完后记得清除一下接收标志和数据,间隔一段时间后才是真正的应答数据,否则一般第一个字节都是无效的干扰数据。

2.3、IO收发代码

//读取IO应答数据
bool HSC_ReadByte(uint8_t *data,int timeout)
{
    if(HAL_SMARTCARD_Receive(&hsc2,data,1,timeout)==HAL_OK)
        return true;
    else
        return false;
}
//通过IO串行发送数据
void HSC_WriteByte(uint8_t data)
{
    HAL_SMARTCARD_Transmit(&hsc2,&data,1,10);
}
//丢弃接收的干扰数据
void HSC_Clear()
{
    (void)hsc2.Instance->DR;
}

因为老设备的代码,要移植到STM32上面去,这部分的代码原来用的是IO模拟的。看得我是自闭症都犯了。

2.4、IC通讯测试

         下面两个函数已经是数据交互的全部了,单线的双向串口通讯,类似RS485通讯。难点是在于收发的数据解析,此处不做介绍。

int getATR(uint8_t ATR[])
{
    int rx_len = 0;
    uint8_t data;
    //复位之后先立即清除一下DR寄存器
    HSC_Clear();
    while (1)
    {
        if (HSC_ReadByte(&data, 100) == false)
        {
            break;
        }
        ATR[rx_len++] = data;
    }
    return rx_len;
}

#define ICCardCLKMainFrien 4 //设定ic卡时钟主频率,单位MHZ

int command_exchange(uint8_t tx_buff[], int tx_len, uint8_t rx_buff[])
{
    uint16_t rece_index = 0;
    float etu = (terminal->terminal_fi / (float)terminal->terminal_di) / ICCardCLKMainFrien; // us
    delay_us((terminal->terminal_cgt + 6) * etu);
  
  //发送数据
    for (int i = 0; i < tx_len; i++)
    {
        HSC_WriteByte(tx_buff[i]);
        /*cgt额外保护时间有tc1决定*/
        delay_us(cgt * etu);
    }
    HSC_Clear();

    //接收数据
    while (1)
    {
        uint8_t data;
        if (HSC_ReadByte(&data, 100) == false)
        {
            break;
        }
        rx_buff[rece_index++] = data;
    }
    return rece_index;
}

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接触式IC卡加密解密工具是一种用于读取和写入接触式IC卡中存储数据的设备。接触式IC卡是一种集成电路卡片,内部存储有加密的数据,常用于银行卡、身份证等各种应用场景。 这种工具通常由硬件设备和相应的软件组成。硬件设备通常包括一个IC卡插槽,用于将IC卡插入其中,以及与计算机或终端设备连接的接口,如USB接口。软件则负责与硬件设备进行通信,并提供加密解密算法以读取和写入IC卡中的数据。 使用接触式IC卡加密解密工具时,首先将IC卡插入读卡器的插槽中。然后,通过与计算机或终端设备的连接,将工具与设备进行通信。用户可以使用相应的软件来操作工具,选择读取或写入IC卡中的数据。在读取数据时,工具将通过接触式IC卡进行通信,并解密被加密的数据。在写入数据时,工具将对即将写入IC卡的数据进行加密处理,以确保数据的安全性。 接触式IC卡加密解密工具在金融、身份验证等领域具有广泛的应用。它可以帮助用户读取和操作IC卡中的加密数据,如读取银行卡余额、授权信息等。同时,它还能对要写入IC卡的数据进行加密处理,保护数据的机密性和完整性。 总而言之,接触式IC卡加密解密工具是一种用于操作接触式IC卡的设备。它能够读取和写入IC卡中的数据,并提供加密解密功能,以确保数据的安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值