nrf2401单通道双向通行

wyhu8891 2010-07-06 11:02:18
要实现单通道双向通行该怎么实现啦,遇到的问题是,单方面的接受都可以,但是但我给对方发个数据之后对方才可以给我发数据,我接到之后再继续发,就不行了呀,这两个问题一直无法解决呀我呀,希望版帮忙啦。

#include <string.h>
#include <reg52.h>
#include <intrins.h>
#include "lcd.h"
#define uchar unsigned char
#define uint unsigned int

#define FOSC 11059200
#define BAUD 9600
#define TIMER1 0XFD //256-(110592/(12*32*96))
#define TIMER0H (65535-3*FOSC/12/1000)/256
#define TIMER0L (65535-3*FOSC/12/1000)%256 //定时3MS
//----------------------------------------------------------------------------------------------------------
//内部寄存器定义
//----------------------------------------------------------------------------------------------------------
//sfr P4 = 0xc0;
//sfr ADC_CONTR = 0xC5;
//sfr AUXR = 0x8E;
//sfr ADC_DATA = 0xC6;
//sfr P1_ADC_EN = 0x97;
//定义I/O口
sbit POW_UP = P3^2;
sbit CE = P3^3;
//sbit DR2 = P3^3;
//sbit SCK2 = P3^2;
//sbit MOSI = P1^3; //DATA1
//sbit MISO = P1^7; //DR1
sbit DATA = P1^7 ;
sbit SCK = P3^6; //clk1
//sbit DOUT2 = P1^5;
sbit CS = P3^4;
sbit DR1 = P3^5;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 =P2^4;
sbit LED6 =P2^5;
/********************* I/O define end*****************************************************/


#define FRESELE 0x28 //频道选择
#define DATANUM 4 //有效数据位数

#define time0h (65535-3000)/256
#define time0l (65535-3000)%256 //定时3MS

void SpiWriteByte();

uchar xdata CofigBuf[18]=
{
0x00, //接收频道二有效数据长度

40, //接收频道一有效数据长度

0x00,0xcd,0xef,0x12,0xb1, //接收频道二地址

0x00,0xcd,0xef,0x12,0xb0, //接收频道一地址

0x83, //32位地址,16位CRC,使能CRC
//bit7~2:ADDR_W,最大40位

//bit1:CRC_L
//Logic 0: 8 bit CRC
//Logic 1: 16 bit CRC


//BIT0:CRC_EN
//Logic 0: On-chip CRC generation/checking disabled
//Logic 1: On-chip CRC generation/checking enabled


0x4f, //ShockBurst模式,250 kbps,16M晶振,0dBm最大功率

//Bit 15:RX2_EN
//Logic 0: One channel receive
//Logic 1: Two channels receive

//Bit 14:
//Communication Mode:
//Logic 0: nRF2401 operates in direct mode.
//Logic 1: nRF2401 operates in ShockBurst. mode

//Bit 13:
//RF Data Rate:
//Logic 0: 250 kbps
//Logic 1: 1 Mbps

//Bit 12-10:Selects the nRF2401 crystal frequency to be used:
// D12 D11 D10 Crystal Frequency [MHz]
// 0 0 0 4
// 0 0 1 8
// 0 1 0 12
// 0 1 1 16
// 1 0 0 20

//Bit 9-8:RF_PWR: Sets nRF2401 RF output power in transmit mode:
// D9 D8 P [dBm]
// 0 0 -20
// 0 1 -10
// 1 0 -5
// 1 1 0



0x44 //2400+4*1=2404MHZ=2.404G,发送模式

//Bit 7 – 1:RF_CH#: Sets the frequency channel the nRF2401 operates on.
//Channelrf = 2400MHZ + RF_CH# * 1.0MHZ

//Bit 0:Set active mode:
//Logic 0: transmit mode
//Logic 1: receive mode
};


uchar Addr[4]={0xcd, 0xef, 0x12, 0xb2}; //地址
uchar TxBuf[5]={0xff, 0xef, 0x00, 0x6f, 0x00}; //发送绶冲区
uchar RxBuf[2];//={0x01, 0x02, 0xe0, 0xb0, 0xc0}; //接收绶冲区
uint timer[2]; //超时计数器




void Delay100us(uchar n)
{
uchar i;
while(n--)
{
for(i=0; i<35; i++);
}
}

void delay(unsigned int s) //1ms
{
unsigned int i,j;
for(i=s; i>0; i--);
for(j=450; j>0; j--);
}

void CpuInit(void)
{ uint i;
CE = 0;
CS = 0;
POW_UP = 1;
Delay100us(40);
CE=0;
CS = 0;
Delay100us(30);
}

void TimerInit(void)
{
TH0 = TIMER0H;
TL0 = TIMER0L;
ET0 = 1; //定时器0中断允许
TF0 = 0;
TR0 = 1; //启动定时器0
EA = 1; //开全局中断
}

void ResetTimer(uchar n)
{
ET0 = 0; // Disable Timer0 interrupt
timer[n & 0x01] = 0; // Clear timer[n]
ET0 = 1; // Enable Timer0 interrupt
}


uint ReadTimer(uchar n)
{
uint tmp;
ET0 = 0; // Disable Timer0 interrupt
tmp = timer[n]; // Clear timer[n]
ET0 = 1; // Enable Timer0 interrupt
return tmp;
}

void UartInit(void)
{
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x21; //定时器1工作方式2,定时器0工作方式1
TH1 = TIMER1;
TL1 = TIMER1;
TR1 = 1; //启动定时器1
}

void SpiWriteByte(uchar dat)
{
uchar i;

SCK = 0;
_nop_();
_nop_();
for(i=0; i<8; i++)
{
if((dat & 0x80) == 0x80)
{
// MOSI = 1;
//MISO = 1;
DATA=1;
}
else
{
//MOSI = 0;
//MISO = 0;
DATA=0;
}

SCK = 1;
delay(1);
// _nop_();
// _nop_();
dat <<= 1;
SCK = 0;
delay(1);
// _nop_();
// _nop_();
}
}

uchar SpiReadByte(void)
{
uchar i,temp;
temp = 0;

// MOSI = 1;
// MISO = 1;
DATA=1;

SCK = 0;
_nop_();
_nop_();
for(i=0; i<8; i++)
{
temp <<= 1;
SCK = 1;
// _nop_();
// _nop_();
delay(1);
if(DATA)
temp++;
SCK = 0;
delay(1);
// _nop_();
// _nop_();
}
return temp;
}


void SetTxMode(void)
{
unsigned char ch;
Delay100us(2);
POW_UP = 1;
CE = 0;
CS = 1;
Delay100us(0);
ch = FRESELE<<1;
SpiWriteByte(ch);
SCK=1;
SCK=0;
CS = 0;
CE=1;
Delay100us(2);
}

void SetRxMode(void)
{
unsigned char ch;
Delay100us(2);
POW_UP = 1;
CE=0;
CS = 1;
Delay100us(0);
ch = FRESELE<<1;
SpiWriteByte(ch | 0x01);
SCK=1;
SCK=0;
CS = 0;
CE=1;
Delay100us(2); //200us
}

void Nrf2401Init(void)
{
uchar i;
POW_UP = 1;
CE = 0;
CS = 0;
Delay100us(3);
for(i=0; i<18; i++)
{
SpiWriteByte(CofigBuf[i]);
}
CS = 0;
Delay100us(30);

}



void TranData(void)

{
uchar i;
SetTxMode();
CE = 1;
Delay100us(2);
for(i=0; i<4; i++)
{
SpiWriteByte(Addr[i]); //发送地址

}
Delay100us(1);
for(i=0; i<5; i++)
{
SpiWriteByte(TxBuf[i]); //发送五位
LED5=~LED5;
Delay100us(100);
}
CE = 0;
Delay100us(13);
}

uchar ReceivePacket(void)
{
uchar i;
SetRxMode();
CE = 1;
ResetTimer(1);
if(DR1)
{ for(i=0;i<5;i++)
{RxBuf[i] = SpiReadByte();
}
return 1;
}
return 0;
}

void timer0() interrupt 1
{

EA = 0;
TH0+=TIMER0H;
TL0+=TIMER0L;
timer[0]++;
timer[1]++;
EA = 1;
}

void main()
{
uchar temp,i,j;
///////////////////
CpuInit(); //SPI初始化
TimerInit(); // 定时器0初始化
UartInit(); // 串口初始化
Nrf2401Init(); //Nrf2401Init初始化,这里配置成32位地址。
// delay(200);
TranData();
delay(500);
while(1)

for(i=0;i<30;i++)
for(i=0;i<30;i++)
temp=ReceivePacket(); //接收数据存在接收缓冲区nei
if(temp==1)
{
for(j=0;j<5;j++)
{P2=RxBuf[i];
delay(100);
}
TranData();
delay(500);
LED3=0;
delay3(100);
LED3=1;
delay(100);
temp=0;
}


}
}
...全文
108 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,846

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 无线
社区管理员
  • 无线
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧