打印
[牛人杂谈]

新唐智能卡接口

[复制链接]
1665|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
heisexingqisi|  楼主 | 2017-4-23 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Smart Card IP接口符合ISO7816规范。其实ISO7816收/发数据的波形跟UART一样:1bit
START+8bit 数据 + 1bit 偶校验 + 2bit STOP。
按照ISO7816的规定,发送数据之后多久卡必须回数据,不然就认为超时;连续发送数据之间
至少需要间隔多久才可以;等等时序要求,都由硬件实现。虽然软件可以模拟这些超时时间,
但是是无法过EMV2000认证的。另外,软件模拟也会花费MCU比较多的时间。

沙发
heisexingqisi|  楼主 | 2017-4-23 21:37 | 只看该作者
SC接口有4根脚:SC_CLK、SC_DATA、SC_RST、SC_PWR。因为该四根脚之间有严格的时序要求,如果要符合ISO7816规范,卡槽和SC接口之间不要接任何开关、电容和电阻。如果不需要符合ISO7816规范,可以随意。但是SC_PWR给卡上电之后,需要额外的等待时间,这就需要用 函 数 retval = SCLIB_ActivateDelay(2, FALSE, 33/* 额 外 等 待 时 间 */); 代 替 retval =SCLIB_Activate(2, FALSE);
复位序列之后,卡会回ATR字串,能准确无误拿到该字串,就说明SC接口接的基本没有问题了新唐有提供SC library,大家只要调用该library就可以了。

使用特权

评论回复
板凳
heisexingqisi|  楼主 | 2017-4-23 21:38 | 只看该作者
下面介绍一下用该library,如何拿到ATR。
中断处理函数:
/*我们使用SC2接到SC卡卡槽*/
void SC2_IRQHandler(void)
{
// Please don't remove any of the function calls below
if(SCLIB_CheckCDEvent(2))
return; // Card insert/remove event occurred, no need to check other event...
SCLIB_CheckTimeOutEvent(2);/* 处理超时事件 */
SCLIB_CheckTxRxEvent(2); /* 处理收发事件 */
SCLIB_CheckErrorEvent(2); /* 处理出错事件 */
return;
}

系统初始化:
void SC2_Init()
{
/*使能SC2的时钟*/
CLK_EnableModuleClock(SC2_MODULE);
/* SC2选择外部12M做时钟源,然后除频12M/3= 4M, SC_CLK将输出4M时钟 */
CLK_SetModuleClock(SC2_MODULE, CLK_CLKSEL3_SC2SEL_HXT, CLK_CLKDIV1_SC2(3));
/* 配置多功能引脚 */
SYS->GPA_MFPL = SYS_GPA_MFPL_PA2MFP_SC2_DAT | SYS_GPA_MFPL_PA3MFP_SC2_CLK |
SYS_GPA_MFPL_PA4MFP_SC2_PWR | SYS_GPA_MFPL_PA5MFP_SC2_RST;
/* 打开SC2,不检测卡插入引脚,SC_PWR引脚拉high有效 */
SC_Open(SC2, SC_PIN_STATE_IGNORE, SC_PIN_STATE_HIGH);
NVIC_EnableIRQ(SC2_IRQn);
}


使用特权

评论回复
地板
heisexingqisi|  楼主 | 2017-4-23 21:39 | 只看该作者
Cold RESET IC卡,拿到ATR之后,发送一个命令给IC卡
/*要发送到IC卡的命令,以及命令长度*/
uint8_t g_cmd1buf[] = {0x00, 0xA4, 0x00, 0x00, 0x02, 0xDF, 0x01};
uint32_t g_cmd1len = 7;
void SC2_Test()
{
SC2_Init();
/*  等待卡插入,如果没有卡检测引脚,该函数将马上返回 */
while(SC_IsCardInserted(SC2) == FALSE);
//  发送Activate Timing到slot 2
retval = SCLIB_ActivateDelay(2, FALSE, 33);/* 如果PWR上电之后,需要比较久的时间稳定,用这个函数传入额
外的等待时间,33个ETU */
/* 成功拿到ATR */
if(retval == SCLIB_SUCCESS) {
/* 打印ATR的内容 */
SCLIB_GetCardInfo(2, &s_info);
printf("ATR: ");
for(i = 0; i < s_info.ATR_Len; i++)
printf("%02x ", s_info.ATR_Buf[i]);
printf("\n");
/* 发送命令给IC卡 */
SCLIB_StartTransmission(2, g_cmd1buf, g_cmd1len, g_cmdrsp, &g_cmd1rsplen);
printf("get response\n");
/* 打印响应的结果 */
for(i = 0; i < g_cmd1rsplen; i++)
printf("%02x ", g_cmdrsp[i]);
printf("\n");
}
}


使用特权

评论回复
5
643757107| | 2017-4-24 10:10 | 只看该作者
专用的智能卡接口?软件模拟也会花费MCU比较多的时间。这个就节约多了。

使用特权

评论回复
6
huangcunxiake| | 2017-4-24 16:03 | 只看该作者
如果要符合ISO7816规范,卡槽和SC接口之间不要接任何开关、电容和电阻。

使用特权

评论回复
7
gejigeji521| | 2017-4-24 16:16 | 只看该作者
智能卡是接触的还是非接触的

使用特权

评论回复
8
bob521| | 2017-4-24 19:06 | 只看该作者
这个好像很难啊,怎么搞怎么 搞,求大神指点

使用特权

评论回复
9
超级火龙果| | 2022-2-13 00:29 | 只看该作者
楼主在哪里能下到新唐的智能卡驱动程序包?能发一份给我吗?

使用特权

评论回复
10
twjiang| | 2022-2-14 14:37 | 只看该作者
有厂家已经实现了NUC970/NUC980的智能卡模块了吗?
龙杰智能卡 https://www.acs.com.hk/cn/

使用特权

评论回复
11
twjiang| | 2022-2-14 15:06 | 只看该作者
全球最大的智能卡玩家 Gemalto 在中国的授权

使用特权

评论回复
12
twjiang| | 2022-2-14 15:18 | 只看该作者
FEITIAN
https://www.ftsafe.com/Products/Card_Reader

使用特权

评论回复
13
内政奇才| | 2022-2-14 16:38 | 只看该作者
这个智能卡设计起来很难把

使用特权

评论回复
14
twjiang| | 2022-2-16 09:02 | 只看该作者
ARM TrustZone + ISO7816 有没有厂家这么玩的?

使用特权

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

本版积分规则

116

主题

2538

帖子

2

粉丝