进阶讨论Zigbee之外RF(射频模块)

来源:互联网 发布:sql创建数据库语句 编辑:程序博客网 时间:2024/06/16 03:30

RF

这是没有协议的RF,主要接触的是首发,帧控制等待功能。

RF内核包括:无线电控制状态模块(FSM)、调制器,解调器、帧过滤和源匹配、频率合成器(FS)、命令选通处理器,定时器2(MAC定时器):

这里有一个寄存器,读的时候是将接收的数据读取出来(RXFIFO),写的时候是写入要发出的数据(TXFIFO) 两个 FIFO都是128字节的。
RFD首个字节是接收到数据的总长度。


这里写图片描述

内置功能:


这里写图片描述


数据帧的结构:


这里写图片描述

同步头:


这里写图片描述


需要传输的数据

LEN(帧长度域):帧长度域用于确定要发送多少个字节。
MAC帧:MAC帧包括MHR(MAC帧头)和MAC负载两部分,是来自与MAC层的数据。
当发送了SFD,调制器开始从TXFIFO读数据,首先读帧长度域,然后是MHR(MAC帧头)和MAC负载。


帧尾

寄存器FRMCTRL0.AUTOCRC控制位控制帧尾域的帧校验序列自动产生,其中帧尾不写入TXFIFO中,存储在一个单独的16位寄存器中。
除了可能用于调试的目的,建议使能AUTOCRC。
如果FRMCTRL0.AUTOCRC=0,那么调制器期望在TXFIFO中找到FCS,所以软件必须产生FCS,连同MAC负载一起写到TXFIFO


信道:

IEEE802.15.4-2006 指定16 个通道,它们位于2.4GHz 频段之内。步长为5 MHz,编号为11~26。通道k的RF 频率为:
fc = [ 2405 + 5(k -11) ] MHz, k ∈ [11, 26]

这里写图片描述

开中断接收:
1.端口中断 IEN2 |=0x01;
2.总中断 EA=1;
3.控制位允许接收中断 RFIRQM0 |= (1<<6);

操作寄存器实现数据的发送接收。发送节点发送完数据LED1灯闪烁,接收节点接收完数据后LED1闪烁

#include <ioCC2530.h>#include "uart.h"#define LED1 P1_0    //定义P1_0口为LED1控制端#define LED2 P1_1    //定义P1_1口为LED2控制端#define RXstatic unsigned char rxbuf[128];static unsigned char len=0;void Delayms(int xms){    int  i,j;    for(i=xms;i>0;i--)      for(j=587;j>0;j--);}void ledinit(){    P1SEL &=~(3<<0);    P1DIR |= 3; }void rf_init(){    //发送初始化   TXFILTCFG |=0x09;   //设置TX抗混叠以获得合适的带宽   AGCCTRL1 |=0x15;  // 获得最佳的AGC目标值   FSCAL1 |=0x00;  // 与默认比较,降低VCO泄露大约3DB,推荐默认获得最佳EVM   //配置初始化   FRMCTRL0 |=(0x20|0x40);   //自动确认  自动添加CRC校验码   FRMFILT0 &= ~(1<<0); //禁止帧过滤   //信道的选择   FREQCTRL |=0x0b;  //选择11号通道?   SHORT_ADDR0 = 0x05; //目标地址过滤期间使用的短地址   SHORT_ADDR1 = 0x00;   PAN_ID0 = 0x22; //目标地址过滤期间使用的PANID   PAN_ID1 = 0x00;   //中断的打开   RFIRQM0 |=(1<<6); //接受到完整的一个帧使能接受中断   IEN2 |=(1<<0);  //打开一个对应RF中断   EA=1;     //打开总中断   //清除缓冲区里面的数据   RFST = 0xed; //清除RXFIFO缓冲区并复位解调器    RFST = 0xe3; //为RX使能并校准频率合成器}void TXRF(){  unsigned char i;  char tx[]={"HEllo"};  RFIRQF1 =~(1<<1);  //清除发送完一个帧的中断标志位    while (FSMSTAT1 & ((1<<1) | (1<<5)));   //开启发送状态  RFIRQM0 &=~(1<<6); //禁止接受中断  IEN2 &= ~(1<<0); //禁止RF中断  RFST = 0xee; // 清除TXFIFO缓存   RFD = 6+2; // 发送的第一个字节是传输的帧长度  //2是CRC校验码  for(i=0;i<6;i++) //将mac的内容写到RFD中   {     RFD = tx[i];   }   RFST = 0xe9; //校准后使能TX   while( RFIRQF1&(1<<1) == 0);  //等待发送完成  RFIRQF1&=~(1<<1); //清除标志位  RFIRQM0 |= (1<<6); // 打开RX中断   IEN2 |= (1<<0); //打开RF中断  P1_0=~P1_0;  Delayms(200);}#pragma vector=RF_VECTOR//接收中断处理__interrupt void rf_isr(void){   unsigned char i;   EA=0; //关中断   if(RFIRQF0 &(1<<6)) //接受完成   {        len = RFD;  //第一个接受到的是字长        len = len &0x7f - 2;  //0x7f 因为之后128字节,RCR校验码        for (i = 0; i < len; i++)     {              rxbuf[i] = RFD;    }        S1CON=0; //RFIF=0 清除RF中断标志        RFIRQF0 &=~(1<<6); //清除接受完成帧的中断        P1_0=~P1_0;        Delayms(200);        myprintf(rxbuf);   }   EA=1;}void main(void){    clockinit();    uartinit();    ledinit();    rf_init();   // EA=1;    while(1)   //发送或等待接收中断    {      #ifndef RX  //如果没有定义接收        TXRF();        Delayms(200); //延时        Delayms(200);      # else    //如果       myprintf(rxbuf);       len=0;      #endif    }}
0 0
原创粉丝点击