蓝牙技术
直播中

刘满贵

7年用户 1490经验值
私信 关注
[经验]

蓝牙的自适应调频算法

  1. /*
  2. * 函数名:                       
  3. Data_Frequency_Channel_Choose -RADIO 调频计算函数,效果是计算出下一个频率通道和白化初始值
  4. * 参数:
  5. * -无
  6. * 返回值:
  7. * -无
  8. */
  9. void Data_Frequency_Channel_Choose(void)
  10. {
  11.         Data_frequency_map.Current_unmappedChannel  = (Data_frequency_map.Last_UnmappedChannel + Data_frequency_map.Hop_Increment) % 37 ;
  12.         //这里得到的是接下来的频率通道号,能不能用?需要和 MAP 进行比较
  13.         Data_frequency_map.Last_UnmappedChannel  = Data_frequency_map.Current_unmappedChannel ; //上一次的频道等于当前频道
  14.         while(1)
  15.         {
  16.                 if (Data_frequency_map.Current_unmappedChannel < 8) //从第 0 个频道字节确定那个能用
  17.                 {
  18.                         if((Data_frequency_map.Channel_Map[0] >> Data_frequency_map.Current_unmappedChannel)& 0x01 ) //如果这个频道是可用的
  19.                         {
  20.                                 Data_frequency_map.Current_Frequency_value  = (Data_frequency_map.Current_unmappedChannel<<1)+4 ;
  21.                                 //得到真正的频率,可以直接赋值给 NRF_RADIO->FREQUENCY 寄存器
  22.                                 break; // 找到了可用的频道 并计算得到了实际寄存器的频率值后跳出循环
  23.                         }
  24.                         else //这个频道不可用需要重新映射
  25.                         {
  26.                         Data_frequency_map.Current_unmappedChannel=Data_frequency_map.Used_Channels[Data_frequency_map.Current_unmappedChannel
  27.                                 % Data_frequency_map.Num_UsedChannels] ;
  28.                                 //这里得到的是接下来的频率通道号,能不能用?需要和 MAP 进行比较
  29.                         }
  30.                 }
  31.                 else if(Data_frequency_map.Current_unmappedChannel < 16)//从第 1 个频道字节确定那个频道能用
  32.                 {
  33.                         if((Data_frequency_map.Channel_Map[1]  >> (Data_frequency_map.Current_unmappedChannel- 8)) & 0x01 ) //如果这个频道是可用的
  34.                         {
  35.                                 if(Data_frequency_map.Current_unmappedChannel < 11)
  36.                                 {
  37.                                         Data_frequency_map.Current_Frequency_value  = (Data_frequency_map.Current_unmappedChannel<<1)+4 ;
  38.                                         //得到真正的频率,可以直接赋值给 NRF_RADIO->FREQUENCY 寄存器
  39.                                 }
  40.                                 else
  41.                                 {
  42.                                         Data_frequency_map.Current_Frequency_value  = (Data_frequency_map.Current_unmappedChannel<<1)+6 ;
  43.                                         //得到真正的频率,可以直接赋值给 NRF_RADIO->FREQUENCY 寄存器
  44.                                 }
  45.                                 break; // 找到了可用的频道并计算得到了实际寄存器的频率值后跳出循环
  46.                         }
  47.                         else //这个频道不可用需要重新映射
  48.                         {
  49.                         Data_frequency_map.Current_unmappedChannel=Data_frequency_map.Used_Channels[Data_frequency_map.Current_unmappedChannel
  50.                                 % Data_frequency_map.Num_UsedChannels] ;
  51.                                 //这里得到的是接下来的频率通道号,能不能用?需要和 MAP 进行比较
  52.                         }
  53.                 }
  54.                 else if(Data_frequency_map.Current_unmappedChannel < 24) //从第 2 个频道字节确定那个频道能用
  55.                 {
  56.                         if((Data_frequency_map.Channel_Map[2]  >> (Data_frequency_map.Current_unmappedChannel-16)) & 0x01 ) //如果这个频道是可用的
  57.                         {
  58.                                 Data_frequency_map.Current_Frequency_value  =(Data_frequency_map.Current_unmappedChannel<<1)+6 ;
  59.                                 //得到真正的频率,可以直接赋值给 NRF_RADIO->FREQUENCY 寄存器
  60.                                 break; // 找到了可用的频道并计算得到了实际寄存器的频率值后跳出循环
  61.                         }
  62.                         else //这个频道不可用需要重新映射
  63.                         {
  64.                         Data_frequency_map.Current_unmappedChannel=Data_frequency_map.Used_Channels[Data_frequency_map.Current_unmappedChannel
  65.                                 % Data_frequency_map.Num_UsedChannels] ;
  66.                                 //这里得到的是接下来的频率通道号,能不能用?需要和 MAP 进行比较
  67.                         }
  68.                 }
  69.                 else if(Data_frequency_map.Current_unmappedChannel < 32)//从第 3 个频道字节确定那个频道能用
  70.                 {
  71.                         if((Data_frequency_map.Channel_Map[3]  >>(Data_frequency_map.Current_unmappedChannel- 24)) & 0x01 ) //如果这个频道是可用的
  72.                         {
  73.                                 Data_frequency_map.Current_Frequency_value  =(Data_frequency_map.Current_unmappedChannel<<1)+6 ;
  74.                                 //得到真正的频率,可以直接赋值给 NRF_RADIO->FREQUENCY 寄存器
  75.                                 break; // 找到了可用的频道并计算得到了实际寄存器的频率值后跳出循环
  76.                         }
  77.                         else //这个频道不可用需要重新映射
  78.                         {
  79.                         Data_frequency_map.Current_unmappedChannel=Data_frequency_map.Used_Channels[Data_frequency_map.Current_unmappedChannel
  80.                                 % Data_frequency_map.Num_UsedChannels] ;
  81.                                 //这里得到的是接下来的频率通道号,能不能用?需要和 MAP 进行比较
  82.                         }
  83.                 }
  84.                 else if(Data_frequency_map.Current_unmappedChannel < 40) //从第 4 个频道字节确定那个频道能用
  85.                 {
  86.                         if((Data_frequency_map.Channel_Map[4]  >>(Data_frequency_map.Current_unmappedChannel- 32)) & 0x01 ) //如果这个频道是可用的
  87.                         {
  88.                                 Data_frequency_map.Current_Frequency_value  =(Data_frequency_map.Current_unmappedChannel<<1)+6 ;
  89.                                 //得到真正的频率,可以直接赋值给 NRF_RADIO->FREQUENCY 寄存器
  90.                                 break; // 找到了可用的频道并计算得到了实际寄存器的频率值后跳出循环
  91.                         }
  92.                         else //这个频道不可用需要重新映射
  93.                         {
  94.                         Data_frequency_map.Current_unmappedChannel=Data_frequency_map.Used_Channels[Data_frequency_map.Current_unmappedChannel
  95.                                 % Data_frequency_map.Num_UsedChannels] ;
  96.                                 //这里得到的是接下来的频率通道号,能不能用?需要和 MAP 进行比较
  97.                         }
  98.                 }
  99.         }
  100.         NRF_RADIO->FREQUENCY = Data_frequency_map.Current_Frequency_value; //Actual frequency (MHz): 2400 + register value
  101.         NRF_RADIO->DATAWHITEIV = Data_frequency_map.Current_unmappedChannel; //白化数据寄存器初值为通道号
  102. }

更多回帖

发帖
×
20
完善资料,
赚取积分