CC2530射频通信

今天这个实验也是学校做,我就看了一下网上的视频然后改了一点代码,就是发送板A上按键中断实现点亮接收板B上D1D2小灯。
现象如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这个距离还是挺远的
发送模块的代码:

#include<ioCC2530.h>
#define SENDVAL 5

char SendPacket[]={0x0c,0x61,0x88,0x00,0x07,0x20,0xEF,0xBE,0x20,0x50,SENDVAL};
//第一个字节0x0C含义,这个自己后面还有12个字节要发送
//第5 6个字节表示的是PANID
//第7 8个字节是无线模块目标设备的网络地址 0xBEEF
//第9 10就是本地模块的网络地址
//11 个字节是我们有用的数据
// CRC码 12 13个字节 是硬件自动追加

void Led_Init(){
  //P1_0
  //1111 1110
  P1SEL &= 0xfe;
  //0000 0001
  P1DIR |= 0x01;
}

void Delay()
{
    int y,x;
    for(y=1000;y>0;y--)
      for(x=30;x>0;x--);
}
void Init32M()
{
   SLEEPCMD &=0xFB;//1111 1011 开启2个高频时钟源
   while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M稳定
   Delay();
   CLKCONCMD &=0xF8;//1111 1000 不分频输出
   CLKCONCMD &=0XBF;//1011 1111 设置32M作为系统主时钟
   while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成为当前系统主时钟
}
void KeysIntCfg()
{//Key3  Key4   Key5
     
     IEN2|=0x10;//开P1IE组中断
     P1IEN|=0x02;//开Key3组内中断
     PICTL|=0x02;//设置P1_1为下降沿 
     EA=1;      //开总中断
}


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;
    //信道25
    FREQCTRL =(11+(25-11)*5);//(MIN_CHANNEL + (channel - MIN_CHANNEL) * CHANNEL_SPACING);   
                     //设置载波为2475M
    PAN_ID0=0x07;
    PAN_ID1=0x20; //0x2007   
    //halRfRxInterruptConfig(basicRfRxFrmDoneIsr); 
    //两个128ram
    RFST = 0xEC;//清接收缓冲器
    RFST = 0xE3;//开启接收使能 
    EA=1;    
}

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++)
    {
       RFD=pstr[i];
    }  //循环的作用是把我们要发送的数据全部压到发送缓冲区里面
    
    RFST = 0xE9; //这个寄存器一旦被设置为0xE9,发送缓冲区的数据就被发送出去
    while(!(RFIRQF1 & 0x02) );//等待发送完成
    RFIRQF1 = ~0x02;//清发送完成标志
}

void main()
{
   Led_Init();
   //无线通信的时候主时钟晶振必须工作在32M 
   Init32M();
   //P1_1
   KeysIntCfg(); 
   
   halRfInit();//无线通信的初始化  初始化相关的寄存器,配置工作信道,和PANID
   
  SHORT_ADDR0=0x50;
  SHORT_ADDR1=0x20;//设置本模块地址  设置本模块的网络地址0x2050
  //大小端模式问题
  P1_0=0;
  while(1);
}
#pragma vector=P1INT_VECTOR
__interrupt void Key3_ISR() //P1_1
{
     if(0x02 & P1IFG)
     {
         Delay();
         if(0==P1_1)
         {           
           P1DIR |=0X01;
           //按钮发送灯灭
           P1_0 ^=1;
           RFSend(SendPacket,11);
         }     
     }

     P1IFG=0;
     P1IF=0;
}


#pragma vector=RF_VECTOR
__interrupt void RF_IRQ(void)
{//这个是射频中断函数,当小灯模块接收到开关模块发送来的数据时,小灯模块的CPU就会进入中断函数执行
    EA=0;
    if( RFIRQF0 & 0x40 )
    {            
        RFIRQF0&= ~0x40;   // Clear RXPKTDONE interrupt
    }
    S1CON= 0;                   // Clear general RF interrupt flag
    RFST = 0xEC;//清接收缓冲器
    RFST = 0xE3;//开启接收使能 
    EA=1;
}

接收模块的代码:

#include<ioCC2530.h>
void Delay()
{
    int y,x;
    for(y=1000;y>0;y--)
      for(x=30;x>0;x--);
}

void Led_Init(){
  P1SEL &= 0xfe;
  P1DIR |= 0x03;
  P1_0=1;
  P1_1=1;
}
void Init32M()
{
   SLEEPCMD &=0xFB;//1111 1011 开启2个高频时钟源
   while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M稳定
   Delay();
   CLKCONCMD &=0xF8;//1111 1000 不分频输出
   CLKCONCMD &=0XBF;//1011 1111 设置32M作为系统主时钟
   while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成为当前系统主时钟
}
void Uart0_Cfg()
{
   PERCFG &=0xFE;//把这个寄存器的第零位强行清零  1111 1110 
   //就是把串口0的脚位置配置在备用位置1 即P0_2  P0_3
   
   P0SEL  |=0x0C;//让P0_2  P0_3这两个脚工作在片上外设模式,而不是普通IO口       0000 1100
   
   U0CSR |=0xC0;
   U0UCR =0; //串口0 典型的串口配置  校验位 停止位之类的东西
   
   U0GCR =11;
   U0BAUD =216;//就是重官方数据手册中波特率表格中参照115200时的 配置值,前提是系统时钟在32M
   
   IEN0 |=0x04; //开接收数据的中断  0000 0100
   EA=1;
}

void Uart0SendByte(char SendByte)
{
    U0DBUF=SendByte;  //把我们收到的数据通过串口再返回发出去
    while(UTX0IF==0);
    UTX0IF=0;
}
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;
    
    FREQCTRL =(11+(25-11)*5);//(MIN_CHANNEL + (channel - MIN_CHANNEL) * CHANNEL_SPACING);    
    PAN_ID0=0x07;
    PAN_ID1=0x20;    
    RFST = 0xEC;//清接收缓冲器
    RFST = 0xE3;//开启接收使能 
    EA=1;    
}


void main()
{
  Led_Init();
  Init32M(); //主时钟晶振工作在32M 
  halRfInit();
  Uart0_Cfg();
  
  SHORT_ADDR0=0xEF;
  SHORT_ADDR1=0xBE;//设置本模块地址  0xBEEF
  
    
  while(1);
}

void RevRFProc()
{
 static char len;
 static char  ch;

    len=ch=0;
    RFIRQM0 &= ~0x40;
    IEN2 &= ~0x01;
    EA=1;
 
    len=RFD;//读第一个字节判断这一串数据后面有几个字节;
   

    while (len>0) 
    {//只要后面还有数据那么就把他都从接受缓冲区取出来
        ch=RFD;
        if(3==len)
        {
           P1_0=0;
           P1_1=0;
        }
        

        len--;
     }     
    EA=0;
    // enable RXPKTDONE interrupt
    RFIRQM0 |= 0x40;
    // enable general RF interrupts
    IEN2 |= 0x01;        
}

#pragma vector=RF_VECTOR
__interrupt void RF_IRQ(void)
{//这个是射频中断函数,当小灯模块接收到开关模块发送来的数据时,小灯模块的CPU就会进入中断函数执行
    EA=0;
    if( RFIRQF0 & 0x40 )
    {
        
        RevRFProc();     
        RFIRQF0&= ~0x40;   // Clear RXPKTDONE interrupt
    }
    S1CON= 0;                   // Clear general RF interrupt flag
    RFST = 0xEC;//清接收缓冲器
    RFST = 0xE3;//开启接收使能 
    EA=1;
}

反正代码比TI公司给的例子好多了,在此十分感谢胜达电子,如果大家有需要板子可以去看看

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值