CC2530收发机制总结
目的:修改TI的basic_rf,使其只实现发送和接收数据的功能,去掉原来发送时,对数据的处理,加MAC帧头等。 1. 发送过程:
basicRfSendPacket函数修改如下:
//mpduLength = basicRfBuildMpdu(destAddr, pPayload, length);
上一句是将数据打包的过程,我们注释掉
#ifdef SECURITY_CCM
halRfWriteTxBufSecure(txMpdu, mpduLength, length, BASIC_RF_LEN_AUTH, BASIC_RF_SECURITY_M);
txState.frameCounter++; // Increment frame counter field
#else
txMpdu[0]=0x0A;
txMpdu[1]=0x12;
txMpdu[2]=0x12;
txMpdu[3]=0x12;
txMpdu[4]=0x12;
txMpdu[5]=0x12;
txMpdu[6]=0x12;新东泰娱乐广场
txMpdu[7]=0x12;
txMpdu[8]=0x12;
txMpdu[]是存储要写入发送缓冲区的帧的数组,这里我们定义成简单的格式:
len | len-2byte的数据(即0x12,0x12,…) | FCS 2byte |
| | 一升车 |
halRfWriteTxBuf(txMpdu, 11);
而这里写入缓冲区的发送数据长度也要加1,8个字节数据,2字节FCS,一个字节的len域,原本是halRfWriteTxBuf(txMpdu, mpduLength);
#endif
// Turn on RX frame done interrupt for ACK reception
halRfEnableRxInterrupt();
// Send frame with CCA. return FAILED if not successful
if(halRfTransmit() != SUCCESS) {
status = FAILED;
}
发送时需要注意的地方:
绍兴市树人中学
渝安集团1) 要发送的数据的数据长度一定要大于等于5个字节,因为802.15.4中对于发送帧的长度有最小要求,>=5字节。
2) 因为我们去掉了对数据的打包过程,打包过程是将MAC帧头和PHY的PHR加上,我们不需要打包MAC帧头的过程,但是发送机制一定要加上PHR中len长度域,所以在发送数据的第一个字节赋值为长度域,即txMpdu[0]。len的长度为发送字节数+2。
2. 接收过程:
在发送过程完成之后,通过Packet Sniffer抓包软件检测到发送节点能向外发送数据。接下来就是利用原版的接收节点来测试是否能接收到发送节点向外传播的帧。 对于接收节点程序,如果从无线电中接收到帧,程序就跳入中断服务程序basicRfRxFrmDoneIsr(),但是在发送节点不停发送如上特定帧的过程中,接收节点并未跳入接收中断程序。这里就是我们特别需要注意的地方,CC2530是默认开启帧过滤功能的,寄存器FRMFILT0的0位默认为1,即开启帧过滤功能。如果接收到的帧不符合802.15.4中对接受接收到的帧的要求,则过滤该帧。我们发送的数据帧格式是随意设置的,
即上文中的txMpdu[1]到txMpdu[8]的字符,该帧未必符合接收帧的要求,所以我们看不到接收节点接收该帧,而是把它抛弃掉了。
所以要在初始化函数halRfInit()中加入如下代码:FRMFILT0 &= ~(1<<0);//禁止帧过滤,added by DSJ。
即uint8 halRfInit(void)
{
FRMCTRL0 |= (AUTO_ACK | AUTO_CRC);
// Recommended RX settings
TXFILTCFG = 0x09;
AGCCTRL1 = 0x15;
FSCAL1 = 0x00;
FRMFILT0 &= ~(1<<0);//禁止帧过滤,added by DSJ
…
}波希米亚人
单列向心球轴承
在禁止帧过滤之后,发送接收程序能跳入接收中断函数,但是这还不够,需要修改接收中断函数,将接收到的数据提取出来。