基础收发
数据收发概述:
zigbee无线通讯模块需要高频载波来提供发射效率,模块之间可以正常收发数据的前提是把接收的频率和发射的频率设置一致;
zigbee有一共27个载波频率可以用来通讯,载波又叫信道,无线通讯通道。这些载波的频率落在某些频率段,把这些段叫做频段;
在TI生产的Zigbee中,所有支持zigbee的芯片都只能在2.4GHz这个频段进行通讯;此频段内设置了16个信道;
11号信道,2405MHz;
12号信道,2410MHz;
13号信道,2415MHz;
。。
26号信道,2480MHz;
两个模块只有在同一个信道上才能进行通讯组网,并且在一个网络中,zigbee模块需要对两个这地址进行配置来相互之间进行连接:
zigbee模块的网络地址:在zigbee模块组成的局域网里,每一个模块都有唯一的2个字节的长度的地址,这个地址叫做网络地址。
zigbee模块的PANID:不同组的局域网的编码地址,长度为2字节,用来区别不同的局域网;
一个Zigbee模块要想和另一个模块建立基础的连接,就必须要首先选择相同的信道,其次配置自己的网络地址,并且还要配置局域网的编码地址。当然最先要开启的还是片上的射频模块外设,对一系列的寄存器赋值初始化以后,而且注意发送和接收的两个模块对相关寄存器的配置是完全相同的:
/*关闭总中断----------------------------------------------------------------------------------*/
EA=0;//首先需要先关闭全部的中断
/*射频模块的默认基础配置---------------------------------------------------------------------*/
FRMCTRL0 |= 0x60;
TXFILTCFG = 0x09;//推荐的接收设置
AGCCTRL1 = 0x15;
FSCAL1 = 0x00;
/*开启接收中断的寄存器,-----------------------------------------------------------------------*/
RFIRQM0 |= 0x40;//把射频接收中断打开
IEN2 |= 0x01; //启用普通射频中断
/*---------------------------------------------------------------------------------------------
*配置信道
*第一个参数是:MIN_CHANNEL 固定值,必须是11
*第二个参数是:channel 可选择的值11、12、13、、、25、26,分别对应了16组信道
*第三个参数是:MIN_CHANNEL 固定值,必须是11
*第四个参数是:CHANNEL_SPACING 固定值,必须是5
*在信道的选择上,11号信道对应的是2405MHz,12号对应的是2410MHz,频率依次递增5MHz*/
FREQCTRL =(11+(25-11)*5); //设置载波为2475M
/*配置局域网的编码地址,两个模块之间通讯需要是在同一个局域网编码地址下--------------------------
*局域网的编码地址长度2个字节,需要分别对高八位和第八位进行设置*/
PAN_ID0=0x07;
PAN_ID1=0x20; //0x2007
/*射频中断配置-------------------------------------------------------------------------------*/
RFST = 0xEC;//清接收缓冲器 对应了128字节的ram
RFST = 0xE3;//开启接收使能
EA=1;//打开总中断
在上述的代码块中只配置了网络的编码地址,还需要配置具体的模块本身的网络地址,其本身的网络地址同样是2个字节的,分别需要配置SHORT_ADDR0和 SHORT_ADDR1寄存器
例如把模块的网络地址配置成为2050:
//设置本模块地址 设置本模块的网络地址0x2050
SHORT_ADDR0=0x50;
SHORT_ADDR1=0x20;
对模块的网络地址的配置可以在射频模块的输出化之后进行;
发送和接收基础配置
完成上述基础的寄存器的配置以后就可以对发送和接收相关的寄存器来进行配置了。
在CC2530芯片内集成了两块128字节的RAM,分别是发送缓冲区和接收缓冲区,当需要发送数据到时候,先把发送缓冲区RAM的数据更新,再执行发送的程序,接收也是一样。
在初始化中线要把接收缓冲区的RAM清除,开启相关中断寄存器以后,一旦模块捕捉到了数据就会存放近接收缓冲区的RAM中,同时触发中断。这时候读取接收缓冲区内的数据即可,随后再把接收缓冲区的数据清除,开启接收中断,等待下一次的数据接收。
发送过程如下代码块所示:
//要发送的数据包的内容,需要把这些数据储存近发送缓冲区的RAM内
char SendPacket[]={0x19, //要发送的字节长度,发送配置相关的数据是9个字节,之后是数据的字节,最后是两个字节的校验码数据
0x61, //配置数据1
0x88, //配置数据2
0x00, //配置数据3
0x07, //配置数据4:PAN_ID0,局域网的编码地址,低八位
0x20, //配置数据5:PAN_ID1,局域网的编码地址,高八位
0xEF, //配置数据6
0xBE, //配置数据7
0x20, //配置数据7:SHORT_ADDR1,模块再局域网中的网络地址,高八位
0x50, //配置数据8:SHORT_ADDR0,模块再局域网中的网络地址,低八位
'h','e','l','l','o',' ','l','i','u',' ','z','z','\r','\n' //要发送的数据的内容
};
char i;
/*发送初始的寄存器操作。为数据发送做好准备工作*/
RFST = 0xEC; //确保接收是空的,再重复对发送缓冲区RAM清空
RFST = 0xE3; //清接收标志位
while (FSMSTAT1 & 0x22);//等待射频发送准备好
RFST = 0xEE;//确保发送队列是空
RFIRQF1 &= ~0x02;//清发送标志位
/*把要发送的数据全部压到发送缓冲区里面*/
for(i=0;i<0x19;i++)
{
RFD=SendPacket[i]; //向发送缓冲区的128个字节的RAM内写入数据
}
RFST = 0xE9; //这个寄存器一旦被设置为0xE9,发送缓冲区的数据就被发送出去
while(!(RFIRQF1 & 0x02) );//等待发送完成
RFIRQF1 = ~0x02;//清发送完成标志
接收部分的代码:
void rive_data()
{
static char len; //定义接收的数据的长度
static char ch; //定义接收到的单个字节
static char Alllen; //定义接收到的数据包的全部长度
len=ch=0;
RFIRQM0 &= ~0x40;
IEN2 &= ~0x01; //先关闭接收中断
EA=1; //先关闭总中断
len=RFD;//读第一个字节判断这一串数据后面有几个字节;
Alllen=len; //转存接收到的全部数据包的长度
/*只要要后面还有数据那么就把他都从接受缓冲区取出来*/
while (len>0)
{
ch=RFD;
if((len>=3)&&(Alllen-len>=9)) //判断是否已经循环到了数据包内数据的地址
{
Uart0SendByte(ch); //把单个的字符串数据发送到串口上
}
len--;
}
EA=0; //启用总中断
RFIRQM0 |= 0x40; //启用普通射频中断
IEN2 |= 0x01; //开启接收中断
}
射频接收中断函数的代码:
/*射频中断函数*/
#pragma vector=RF_VECTOR
__interrupt void RF_IRQ(void)
{
EA=0;
if( RFIRQF0 & 0x40 )
{
RevRFProc();
RFIRQF0&= ~0x40; // Clear RXPKTDONE interrupt
}
S1CON= 0; // Clear general RF interrupt flag
RFST = 0xEC;//清接收缓冲器
RFST = 0xE3;//开启接收使能
EA=1;
}