初级会员

- 积分
- 65
- 金钱
- 65
- 注册时间
- 2014-5-22
- 在线时间
- 12 小时
|
5金钱
我目前使用NRF24L01,手头有3块mini板,现在是想做1收2发的程序。论坛里相关的帖子我也看过了,总感觉不是很对路。我使用原子mini里面配套的例程做修改,但是我不会读取指定通道里的数据。发送和接收的程序我是分开编写的,分别烧入板子里,但是不能收发,我也不知道该怎么描述了,我是新手,麻烦哪位大神帮我看看代码吧。
24l01.c
[mw_shl_code=c,true]const u8 TX_ADDRESS[TX_ADR_WIDTH]={0xe7,0xe7,0xe7,0xe7,0xe7}; //????
const u8 RX_ADDRESS [RX_ADR_WIDTH]={0x01,0x01,0xc2,0xc2,0xc2}; //??0????
const u8 RX_ADDRESS1[RX_ADR_WIDTH]={0x02,0x01,0xc2,0xc2,0xc2}; //??1????
const u8 RX_ADDRESS2[RX_ADR_WIDTH]={0x03}; //??2????
const u8 RX_ADDRESS3[RX_ADR_WIDTH]={0x04}; //??3????
const u8 RX_ADDRESS4[RX_ADR_WIDTH]={0x05}; //??4????
const u8 RX_ADDRESS5[RX_ADR_WIDTH]={0x06}; //??5????
//??????24L01??IO??
void NRF24L01_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //???ì????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //????????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
SPI1_Init(); //??????SPI
SPI_Cmd(SPI1, DISABLE); //
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //?è??SPI???ò?ò?????ò??????????:SPI?è???????????ò?????¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //?è??SPI?¤×÷????:?è?????÷SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //?è??SPI???????ó??:SPI·???????8?????á??
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //???????®???±????????:?±???ü????????
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //?????????????????±????
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS???????????¨NSS?????©?????í???¨????SSI???©???í:????NSS??????SSI??????
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //?¨???¨?????¤·???????:?¨?????¤·???????256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //???¨??????????MSB??????LSB??????:??????????MSB??????
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC?????????à????
SPI_Init(SPI1, &SPI_InitStructure); //?ù??SPI_InitStruct?????¨???????????????èSPIx?????÷
NRF24L01_CE=0; //????24L01
NRF24L01_CSN=1; //SPI????????
}
//?ì??24L01??·?????
//·?????:0??????;1???§°?
u8 NRF24L01_Check(void)
{
u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};
u8 i;
SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi??????9Mhz?¨24L01??×??óSPI?±????10Mhz?©
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//????5??×????????·.
NRF24L01_Read_Buf(TX_ADDR,buf,5); //?????????????·
for(i=0;i<5;i++)if(buf !=0XA5)break;
if(i!=5)return 1;//?ì??24L01?í?ó
return 0; //?ì????24L01
}
//SPI???????÷
//reg:???¨?????÷???·
//value:????????
u8 NRF24L01_Write_Reg(u8 reg,u8 value)
{
u8 status;
NRF24L01_CSN=0; //????SPI????
status =SPI1_ReadWriteByte(reg);//·????????÷??
SPI1_ReadWriteByte(value); //?????????÷????
NRF24L01_CSN=1; //????SPI????
return(status); //·???×?????
}
//????SPI?????÷??
//reg:???????????÷
u8 NRF24L01_Read_Reg(u8 reg)
{
u8 reg_val;
NRF24L01_CSN = 0; //????SPI????
SPI1_ReadWriteByte(reg); //·????????÷??
reg_val=SPI1_ReadWriteByte(0XFF);//?????????÷????
NRF24L01_CSN = 1; //????SPI????
return(reg_val); //·???×?????
}
//?????¨???????????¨?¤????????
//reg:?????÷(????)
//*pBuf:????????
//len:?????¤??
//·?????,??????????×????????÷??
u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len)
{
u8 status,u8_ctr;
NRF24L01_CSN = 0; //????SPI????
status=SPI1_ReadWriteByte(reg);//·????????÷??(????),??????×?????
for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI1_ReadWriteByte(0XFF);//????????
NRF24L01_CSN=1; //??±?SPI????
return status; //·?????????×?????
}
//?????¨?????????¨?¤????????
//reg:?????÷(????)
//*pBuf:????????
//len:?????¤??
//·?????,??????????×????????÷??
u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len)
{
u8 status,u8_ctr;
NRF24L01_CSN = 0; //????SPI????
status = SPI1_ReadWriteByte(reg);//·????????÷??(????),??????×?????
for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI1_ReadWriteByte(*pBuf++); //????????
NRF24L01_CSN = 1; //??±?SPI????
return status; //·?????????×?????
}
//????NRF24L01·???????????
//txbuf:??·????????×???·
//·?????:·????ê??×???
u8 NRF24L01_TxPacket(u8 *txbuf)
{
u8 sta;
SPI1_SetSpeed(SPI_BaudRatePrescaler_8);//spi??????9Mhz?¨24L01??×??óSPI?±????10Mhz?©
NRF24L01_CE=0;
NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//????????TX BUF 32??×???
NRF24L01_CE=1;//????·???
while(NRF24L01_IRQ!=0);//????·????ê??
sta=NRF24L01_Read_Reg(STATUS); //????×????????÷????
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //????TX_DS?òMAX_RT????±ê??
if(sta&MAX_TX)//????×??ó??·?????
{
NRF24L01_Write_Reg(FLUSH_TX,0xff);//????TX FIFO?????÷
return MAX_TX;
}
if(sta&TX_OK)//·????ê??
{
return TX_OK;
}
return 0xff;//???????ò·????§°?
}
//????NRF24L01·???????????
//txbuf:??·????????×???·
//·?????:0???????ê???????????í?ó?ú??
u8 NRF24L01_RxPacket(u8 *rxbuf)
{
u8 sta;
SPI1_SetSpeed(SPI_BaudRatePrescaler_8); //spi??????9Mhz?¨24L01??×??óSPI?±????10Mhz?©
sta=NRF24L01_Read_Reg(STATUS); //????×????????÷????
NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //????TX_DS?òMAX_RT????±ê??
if(sta&RX_OK)//??????????
{
NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//????????
NRF24L01_Write_Reg(FLUSH_RX,0xff);//????RX FIFO?????÷
return 0;
}
return 1;//??????????????
}
//????????????NRF24L01??RX????
//?è??RX???·,??RX?????í??,????RF????,?¨??????LNA HCURR
//?±CE±????ó,??????RX????,????????????????
void NRF24L01_RX_Mode(void)
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//??RX???????·
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(u8*)RX_ADDRESS1,RX_ADR_WIDTH);//?RX????
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P2,(u8*)RX_ADDRESS2,1);//?RX????
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P3,(u8*)RX_ADDRESS3,1);//?RX????
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P4,(u8*)RX_ADDRESS4,1);//?RX????
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P5,(u8*)RX_ADDRESS5,1);//?RX????
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x3f); //?????¨??0??×???????
NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x3f); //?????¨??0?????????·
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //?è??RF?¨??????
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//?????¨??0?????§?????í??
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//????0???????
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P2,RX_PLOAD_WIDTH);//????0???????
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P3,RX_PLOAD_WIDTH);//????0???????
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P4,RX_PLOAD_WIDTH);//????0???????
NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P5,RX_PLOAD_WIDTH);//????0???????
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //?è??TX·???????,0db????,2Mbps,?????ù????????
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f); //?????ù±??¤×÷?????????? WR_UP,EN_CRC,16BIT_CRC,????????
NRF24L01_CE = 1; //CE????,????????????
}
//????????????NRF24L01??TX????
//?è??TX???·,??TX?????í??,?è??RX×????????????·,????TX·???????,????RF????,?¨??????LNA HCURR
//PWR_UP,CRC????
//?±CE±????ó,??????RX????,????????????????
//CE?????ó??10us,?ò????·???.
void NRF24L01_TX_Mode(void)
{
NRF24L01_CE=0;
NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//??TX???????·
NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_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,0x1a);//?è??×?????·??????±??:500us + 86us;×??ó×?????·?????:10??
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //?è??RF?¨????40
NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //?è??TX·???????,0db????,2Mbps,?????ù????????
NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //?????ù±??¤×÷?????????? WR_UP,EN_CRC,16BIT_CRC,????????,?????ù??????
NRF24L01_CE=1;//CE????,10us?ó????·???
}[/mw_shl_code]
|
最佳答案
查看完整内容[请看2#楼]
论坛有个网友发过相关的帖子,可以参考下。
:http://www.openedv.com/posts/list/22270.htm
|