- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于MC13213的单芯片ZigBee平台的物理层协议研究与实现
SPI命令通道是Modem与MCU之间的主要交互方式,使用标准的4线SPI进行通信。MCU通过SPI命令结构可以读/写Modem的寄存器内容、设置Modem的初始化参数、读取Modem的状态和控制信息。IRQ中断为Modem提供了一种通知MCU有关Modem内部所发生事件的方法,这样就免除了MCU一直轮询Modem,降低了MCU的运行开销。ATTN用来把Modem从低功耗模式唤醒,RXTXEN用来允许Modem的发送、接收和CCA等操作。GPIO1引脚反映了Modem收发机是否忙,GPIO2引脚可以反映所接收数据包的循环冗余校验CRC(Cyclical Redundancy Check)是否有效或者反映CCA的结果[6]。
2.2 Modem的SPI事务操作
SPI事务是在标准SPI协议基础上实现的一个扩展SPI协议。由于Modem中的寄存器和RAM大小都配置为16 bit即一个字(word)的宽度,所以它规定了每次SPI事务过程必须由1 B的头(header)和2×N B的载荷(payload)组成,每个字节对应一个SPI脉冲(SPI burst),其中1≤N≤64,且为整数,代表每个SPI事务中所包含的字(word)数,当N=1时,称为SPI单次事务(SPI singular transaction);其他情况称为SPI循环事务(SPI recursive transaction)。header的最高位为R/W位,表示操作类型是读还是写;header的低6位是寄存器地址,表示了SPI操作的64个可能的寄存器地址(注意,有一部分寄存器没有实现)。
2.3 Modem的数据传输模式
Modem定义了两种数据传输模式:Stream模式和Packet模式。在Stream模式中,数据的发送和接收是逐字(word-by-word)处理的。而在Packet模式中,发送时,发送方先将待发送数据缓存在Modem的发送缓冲区(TX RAM)中,然后再发送;接收时,接收方先在接收缓冲区(RX RAM)中缓存收到的整个数据包,然后再通知MCU来读取。虽然Packet模式下数据的接收有稍许延迟,但其降低了对MCU的资源要求[7],在本协议栈实现过程中使用这种数据传输模式。
3 物理层构件设计
基于MC13213单芯片的ZigBee平台实现物理层协议构件程序的设计,首先必须编写底层硬件驱动程序,然后设置Modem的运行方式,再进行数据包收发程序的设计等。
3.1 底层硬件驱动程序的实现
硬件驱动程序介于底层硬件和ZigBee协议栈之间,可以使得运行于硬件之上的ZigBee协议栈更易于维护和移植。其中芯片初始化程序对MCU的一些硬件模块进行正确的配置,以保证MCU可以正常工作。这里所做的主要配置包括:关闭看门狗,设置内部时钟模块的校准(trim)值,配置MCU的时钟模块等。
初始化完成后会涉及到SPI循环事务的实现,下面以Packet模式下发送和接收3 B数据的完整过程来描述对Modem RX/TX RAM的SPI循环读写操作,如图3所示。其中,RX/TX RAM的长度为128 B。图中假定MCU均是以字节数组的形式来保存待发送或接收到的数据。
从图3可以看出,读/写RAM时的SPI通信是最高有效位优先(MSB-first)的,而在无线发送/接收过程中是最低有效位优先LSB-first(Least Significant Bit first)的,但在编写SPI循环读写操作时并不需要考虑上述两种顺序,也并不会导致接收方在接收发送方的数据时产生比特位顺序的改变。
需要特别注意的是,由于SPI事务要求所有的数据传输都是按16 bit宽度进行的,当发送数据是奇数个字节时,其最后一字节数据要进行特别处理,即需填充一个任意字节以凑满16 bit宽度,但是这个拼凑的字节和最后那个有效字节的发送顺序必须按照图3中的顺序进行,即先发填充字节,以保证在TX RAM中,最后一字节紧跟在前面的偶数个字节之后。而在最后一字节数据之前的偶数个字节数据由于是16 bit宽度的倍数,所以在发送每个字时对字节发送顺序没有特别要求,只要接收方和发送方按照同一种顺序收发各字节即可。
3.1.1 使用SPI循环写事务向TX RAM中写入待发送数据
执行这个操作之前,待发送数据长度应已经写入TX_Pkt_Control寄存器的tx_pkt_length[6:0]字段。
MCU向TX RAM中写入待发送数据的一般流程如下:
(1)根据需要配置TX_Pkt_Control寄存器的tx_ram2_select位,以选择使用两块TX RAM中的一块。
(2)计算写入待发送数据所需要的SPI脉冲个数,注意:
①CRC字节不需写入到TX RAM中,它是由硬件自动产生的;
②待发送数据的最大长度为125 B(去掉2 B的CRC);
③必须为偶数个字节,若数据长度为奇数个字节,应加1使其变为偶数。
(3)做一个SPI循环写事务来写入数据:
①MCU拉低SPI模块的片选信号CE,选中Modem;
②MCU向Modem发送第一个SPI脉冲,其中R/W位应为0,表示写操作;
③按照(2)中计算的SPI脉冲个数,写入待发送数据;
④MCU拉高CE,使片选失效;
(4)整个写操作结束。
3.1.2 使用SPI循环读事务读取RX RAM中的已接收数据
MCU读取RX RAM中的已接收数据的一般流程如下:
(1)MCU读Modem的RX_Status寄存器rx_pkt_latch[6:0]字段以获取数据长度。
(2)计算读取RX RAM中的已接收数据所需要的SPI脉冲个数:
①通常不读取2 B的CRC,所以数据长度应减去2;
②若数据长度为奇数个字节,应加1使其变为偶数;
③按照Modem SPI事务协议的规定,应丢弃读到的第一个字(word),因为在第一次读取时,内部RAM的地址还没有准备好,这样又导致了数据长度加2。
(3)做一个SPI循环读事务来读取数据:
①MCU拉低SPI模块的片选信号CE,选中Modem;
②MCU向Modem发送第一个SPI脉冲,其中R/W位应为1,表示读操作;
③按照(2)中计算的SPI脉冲个数读取所有数据。注意,协议规定应丢弃读到的第一个字(word)。当数据为奇数个字节时,应丢弃图3中的那个填充字节;
④MCU拉高CE,使片选失效。
(4)整个读操作结束。
3.2 设置Modem运行模式
Modem有多种运行模式,主要可分成两类:活动模式和低功耗模式。其中活动模式包括Idle模式、Receive(RX)模式、Transmit(TX)模式和CCA/ED模式;低功耗模式包括Off模式、Hibernate模式、Doze模式[8]。
Idle模式是Modem退出任何其他模式后的默认模式,也是进入任何其他模式的初始模式;RX、TX模式分别为Modem接收、发送数据时所处的工作模式;CCA/ED模式为空闲信道评估/能量检测时所处的工作模式,用来评估信道是否空闲或测量信道的当前能量值[8]。
作者:吴瑾 潘启勇 王宜怀 来源:电子技术应用