基于MC13213的单芯片ZigBee平台的物理层协议研究与实现
其中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]。
收发机状态设置是通过调用设置收发状态函数实现的,其函数头如下:
//-----------------------------------------*
//功能: 设置收发机状态函数,把收发机设置成用户期望的状态
//参数: nDesiredStatus - 用户期望状态
//返回: SUCCESS - 成功设置成指定模式;
// 等于用户期望模式-收发机之前就处于用户期望状态;
// 其他 - 表示执行失败;
//说明: 无
//----------------------------------------*
INT8U PLMESetTRXState(INT8U nDesiredStatus);
3.3 物理层数据包的收发
物理层数据称为物理层数据单元PPDU(PHY Protocol Data Unit),包括同步包头、物理层包头和物理层载荷三部分[3],如图4所示。其中同步包头可以使得接收设备锁定在比特流上,并与比特流保持同步;物理层包头包含了数据包的长度信息,在0~127之间;物理层服务数据单元PSDU(PHY Service Data Unit)也称物理层载荷,携带MAC层的帧信息,即MAC层协议数据单元MPDU(MAC Protocol Data Unit)。注意,CRC检验字节包含在PSDU中的最后两字节中。
物理层数据包的发送和接收比较简单,对于MC13213的Modem来说,用户所要做的只是调用SPI循环事务写入或读取物理层包头和载荷,然后拉高RXTXEN引脚使能Modem的发送和接收即可。PPDU的同步包头是由硬件自动添加的。
(1)物理层数据包的发送
Packet模式下发送数据包的过程是在物理层数据请求函数中实现的,在函数实现过程中,应根据要求,向上层通知数据发送结果的状态信息。其函数头如下:
//------------------------------------------------*
//功能: 数据请求函数,生成物理层协议数据单元(PPDU)并无线发送出去
//参数: nPSDULength-物理层PSDU(即MAC层的MPDU)中的字节数,
// 长度要<=aMaxPHYPacketSize(物理层最大数据包容量)
// pPSDU - 指向物理层PSDU数据的指针
//返回: SUCCESS - 发送成功;其他值 - 发送失败
//说明: 由MAC层调用
//-----------------------------------------*
INT8U PDDataRequest(INT8U nPSDULength, INT8U *pPSDU);
(2)物理层数据包的接收
一般情况下,Modem的接收机是关闭的。当Modem接收机处于打开状态时有其他Modem在同一信道上发送数据,则Modem会接收到这些数据。
本协议栈实现Packet模式下接收数据包时,为物理层数据包实现了一个环形的接收缓冲区,以保证数据的及时可靠接收,其结构定义如下:
//PSDU最大数据包长度(不包括CRC)
#define PSDUMaxLen 125
//PSDU数据包定义
typedef struct PSDURxPacket_tag
{ INT8U m_nLen;
INT8U m_nData[PSDUMaxLen];
INT8U m_nStatus;
INT8U m_nLQI;
} PSDURxPacket_t;
//PSDU数据接收缓冲区个数
#define PSDURxBufferNum 8
//PSDU数据接收缓冲区定义
typedef struct PSDURxBuffer_tag
{ INT8U m_nPSDUCount;
INT8U m_nHead;
INT8U m_nTrail;
PSDURxPacket_t m_sPSDU[PSDURxBufferNum];
} PSDURxBuffer_t;
//定义PSDU环形接收缓冲区
static PSDURxBuffer_t s_sPSDURxBuffer;
3.4 其他编程相关说明
空闲信道评估(CCA)用来判断信道是否空闲。能量检测(ED)用来测量目标信道中接收信号的功率强度,由于这个检测本身不进行解码操作,所以检测结果是有效信号功率和噪声信号功率之和。另外,链路质量指示(LQI)提供了接收数据包时无线信号的强度和信道质量信息。与能量检测不同的是,LQI要对信号进行解码,生成的是一个信噪比指标。这个信噪比指标和物理层数据单元一起提交给上层处理。Modem中RX_Status寄存器的cca_final[7:0]字段保存了以上操作的结果值。
当Modem完成MCU指定的某个功能(如发送完成、接收完成、CCA/ED完成等),就会产生IRQ中断,然后MCU会读取Modem的IRQ状态寄存器,针对不同的IRQ中断类型分别进行处理
- 四种短距离无线监控解决方案的性能对比(09-16)
- 基于MCF5213及Zigbee无线(09-12)
- 面向低速率应用的全球标准ZigBee (上)(09-27)
- 面向低速率应用的全球标准ZigBee (下)(09-27)
- Wibree:一个可供选择的新无线联网技术(11-07)
- 基于ZigBee技术的家居智能无线网络系统(01-11)