7816时序

7816时一个比较早的老通讯时序了,最近项目上需要用UART模拟所以,简单学习时序。

时序比较简单,熟悉UART的一眼看着就像是串口的时序,只是他没有停止位,取而代之的就是保护时间guradtime,一般是两个etu所以可以使用两个停止位来模拟。电路图上就是将RX和TX短接,在发送关闭串口的接受功能反之接收时关闭发送功能就可以了。

APDU指令

1、报文格式。

C-APDU有4字节的必备长度和1个可变长度条件体组成

CLA:命令报文类别字节

INS:命令报文指令字节

P1:参数1

P2:参数2

LC:条件体数据域的实际长度

DATA:数据域

Le:期望返回数据的长度

CLA  INS P1 P2 LC  DATA  Le 这里需注意的就是在物理链路上给卡发送APUD指令时需要按一下时序发送,先发送前5个字节然后等待卡回应INS 后才可继续发送余下的DATA,LE可以没有。

串口模拟7816参考程序

初始化同普通接口初始化相同

初始化代码

  1. GPIO_InitTypeDef GPIO_InitStructure;
  2. NVIC_InitTypeDef NVIC_InitStructure;
  3.  
  4. USART_InitTypeDef USART_InitStructure;
  5. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  6. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  7.  
  8. GPIO_InitStructure.GPIO_Pin = FM151_TXD_PIN;
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  11. GPIO_Init(FM151_PORT, &GPIO_InitStructure);
  12. GPIO_InitStructure.GPIO_Pin = FM151_RXD_PIN;
  13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15. GPIO_Init(FM151_PORT, &GPIO_InitStructure);
  16.  
  17. USART_InitStructure.USART_BaudRate = 9600;
  18. USART_InitStructure.USART_WordLength = USART_WordLength_9b;//9位数据
  19. USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位
  20. USART_InitStructure.USART_Parity = USART_Parity_Even;//偶校验
  21. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制失能
  22. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送和接受使能
  23. USART_Init(USART3, &USART_InitStructure);
  24.  
  25. //Usart1 NVIC 配置
  26. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  27. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4 ; //抢占优先级4
  28. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0
  29. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  30. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  31.  
  32. USART_Cmd(USART3, ENABLE);
  33.  
  34. USART_ITConfig(USART3, USART_IT_RXNE, DISABLE); //开始都不允许接受中断

这里采用中断接受,所以需要字节实现自己的中断服务函数。

发送数据

  1. static void UartSendByte(u8 *dat)
  2. {
  3.  
  4. while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
  5. USART_SendData(USART3, *dat);
  6.  
  7. while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
  8. USART_ClearFlag(USART3, USART_FLAG_TC);
  9.  
  10. delay_us(guardtime);
  11. }

发送一定字节数据

  1. void SendData(u8 *data, u16 datalenth)
  2. {
  3. u16 i;
  4. SetUartDir(TX);
  5. for (i = 0; i < datalenth - 1; i++)
  6. {
  7. UartSendByte(data + i);
  8. }
  9. UartSendLastByte(data + i);
  10. SetUartDir(RX);
  11. }

这里注意最后一个字节不需要额外的保护时间。最后就是配置UART的接受和发送的寄存器函数。

  1. void SetUartDir( u8 dir)
  2. {
  3. u32 reg;
  4. //发送时禁止接收,发送完成才开始接收
  5. if (dir == RX)
  6. {
  7. reg = USART3->CR1;
  8. reg |= USART_Mode_Rx;
  9. reg &= (~USART_Mode_Tx);
  10. USART3->CR1 = reg;
  11.  
  12. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  13. }
  14. else if (dir == UART_TXD)
  15. {
  16. reg = USART3->CR1;
  17. reg |= USART_Mode_Tx;
  18. reg &= (~USART_Mode_Rx);
  19. USART3->CR1 = (u16)reg;
  20.  
  21. USART_ITConfig(USART3, USART_IT_RXNE, DISABLE);
  22. }
  23. }

7816协议时序和采用UART模拟7816时序与智能卡APDU指令协议的更多相关文章

  1. 基于51的串行通讯原理及协议详解(uart)

    串行与并行通讯方式并行:控制简单,传输速度快.线多,长距离成本较高且同时接受困难.串行:将数据字节分成一位一位的行驶在一条传输线上进行传输.如图:   同步与异步串行通讯方式同步串行通讯方式:同步通讯 ...

  2. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

     版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...

  3. 在网络7层协议中,如果想使用UDP协议达到TCP协议的效果,可以在哪层做文章?(QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?)

    为了解决这题,可以具体看看下面这个讨论. 解灵运工程师 185 人赞同 某次架构师大会上那个58同城做即时通信的人说:原因是因为当时没有epoll这种可以支持成千上万tcp并发连接的技术,所以他们使用 ...

  4. 使用软件模拟spi 时序时注意点

    软件模拟 spi 时序有以下几个点需要注意: cs 使能后到第一个 sck 边沿需要延时. 最后一个sck 边沿到下一个 cs 需要延时. sck 的高电平和低电平本身需要维持时间. mosi 需要先 ...

  5. SMB协议利用之ms17-010-永恒之蓝漏洞抓包分析SMB协议

    SMB协议利用之ms17-010-永恒之蓝漏洞抓包分析SMB协议 实验环境: Kali msf以及wireshark Win7开启网络共享(SMB协议) 实验步骤: 1.查看本机数据库是否开启,发现数 ...

  6. (转) HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手、TCP/IP协议基础、加密学)

    HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手.TCP/IP协议基础.加密学) 原文:http://blog.csdn.net/itermeng/article/detai ...

  7. JZOJ【NOIP2013模拟联考14】隐藏指令

    JZOJ[NOIP2013模拟联考14]隐藏指令 题目 Description 在d维欧几里得空间中,指令是一个长度为2N的串.串的每一个元素为d个正交基的方向及反方向之一.例如,d = 1时(数轴) ...

  8. 用I/O口模拟总线时序

    在做总线通信过程中,我们很少会用到这样方法,一般在我们选择MCU的时候都会带有你所需要的通信接口.但是,对于一些简单的通信应该用的场合,一般在一些传感器的数据通信过程中,传感器厂商会将通信协议做一些改 ...

  9. S5PV210之GPIO模拟I2c时序之pcf8591与at24xx linux3.0.8驱动

    目录:一. 说明 二. 驱动程序说明及问题 三. 案例一       四. 案例二 一. 说明 mini210开发板上带了at24c08, 看了linux内核自带的at24.c的驱动程序,编译下载到看 ...

随机推荐

  1. mysql 设置外键约束时如何删除数据

    Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构 解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sql语句,重新 ...

  2. matlab gui matlab gui 鼠标点击显示图像颜色值

    首先看看效果 ‍ 首先功能说明下,运行后通过myfile菜单打开一幅图片之后在axes中显示,由于要使用图片的放大缩小等功能将figure 的菜单栏与工具栏都一并打开了. 界面编程主要是callbac ...

  3. Hive语法小释

    阅读本文你可以获取: 1.数据库的查询 2.hive表的基本操作(建表三种常用方式.删除表.修改表.加载数据.内外表转换.添加分区.复制数据) 3.SQL到HiveQL的的一些不同点 1.   基本操 ...

  4. QT串口助手(四):数据发送

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 实现的功能 串口数据的发送 ascii字符与hex字符的相互转换 自 ...

  5. 五万字长文带你学会Spring

    Sping Spring概念介绍 spring是啥呢,你在斗地主的时候把别人打爆了那叫spring, 你成功的追到了你爱慕已久的女神,人生中的春天来了,那也叫sping 好了别看我老婆了,咱来讲讲啥是 ...

  6. Jmeter的客户端实现与Keep-Alive

    Jmeter的客户端实现与Keep-Alive 目录 Jmeter的客户端实现与Keep-Alive 0. 结论 1.缘起 1.1 起因 1.2 初步尝试 1.3 Jmeter客户端实现 1.4 Ja ...

  7. js异步、事件循环(EventLoop)小结

    单线程 众所周知,JS是单线程的语言,之所以是单线程,用一句烂大街的话就是,如果两个线程同时操作一个DOM节点,那么该以哪个为准呢,虽然多线程也有办法解决,但是js毕竟是浏览器脚本语言,不需要那么复杂 ...

  8. (十六)配置多数据源,整合MybatisPlus增强插件

    配置多数据源,整合MybatisPlus增强插件 多数据简介 MybatisPlus简介 1.案例实现 1.1 项目结构 1.2 多数据源配置 1.3 参数扫描类 1.4 配置Druid连接池 1.5 ...

  9. 利用Javascript制作网页特效(时间特效)

    在网页中经常可以看到各种各样的动态时间显示,在网页中合理地使用时间可以增加网页的时效感. 显示当前时间 getHours().getMinutes().getSeconds()分别获得当前小时数.当前 ...

  10. JS 实现一个实时动态校验,将输入格式错误的显示为红色背景

    功能描述: 源码: 功能描述: 实时动态校验,如果输入的格式错误,将弹窗提示输入格式错误并将背景展示为红色. 源码: 前台: <hy:formfield name="cxfdl&quo ...