NRF24L01模块相邻射频通道低于5MHz会出现相互干扰现象,我这里直接把差值拉大到10Mhz,亲测通信稳定,未产生明显干扰掉包现象。
u8 dmBuf[10]={10,20,30,40,50,60,70,80,90,100};//对码BUF
下面是对码的实现方案:
- 无线手柄与比分屏初始化配置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);
}
- 当无线手柄与比分屏按下对码键的时候再打开通道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,这里先挖一个坑,后面有时间再调试!