需要重点阅读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的通信协议有了一个总体的认知,详细了解了它的数据帧格式。下一章我们将对具体的指令集进行分析,并构建一整套的握手通信流程。