胜达电子学习笔记:lesson5
ZigBee无线通信概念实验、抓包
- 5.无线通信概论
- 5.1 理解 Lesson5-Send
- `main`:主函数
- `halRfInit`:射频初始化
- `RFSend`:无线数据发送出去
- SendPacket 数组
- 5.2 理解 Lesson5-Receive
- RevRFProc() 无线接收函数
- 5.3 抓包软件Packet Sniffer
- 5.4 如何改成发送字符串?
5.无线通信概论
✔ 掌握 ZigBee 网络里的相关重要概念,打造自己的无线通信,并掌握捕捉查看空气中的 IEEE802.15.4 无线协议。
✔ 掌握怎么用胜达 USBDongle 抓无线数据包。
新定义:信道、载波、频段
- zigbee无线通信,需要高频的载波来提高发射效率,zigbee模块之间要可以正常的收发,接收模块必须把接收频率设置和发射模块的载波频率一致。
- ZIgBee有27个载波可以进行通信,载波叫做信道(无线通信的通道)。这些载波的频率落在某些频率区段,我们把这些区段叫做频段。但TI所有支持Zigbee底层协议的芯片只能在2.4G频段的16个信道里进行通信。
- 2.4G频段:16个信道
- 11 - 2405M
- 12 - 2410M
- ··
- 26 - 2480M
- 915M评断/896M评断 11个信道
- 2.4G频段:16个信道
- 网络地址:在zigbee无线局域网里,每一模块都一个在该网络里有
唯一
的2个字节的地址,这个地址叫做网络地址或网络短地址。 - PANID:2字节的编码,用来区别不同的ZigBee无线局域网,也叫个域网ID(可能好几个zigbee是一个网络,另外几个zigbee是另一个网络)
ZigBee向外发送信号,是通过高频载波(信道)发射出去的(发送模块)
而发射出去后,想要被另一个的设备接受,那么另一个设备(接受模块)也要调成发射出去相同的载波频率
载波频率=信道,落在某些频段上
关于频段、信号、载波频率的关系理解图如下
5.1 理解 Lesson5-Send
main
:主函数
功能:初始化相关配置和 while 循环
注意:设置本模块地址的大小端模式
void main()
{
LS164_Cfg();//74LS164控制数码管的初始化
Init32M(); //主时钟晶振工作在32M
KeysIntCfg();
halRfInit();//无线通信的初始化 初始化相关的寄存器,配置工作信道,和PANID
SHORT_ADDR0=0x50;
SHORT_ADDR1=0x20;//设置本模块地址 设置本模块的网络地址0x2050
//大小端模式问题,
LS164_BYTE(1);
while(1);
}
halRfInit
:射频初始化
功能:无线通信初始化,初始化相关寄存器,配置工作信道 和 PANID
void halRfInit(void)
{
//默认配置
EA=0;
FRMCTRL0 |= 0x60;
// Recommended RX settings
TXFILTCFG = 0x09;
AGCCTRL1 = 0x15;
FSCAL1 = 0x00;
// enable RXPKTDONE interrupt
RFIRQM0 |= 0x40;//把射频接收中断打开
// enable general RF interrupts
IEN2 |= 0x01;
//信道与载波对应关系:11对应2405M,12对应2410M···25对应2475M
FREQCTRL =(11+(25-11)*5);//(MIN_CHANNEL + (channel - MIN_CHANNEL) * CHANNEL_SPACING);
//设置载波为2475M
PAN_ID0=0x07;
PAN_ID1=0x20; //0x2007 //个域网ID
//halRfRxInterruptConfig(basicRfRxFrmDoneIsr);
RFST = 0xEC;//清接收缓冲器
RFST = 0xE3;//开启接收使能
EA=1;
}
初始化我们需要改两个地方的内容:
- FREQCTRL:这里是信道与载波的对应关系,需要改成我们需要的载波
- PAN_ID0 和PAN_ID1:这里是 PANID 即个域网 ID(区分不同的网络的标识符,只有相同 PANID 的设备才能进行组网连接)
RFSend
:无线数据发送出去
功能:放在按键中断服务函数中,当按键被按下时,触发这个函数,将我们需要发送的数据给发送出去。
RFST = 0xE9; //这个寄存器一旦被设置为0xE9,发送缓冲区的数据就被发送出去
//pstr:需要发送的字符串
//len:字符串长度
void RFSend(char *pstr,char len)
{
char i;
RFST = 0xEC; //确保接收是空的,接收缓冲区清空
RFST = 0xE3; //清接收标志位
while (FSMSTAT1 & 0x22);//等待射频发送准备好
RFST = 0xEE;//确保发送队列是空
RFIRQF1 &= ~0x02;//清发送标志位
//为数据发送做好准备工作
for(i=0;i<len;i++)
{
//②把SendPacket数组的数据全部发出去
RFD=pstr[i];
} //循环的作用是把我们要发送的数据全部压到发送缓冲区里面
RFST = 0xE9; //这个寄存器一旦被设置为0xE9,发送缓冲区的数据就被发送出去
while(!(RFIRQF1 & 0x02) );//等待发送完成
RFIRQF1 = ~0x02;//清发送完成标志
}
SendPacket 数组
char SendPacket[]={0x0c,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};
//第一个字节0x0C含义,这个自己后面还有12个字节要发送(10+2)还有两个CRC校验码自动附加(SendPacket总共是11个字节)
//第5 6个字节表示的是PANID 0x07 + 0x20
//第7 8个字节是无线模块目标设备的网络地址 0xBEEF
//第9 10就是本地模块的网络地址 0x
//11 个字节是我们有用的数据
// CRC码 12 13个字节 是硬件自动追加
5.2 理解 Lesson5-Receive
RevRFProc() 无线接收函数
功能:当进入接收中断时,进入这个函数,读取 SendPacket 数组,获取SENDVAL值
void RevRFProc()
{
static char len;
static char ch;
len=ch=0;
RFIRQM0 &= ~0x40;
IEN2 &= ~0x01;
EA=1;
len=RFD;//读第一个字节判断这一串数据后面有几个字节;
//len=0x0C 12
while (len>0)
{//只要后面还有数据那么就把他都从接受缓冲区取出来
ch=RFD;
if(3==len)//倒数第三个数据是发送内容
{//如果倒数第三个字节等于7,那么我们把LED0取反
//执行相关操作,此时ch就是SENDVAL值
LS164_BYTE(ch);
}
len--;
}
EA=0;
// enable RXPKTDONE interrupt
RFIRQM0 |= 0x40;
// enable general RF interrupts
IEN2 |= 0x01;
}
5.3 抓包软件Packet Sniffer
注意:抓包前将仿真器与 **Receive **端相连
step1:选择合适的 ZigBee 型号(CC2530 选第二个)
step2:依次点击 1-2-3,注意 ② 中需要选择合适的信道,配置好后点击 ③,然后抓取 Send 端发来的数据,如下图中的黄色块中的数据 05
为 Send 端发来的数据。
5.4 如何改成发送字符串?
难点在于:要改一部分代码(先记下来要改哪些,以后自己再重新设计程序)
蓝色表示修改的是 Send 端
红色表示修改的是 Receive 端
最终效果:
再次提醒:抓包的话是将仿真器连接到 Receive 端