篮球比分屏(三)NRF24L01对码的实现

NRF24L01模块相邻射频通道低于5MHz会出现相互干扰现象,我这里直接把差值拉大到10Mhz,亲测通信稳定,未产生明显干扰掉包现象。

u8 dmBuf[10]={10,20,30,40,50,60,70,80,90,100};//对码BUF

下面是对码的实现方案:

  1. 无线手柄与比分屏初始化配置NRF24L01需关闭通道0的自动应答和自动重发。
void NRF24L01_TXN_Mode(u8 *inbuf)//关闭自动应答功能、自动重发功能
{                                                        
  CLR24CE;
  NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,inbuf,ADR_WIDTH);//写TX节点地址 
  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,inbuf,ADR_WIDTH); //设置TX节点地址,主要为了使能ACK    
  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x00);     //关闭所有通道自动应答
  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); // 使能通道0
  NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x00);//设置自动重发间隔时间:自动重发15次,每次间隔250us
  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,NRF24L01_RFCH);       //设置RF通道为40
  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x07); //0010 0111 250kbps,7dBm
  NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  //CE为高,10us后启动发送
  SET24CE;
  delay_us(130);
}
  1. 当无线手柄与比分屏按下对码键的时候再打开通道0的自动应答和自动重发。
void NRF24L01_TX_Mode(u8 *inbuf)
{                                                        
  CLR24CE;
  NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,inbuf,ADR_WIDTH);//写TX节点地址 
  NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,inbuf,ADR_WIDTH); //设置TX节点地址,主要为了使能ACK    
  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01);     //使能通道0的自动应答  
  NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址  
  NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x0a);//设置自动重发间隔时间:自动重发15次,每次间隔250us
  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,NRF24L01_RFCH);       //设置RF通道为40
  NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x07); //0010 0111 250kbps,7dBm
  NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //配置基本工作模式的参数;PWR_UP,EN_CRC,16BIT_CRC,接收模式,开启所有中断
  //CE为高,10us后启动发送
  SET24CE;
  delay_us(130);
}

3.无线手柄在对码的时候一直切换不同的通信频道并发送对码帧,只要发送成功(收到自动应答数据)就代表当前通信频道与比分屏一致,这样就实现了对码。

INTERRUPT_HANDLER(EXTI0_IRQHandler,8)//对码
{
  if(EXTI_GetITStatus(EXTI_IT_Pin0)!=RESET)
  {
    EXTI_ClearITPendingBit(EXTI_IT_Pin0);
    
    NRF_Standby_Mode();
    
    unsigned char tempBuf[5]={0x59,0x03,0x00,0x5A,0x4D};
    
    unsigned char j=0,i;
    
    for(j=0;j<11;)
    {
      NRF24L01_RFCH=dmBuf[nrfNum];
      NRF24L01_TX_Mode(tempAddrBuf);    //配置为发送模式
      
      if(NRF24L01_TxPacket(tempBuf)==TX_OK)
      {
        nrfNum1=nrfNum;
        NRF24L01_TXN_Mode(tempAddrBuf);    //配置为发送模式
        FLASH_WriteNByte((u8*)"NF",4096,2);
        FLASH_WriteNByte(&NRF24L01_RFCH,4098,1);  
        j=12;
      }
      
      if(++nrfNum>9) nrfNum=0;
      
      j++;
      
      for(i=0;i<10;i++)
      {
        GPIO_ToggleBits(GPIOD, GPIO_Pin_0);
        delay_ms(60);
      }
      
    }
    
    if(j==11)
    {
      NRF24L01_RFCH=dmBuf[nrfNum1];
      NRF24L01_TXN_Mode(tempAddrBuf);    //配置为发送模式
    }
   
    GPIO_ResetBits(GPIOD,GPIO_Pin_0);  
    
    
  }

  
}

对码完成后再配置NRF24L01关闭通道0的自动应答和自动重发,保存当前通信频段到内部EEPROM,以免下次上电需再次对码。目前这个无线手柄项目暂时算完了,但是看到资料上说STM8L051功耗能降低0.3uA,这里先挖一个坑,后面有时间再调试!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗暗星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值