基于MC13213的单芯片ZigBee平台的物理层协议研究与实现
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脉冲,
- 四种短距离无线监控解决方案的性能对比(09-16)
- 基于MCF5213及Zigbee无线(09-12)
- 面向低速率应用的全球标准ZigBee (上)(09-27)
- 面向低速率应用的全球标准ZigBee (下)(09-27)
- Wibree:一个可供选择的新无线联网技术(11-07)
- 基于ZigBee技术的家居智能无线网络系统(01-11)
