查看: 719|回复: 0
打印 上一主题 下一主题

转载51822 与 nrf24通讯 地址配置

[复制链接]
跳转到指定楼层
沙发
发表于 2016-5-20 23:09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
转载地址:http://www.eeboard.com/bbs/thread-29935-1-1.html

//我写这函数的原因是51822和nrf24L01+地址bit位需要调校
//每8个bit首尾对调,这寄存器真他妈SB设计
uint8_t SB(int8_t inp)
{
   int8_t num=0x00;
   int8_t i;
    for(i = 0; i < 8; i++)
    {
        num |= ((inp >> i) & 0x01) << (7 - i);     
    }
   return num;
}

// 无线地址设置
//地址一共40个add_bit是add0~add39
//在2401地址add0先写(add0,add1,add2......add39)
//那2401和51822的地址关系如下
// 2401[add0 :add7] =PREFIX0[bit7:bit0](add7,add6,add5,add4,add3,add2,add1,add0)
// 2401[add8 :add15]=BASE0[bit31:bit24](add15,add14,add13,add12,add11,add10,add9,add8)
// 2401[add16:add23]=BASE0[bit23:bit16](add23,add22,add21,add20,add19,add18,add17,add16)
// 2401[add24:add31]=BASE0[bit15:bit8] (add31,add30,add29,add28,add27,add26,add25,add24)
// 2401[add32:add39]=BASE0[bit7 :bit0] (add39,add38,add37,add36,add35,add34,add33,add32)
//以上结论得出的2401地址是每8个bit首尾对调。以下是官方用的地址
//const u8  ip[6]={0xE7,0xE7,0xE7,0xE7,0xE7,0x00};//发射地址  从[bit0~7] [bit8~15] [bit16~23] [bit24~31] [bit32~39]
//const u8 ip0[6]={0xE7,0xE7,0xE7,0xE7,0xE7,0x00};//接收地址0 和51822通讯我调了(bit0先写)
//const u8 ip1[6]={0xC2,0xC2,0xC2,0xC2,0xC2,0x00};//接收地址1 bit39~bit8为"0x43"(bit0先写)
//const u8 ip2[6]={0xC3,0x00};//接收地址2 bit39~8和通道1共用,只写bit0~bit7
//const u8 ip3[6]={0xC4,0x00};//接收地址3 通道2345只能设置char
//const u8 ip4[6]={0xC5,0x00};//接收地址4 写的时候顺序是bit0~bit39
//const u8 ip5[6]={0xC6,0x00};//接收地址5  只有bit0~7有用。接收地址6:0xC7 接收地址7:0xC8
//无线电设置,2400MHz+,字节,速度0蓝牙1M 2M 250K。
void radio_configure(uint8_t MHz,uint8_t LONGER,uint8_t quickly)//无线配置,准备和nrf24L01+通讯
{
   
  //无线功率04:+4分贝,0:0分贝,FC:-4分贝,F8:-8分贝
//    F4:-12分贝,F0:-16分贝,EC:-20分贝,D8:-30分贝
NRF_RADIO->TXPOWER = (0x04<<0);//无线功率de分贝  
NRF_RADIO->FREQUENCY = MHz&0x3F;//无线频率24MHz+2400MHz=2424MHz
//无线速率:00:1Mbit,01:2Mbit,02:250Kbit,03:1Mbit(蓝牙)
if(quickly==1)NRF_RADIO->MODE = (00<<0);//速率1Mbit
  else if(quickly==2)NRF_RADIO->MODE = (01<<0);//速率2Mbit
  else if(quickly==250)NRF_RADIO->MODE = (2<<0);//速率250Kbit
else   NRF_RADIO->MODE = (01<<0);//速率1Mbit(蓝牙)
//nrf24L01+和51822的地址关系如下
// 2401[add0 :add7] =PREFIX0[bit7:bit0](add7,add6,add5,add4,add3,add2,add1,add0)
// 2401[add8 :add15]=BASE0[bit31:bit24](add15,add14,add13,add12,add11,add10,add9,add8)
// 2401[add16:add23]=BASE0[bit23:bit16](add23,add22,add21,add20,add19,add18,add17,add16)
// 2401[add24:add31]=BASE0[bit15:bit8] (add31,add30,add29,add28,add27,add26,add25,add24)
// 2401[add32:add39]=BASE0[bit7 :bit0] (add39,add38,add37,add36,add35,add34,add33,add32)
// 通道3 到 0 的低字节
NRF_RADIO->PREFIX0 =(SB(RX3[0])<<24) // 通道3的低字节地址C4 1100 0100/0010 0011 23
                    |(SB(RX2[0])<<16) // 通道2的低字节地址C3 1100 0011/1100 0011 C3
                    |(SB(RX1[0])<< 8) // 通道1的低字节地址C2 1100 0010/0100 0011 43
                    |(SB(RX0[0])<< 0);// 通道0的低字节地址E7 1110 0111/1110 0111 E7
// 通道7 到 4 的低字节地址
NRF_RADIO->PREFIX1 =(SB(RX7[0])<<24) // 通道7的低字节地址C8 1100 1000/0001 0011 13
                    |(SB(RX6[0])<<16) // 通道6的低字节地址C7 1100 0111/1110 0011 E3
                    |(SB(RX5[0])<< 8) // 通道5的低字节地址C6 1100 0110/0110 0011 63
                    |(SB(RX4[0])<< 0);// 通道4的低字节地址C5 1100 0101/1010 0011 A3

  NRF_RADIO->BASE0   = (SB(RX0[1])<<24)  // 通道0的高字节E7  1110 0111/1110 0111 E7
                      |(SB(RX0[2])<<16)
                     |(SB(RX0[3])<<8)
                     |(SB(RX0[4])<<0);
  NRF_RADIO->BASE1   = (SB(RX1[1])<<24)  // 通道1-7的高字节C2 1100 0010/0100 0011 43
                      |(SB(RX1[2])<<16)
                     |(SB(RX1[3])<<8)
                     |(SB(RX1[4])<<0);
   
  NRF_RADIO->TXADDRESS = 0x00UL;      // 发射使用的通道号:0通道
  NRF_RADIO->RXADDRESSES = (1<<0);    // 接收使用的通道号:0通道  1111 1111
  // 配置包0的设置
  NRF_RADIO->PCNF0 = (0<<16)| //S1领域的长度
                     (0<<8) | //S0场的长度
                     (0<<0);  //长度字段中的比特数
  // 配置包1的设置
   NRF_RADIO->PCNF1 = (0<<25)| //效验位(0关,1开)
                      (1<<24)| //数据大小端(高低字节哪个先发 0低字节,1高字节)1为数组的最高位先发
                      (4<<16)| //通道0~7地址高字长度( nrf24L01+高低字节5字节:4个高字+1个低字)
                      (LONGER<<8) | //数据字节长度(255~1)32字节QxC
                      (LONGER<<0);  //硬件传输字节长度(255~1)32字节QxC
  // CRC 校验长度配置
  NRF_RADIO->CRCCNF = 2; // 校验长度 2个char

  if ((NRF_RADIO->CRCCNF & 0x03)== 2 )
  {
    NRF_RADIO->CRCINIT = 0xFFFFUL;      // 校验初始值
    NRF_RADIO->CRCPOLY = 0x11021UL;     // CRC poly: x^16+x^12^x^5+1
  }
  else if ((NRF_RADIO->CRCCNF & 0x03) == 1 )
  {
    NRF_RADIO->CRCINIT = 0xFFUL;        // 校验初始值
    NRF_RADIO->CRCPOLY = 0x107UL;       // CRC poly: x^8+x^2^x^1+1
  }

//接收/发射寄存器是  NRF_RADIO->PACKETPTR
}


//nrf51822发射函数
uint8_t NRF51_TX()
{
  NRF_RADIO->EVENTS_READY = 0U;//收发模式切换完成指示灯。
    NRF_RADIO->TASKS_TXEN = 1U;//启动无线发射模式
    while (NRF_RADIO->EVENTS_READY == 0U);//等待收发模式切换完成
        // 启动数据传输
    NRF_RADIO->EVENTS_END  = 0U;//传输完成指示灯 ,关灯   
    NRF_RADIO->TASKS_START = 1U;//开始传输  
        while(NRF_RADIO->EVENTS_END == 0U) //等待传输结束
        {      
            IO_OUT(21,0);//传输等待led4
        }   
   
        NRF_RADIO->EVENTS_DISABLED = 0U;//无线电已关闭指示灯,关灯
        NRF_RADIO->TASKS_DISABLE   = 1U; // 关闭无线电
        while(NRF_RADIO->EVENTS_DISABLED == 0U)//等待无线电设备关闭
        {
            // Do nothing.
        }
   
     return 1;
}

//nrf51822接收函数
uint8_t NRF51_RX()
{
       uint8_t CRC=0;
     NRF_RADIO->EVENTS_READY = 0U; //收发模式转换完成  标志位      
        NRF_RADIO->TASKS_RXEN   = 1U; //启动接收模式
        while(NRF_RADIO->EVENTS_READY == 0U); //等待收发模式转换完成(指示灯)
        NRF_RADIO->EVENTS_END  = 0U;//传输完成(指示灯)
        NRF_RADIO->TASKS_START = 1U; // 开始传输

        IO_OUT(23,1);//接收指示灯
           nrf_delay_ms(3);//接收空气中的无线信号
//没收到数据   
        while(NRF_RADIO->EVENTS_END == 0U)//等待传输完成(指示灯)
           {
       //一直没收到数据
        NRF_RADIO->EVENTS_DISABLED = 0U;//无线关闭   标志位
              NRF_RADIO->TASKS_DISABLE   = 1U;// 关闭无线设备
              while(NRF_RADIO->EVENTS_DISABLED == 0U);//等待设备关闭
        return 0;
           }
      
//成功收到数据
    if (NRF_RADIO->CRCSTATUS == 1U)//如果CRC校验正确
       {    CRC=1;   }
    else    CRC=0;
      
        NRF_RADIO->EVENTS_DISABLED = 0U;//无线关闭   标志位
        NRF_RADIO->TASKS_DISABLE   = 1U;// 关闭无线设备
        while(NRF_RADIO->EVENTS_DISABLED == 0U);//等待设备关闭
        if(CRC==1)
      {  
      return 1;//接收成功
     }
    return 0;//由于CRC校验错误,所以接收失败
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表