fm1702终于调试成功了

这是我调试过最狗屎的程序了。首先是FM1702手册写得太狗屎了,几乎就把寄存器列出来而已,原理没有什么解释的。虽然写程序不用了解很多原理但是至少把流程将清楚一点吗。出一个芯片让用户猜怎么用,这是什么意思啊?再者ISO/IEC 14443A也没有完全将命令怎么使用,我发送一个命令到底给我返回什么?你的告诉我吧。

 

从最上层来讲有这么一些步骤:

1.配置FM1702芯片,包括复位等

2.寻卡

1)失能接收CRC、发送CRC、奇偶校验

2)关闭加密单元

3)清空FIFO

4)发送0x52到FIFO

5)发送Transceive(0x1E)命令到Command(0x01)

6)等待FIFO的长度为2时,读出FIFO中数据(这是卡的类型)

3.读取S50卡号

1)向Command中写Idle,反正当前还运行着其他命令

2)清空FIFO

3)向RegDecoderControl(0x1A)写0x28,所有接收到的冲突位之后的数据置0

4)向RegControl(0x09)写0x08,打开加密单元

5)向FIFO写0x93、0x20

6)向Command中写Transceive

7)等待卡返回卡号,当FIFO==4时说明收到卡号并读出FIFO中的卡号

 

4.选卡

1)使芯片进入空闲模式,向Command中写Idle,反正当前还运行着其他命令

2)向RegChannelRedundancy(0x22)写0x0F,使能接收CRC、发送CRC、奇偶校验

3)向RegControl(0x09)写入0x08,打开加密单元

4)清空FIFO

5)向FIFO写入0x93+0x70+卡号(4个字节)+卡号的BCC校验

6)向Command中写Transceive

7)等待卡返回卡号,当FIFO==1时说明收到卡的容量并

 

 

4.密码认证

1)加载密码:改变密码格式(具体查手册),得到的12字节密码数据发送到FIFO,然后向Command写入LoadKey(0x19)加载密码到密码缓存中

2)等待1)完成后 向FIFO写PICC_AUTHENT1A(0x60)或PICC_AUTHENT1B(0x61)+块绝对地址+4字节S50卡号,然后向Command写入PCD_AUTHENT1(0x0C)进行第一步认证,等待芯片进入空闲模式

3)清空FIFO,向Command写PCD_AUTHENT2(0x14),进行认证第二步,并等待进入空闲模式

4)读RegControl(0x09)看Crypto1On位是否置1,置1表示认证成功了

 

5.读写S50卡

1)读:向FIFO写PICC_READ(0x30)+块得绝对地址,向Command写Transceive,等待FIFO长度为16,然后读出来

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
FM1702是一种高性能非接触式IC卡芯片,广泛应用于门禁、物流、一卡通等领域。编写FM1702驱动代码可以实现对FM1702芯片进行读写操作,以下是一个简单的FM1702驱动代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <wiringPi.h> #include <wiringPiSPI.h> #define FM1702_CS_PIN 10 #define FM1702_RST_PIN 9 void fm1702_reset() { digitalWrite(FM1702_RST_PIN, LOW); usleep(200); digitalWrite(FM1702_RST_PIN, HIGH); usleep(1000); } void fm1702_write_command(unsigned char cmd) { unsigned char buffer[2] = { 0x80, cmd }; wiringPiSPIDataRW(0, buffer, 2); } unsigned char fm1702_read_byte() { unsigned char buffer[2] = { 0x00, 0x00 }; wiringPiSPIDataRW(0, buffer, 2); return buffer[1]; } void fm1702_write_byte(unsigned char data) { unsigned char buffer[2] = { 0x01, data }; wiringPiSPIDataRW(0, buffer, 2); } int main() { wiringPiSetup(); wiringPiSPISetup(0, 500000); pinMode(FM1702_CS_PIN, OUTPUT); pinMode(FM1702_RST_PIN, OUTPUT); fm1702_reset(); fm1702_write_command(0x60); // 发送读卡操作指令 fm1702_write_byte(0x00); // 发送地址数据 unsigned char data = fm1702_read_byte(); // 读卡数据 printf("Read data: 0x%X\n", data); return 0; } ``` 这是一个使用wiringPi库编写的FM1702驱动代码示例,首先需要在代码中定义FM1702芯片的片选引脚(CS)和复位引脚(RST)。在main函数中,首先进行wiringPi的初始化并设置SPI通信频率。然后通过fm1702_reset函数对芯片进行复位操作,接着使用fm1702_write_command函数发送读卡操作指令,并使用fm1702_write_byte函数发送卡片地址数据。最后使用fm1702_read_byte函数读取芯片返回的数据,并打印出来。 注意,以上是一个简单的FM1702驱动代码示例,实际应用中可能还需要实现其他功能,如写卡操作、读取更多数据等,具体实现要根据实际需求进行扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值