AK9528 - IS07816转UART智能读卡控制器芯片

news/2024/11/17 23:55:53/

在这个IOT的时代,数据加密已经四处被提及了。安全性需求也日益增高。但是我们的linux主机的芯片,自身却没有带ISO7816接口。这次由于客户的需求,必须要加加密芯片,因此只能找寻类似于USB转ISO7816, UART/SPI转7816接口等芯片。搜来搜去,竟然搜到一颗AK9528,UART转7816。。因此,就拿来用了。这颗芯片的资料不多,基本参数如下:

1. 默认使用38400,8,n,1接口,低位先发送。

2.该芯片支持同时接两张卡,因此有slot0和slot1两个接口

3.在数据帧结构上,采用循环冗余校验的方法。即文档上所说的LCR。LRC: longitudinal redundancy check, which does the exclusive-or operation to each character in the string. For example, if a message of 3 bytes D1, D2, and D3. Then LRC of this message is D1 xor D2 xor D3, and the stream would be D1, D2, D3, and LRC. 

以下是该芯片的整体工作流程:

            

第一步,发送getslotstatus指令对slot进行查询,分别发送slot0的和slot1的。当发送slot0的时候,数据内容如下:

get_slot_status[11] = {0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65};

回复如下:

81, 00, 00, 00, 00, 00, 00, 01, 00, 01, 81

根据0x81指令,其格式如下:

    

bStatus = 0x01, bError = 0x00, bClockStatus = 0x01. bStatus的值以及bError的值,分别查看table2和table3.

       

当bStatus = 0x01,表示一张卡片存在,并且未激活。

        

当bError = 0x00时,表示该命令执行成功。无错误产生。

于是发送第二条指令Poweron 指令0x62

poweron[11] ={0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62};

回复数据如下:

 

80, 15, 00, 00, 00, 00, 00, 00, 00, 00, 3B, xx, xxxxxxxxxxxxx

查询AK9529的命令手册,可以得知,0x3B开始,就是卡片内部的数据交互了。为了安全起见,将剩余的报文用xx来表示。

到此,芯片驱动基本上打通了。剩下的就是慢慢完善所有的指令了。

在此特别注意,如果发送一些错误指令,让芯片进入了错误状态的话,芯片不会返回任何数据,即使你后来发的是正确的数据。此时,似乎只有重新上电或则将AK9529复位才可以恢复。可能也是为了安全性考虑。

另外,如下是整体命令的表格。发送指令和回复指令相互对应关系如下:

   

以下是我的测试代码:

const unsigned char get_slot_status[11] = {0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65};
const unsigned char Poweron[11] ={0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x62};void main(void)
{int uart_fd;int ret;char RxBuffer[256];int i;uart_fd = Uart_Init_Port("/dev/ttyS1", 38400, 8, 'n', 1);while(1){sleep(1);write(uart_fd, &Poweron[0], 11);usleep(100000);while(1){ret = read(uart_fd, RxBuffer, 256);if (ret > 0){for (i = 0; i < ret; i++){printf("%02X, ", RxBuffer[i]);}}else{printf("\r\n");break;}}}
}

 


http://www.ppmy.cn/news/527419.html

相关文章

实验一. RFID自动读卡实验

实验一. RFID自动读卡实验 实验目的实验环境实验内容实验步骤实验代码1) 初始化MFRC5312) 寻卡 硬件连接编译、烧录并测试 实验结果串口设置 实验目的 了解RFID相关知识。掌握RFID模块自动识别IC卡工作原理。 实验环境 软件&#xff1a;IAR SWSTM8 1.30。硬件&#xff1a;RF…

智能卡操作(非接触CPU卡又称智能卡) 总结

1-数据传输格式和初始化 对于刚接触智能卡的工程师来说&#xff0c;在阅读7816-3规范的时候&#xff0c;常常被其中的一些术语迷惑&#xff0c;读起来会觉得有些别扭。尤其是在看到复位应答中的F和D设置以及对应的etu的时候&#xff0c;会觉得有些复杂和难以理解。 其实从本质上…

java智能卡接口_java – 尝试使用智能卡I / O API读取和写入智能卡的字符串

我正在使用ACS AET65读卡器尝试将字符串存储到智能卡中,然后将其读回.我正在使用智能卡IO API,我可以获得终端并与卡连接.但是,我一直在阅读ISO 7816规范,我真的迷路了. 我需要做的就是给卡写一个3K字符串,然后再读回来.而已.根据我的研究,看起来这些卡应该安装了applet,但我确…

Arduino与RC522读卡测试代码

RC522与Arduino读卡代码 做了Arduino作品集4年多了&#xff0c;让我印象比较深刻的是每当有人用RC522的时候都会遇到同样一个问题&#xff0c;就是为什么我的卡读取不了卡号&#xff0c;我明明是用网上的教程啊&#xff1f;在这里我声明一点&#xff0c;网上的教程不一定是正确…

分享一组开关按钮

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>豆子开关</title><style>* {margin: 0;padding: 0;box-sizing: border-box;-webkit-tap-hi…

Endnote中字体大小怎么改变?

Endnote中看文献字体太小&#xff0c;可以通过以下步骤来放大 1.找到上方工具栏“Edit”下的“Preference” 2.如下图&#xff0c;在“Display Fonts”中点击右侧的“Change Font”就可以改字体啦&#xff01; PS&#xff1a;“Library”只是改变参考文献字体大小&#xff1b;“…

网页转pdf乱码问题,楷体部分出乱码

网页转PDF&#xff0c;一直正常使用&#xff0c;今天突然乱码。。。 以为是网页编码问题。。。最后看了一下处理的后的网页&#xff0c;发现没问题。。。 最后发现是wkhtmltopdf的问题&#xff0c;无法解码楷体网页 删除楷体style后&#xff0c;转化正常 记录一下

psychopy设置中文显示字体 楷体、宋体、微软雅黑

2019独角兽企业重金招聘Python工程师标准>>> 3个要点&#xff1a; 1、使用pygame引擎绘制文本 2、使用字体文件名作为标识&#xff0c;而不是字体名。如msya&#xff1a;微软雅黑&#xff0c;simkai&#xff1a;楷体&#xff0c;simsun&#xff1a;宋体。 3、把字体…