日月换新天。为有牺牲多壮志,敢教

三、PN532串口指令通信流程

需要重点阅读PN532 User Manual.pdf手册的第6章,该章节目录如下:

数据帧格式

任何成体系的通信协议都是由数据帧构成的,数据帧结构会在整个通信协议大部分环节中保持一致,个别协议会偶尔出现几个特殊帧指令用来实现特殊功能。试想这次由我们自己创作构建一套通信协议,无非包含这几个方面:包头,长度,负载,校验,包尾;如果是针对读写寄存器的帧结构,那么还包括:指令(读/写),寄存器地址,值(返回/写入)等;如果有1:N甚至N:M的总线架构,那么还要包括目标地址Target和来源地址Source(类似以太网帧)。

类似的,PN532与上位机之间通信协议也会有上面那些元素,让我们打开文档看一看,在PN532UM.pdf 6.2.1 Frames structure章节就是描述的数据帧格式,如下:

上图可以很容易看出:

  • 包头为00 00 FF(Preamble前缀 + Start of Packet Code起始代码),包尾为00(Postamble后缀)
  • 不定长数据帧,len为一个字节,len的计算从TFI(指令代码)到PDn(数据串最后一个byte)
  • LCS,用来提高LEN传输的准确性,计算公式为:LCS + LEN = 0x00
  • TFI,指令代码,只有两个指令,0xD4代表MCU->PN532; 0xD5代表PN532->MCU
  • DATA,数据负载
  • DCS,1字节校验,计算公式为:[TFI + PD0 + PD1 + … + PDn + DCS] = 0x00

OK,PN532的数据帧格式相对比较简单,相比我们上面自己设想的通信协议只是多了一个LCS的概念,从计算公式上来看,这是LEN的相反数。另外,数据负载段的校验数DCS,也是使用和校验的相反数来表示。

在PN532UM 的 6.2.1.2章节,介绍了一种长数据的扩展数据帧格式,我们基本上用不着,忽略。 在PN532UM 的 6.2.1.3- 6.2.1.5章节,介绍了ACK响应包的结构,NACK异常响应包的结构,以及出错包的结构,这里就不赘述了,毕竟我们总是期望能得到正确的响应。ACK包结构如下,非常简单:

在PN532UM 的 6.2.1.6章节,介绍了Preamble前导码和Postamble后导码的概念,这两个均是由不确定的字节数构成,PN532总是从Start Code00 FF来识别一个数据包的开头。

至此,我们对PN532的数据帧结构有了一个了解。

会话结构

PN532UM 6.2.2介绍了上位机与PN532之间的会话流程,如下:

如图,这是一次标准的数据帧收发流程,首先由主控MCU向PN532发送Command Packet,PN532接受到以后会立刻发送一个ACK给主控,然后经过一段时间处理,PN532会再发送一次Response Packet给主控,至于主控想不想再发一个ACK给PN532,这个PN532不强求。这是一种类似TCP连接的过程。图中右边的P70_IRQ是一根中断信号线的电平变化过程,如果使用UART来收发数据帧的话,这个信号可以忽略,使用串口RX中断就足够了,如果使用485芯片来处理,这根线可以来做485的使能开关。

PN532UM 6.2.2章节的后续内容还描述了发生错误时的会话流程,这里不表了,不重要。

接口差异

虽然在软件协议上面,数据帧格式都是一样的,但PN532提供的三种接口方式,UART,SPI,I2C在使用过程中还是有一些差异的。具体的接口使用的通信时序,在6.2.3,6.2.4,6.2.5以及6.3章节有详细的介绍,这里我们使用UART在115200波特率与PN532进行通信,没有特别的注意事项,此处不表了。

小结

这一章我们对PN532的通信协议有了一个总体的认知,详细了解了它的数据帧格式。下一章我们将对具体的指令集进行分析,并构建一整套的握手通信流程。

posted @   为敢技术  阅读(1675)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示