中级会员
- 积分
- 223
- 金钱
- 223
- 注册时间
- 2016-8-11
- 在线时间
- 64 小时
|
5金钱
各位大虾,小弟初来乍到,调试nrf24l01时遇到问题了。我想把之前在51和stm8s上的nrf通信程序移植到stm32上,就用精英版,在官方的程序上做修改。接收端是51的单片机,接收到数据会改变led指示灯。我用stm32的程序能与无线模块通信是正常的,可是无法通信,不知道是什么原因。接收端用原来51的发射端控制是有反应的。以下是部分程序:
//中断程序
void EXTI4_IRQHandler(void)
{
u8 status,i;
delay_ms(10);
if(KEY0==0) //按键判断
{
LED0=!LED0;
tmp_buf[1]=0x02;
NRF24L01_TX_Mode();
status=NRF24L01_TxPacket(tmp_buf);
if(status==MAX_TX)
{
LED1=0;
}
else if(status==TX_OK)
{
LED1=1;
}
tmp_buf[1]++;
if(tmp_buf[1]==7) tmp_buf[1]=1;
}
EXTI_ClearITPendingBit(EXTI_Line4); //清中断标记
}
int main(void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
LED_Init();
EXTIX_Init();
NRF24L01_Init();
while(NRF24L01_Check()) //检测是否有模块
{
LED0=0;
delay_ms(200);
LED0=1;
delay_ms(200);
}
LED0=1;
while(1)
{
}
}
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
SPI2_SetSpeed(SPI_BaudRatePrescaler_8);
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//D′êy¾Yμ½TX BUF 32¸ö×Ö½ú
NRF24L01_CE=1;//发送数据
while(NRF24L01_IRQ!=0);//等待IRQ拉低,发送完毕
sta=NRF24L01_Read_Reg(STATUS); //读取标志位
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清标志位
if(sta&MAX_TX)
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);
return MAX_TX;
}
if(sta&TX_OK)
{
return TX_OK;
}
return 0xff;
}
void NRF24L01_TX_Mode(void)
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//D′TX½úμãμØÖ·
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //éèÖÃTX½úμãμØÖ·,Ö÷òaÎaáËê1ÄüACK
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x00); //ê1Äüí¨μà0μÄ×Ô¶ˉó|′e
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x00); //ê1Äüí¨μà0μĽóêÕμØÖ·
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x00);//éèÖÃ×Ô¶ˉÖØ·¢¼ä¸ôê±¼ä:500us + 86us;×î′ó×Ô¶ˉÖØ·¢′Îêy:10′Î
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //éèÖÃRFí¨μàÎa40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //éèÖÃTX·¢éä2Îêy,0dbÔöòæ,2Mbps,μíÔëéùÔöòæ¿aÆô
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x06); //ÅäÖûù±¾1¤×÷Ä£ê½μÄ2ÎêyWR_UP,EN_CRC,16BIT_CRC,½óêÕÄ£ê½,¿aÆôËùóDÖD¶Ï
NRF24L01_CE=1;//CEÎa¸ß,10usoóÆô¶ˉ·¢Ëí
}
用了按键中断,key0按一下发送一次数据,我保证按键中断是对的,指示灯也会亮。每次NRF24L01_TxPacket()返回值是TX_OK,接收端没有反应。
与原子哥程序不同的是TX_ADDRESS,TX_ADR_WIDTH,这些参数与接收端都是一样的。
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x00); //ê1Äüí¨μà0μÄ×Ô¶ˉó|′e
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x00); //ê1Äüí¨μà0μĽóêÕμØÖ·
NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x00);//éèÖÃ×Ô¶ˉÖØ·¢¼ä¸ôê±¼ä:500us + 86us;×î′ó×Ô¶ˉÖØ·¢′Îêy:10′Î
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //éèÖÃRFí¨μàÎa40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //éèÖÃTX·¢éä2Îêy,0dbÔöòæ,2Mbps,μíÔëéùÔöòæ¿aÆô
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x06); //ÅäÖûù±¾1¤×÷Ä£ê½μÄ2ÎêyWR_UP,EN_CRC,16BIT_CRC,½óêÕÄ£ê½,¿aÆôËùóDÖD¶Ï
这些寄存器设置也是和51的发射端的参数设置是一样的,不知道为什么就是没有数据传到接收端。
注释变乱码了,不好意思。。
|
|