|
请各位帮忙看一下下面的代码有什么问题 在调试NRF2410的时候(就是淘宝超值区的那个模块),接受不到一个数据包,单片机用得是C8051f020
各IO口都已经配置好 该推挽的推挽了 该上拉的也上啦了
#include "nrf2401.h"
code uchar CofigBuf[15]=
{
0x00, //接收频道二有效数据长度
40, //接收频道一有效数据长度
0x00,0x00,0x00,0x00,0x00, //接收频道二地址
0x00,0xcd,0xef,0x12,0xaa, //接收频道一地址
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
0x50 //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 AddrCofig[4]={0xcd, 0xef, 0x12, 0xaa}; //地址
/*****************************************************************************************
//函数名void NRF2410_IO_Init(void)
//输入:无
//输出:无
//功能描述:初始化IO程序
/*****************************************************************************************/
void NRF2410_IO_Init(void)
{
POW_UP = 1;
Delay1ms(4);
CE = 0;
CS = 0;
CLK1 = 0;
}
/*****************************************************************************************
//函数名:void NRF2410_WriteByte(uchar dat)
//输入:发送的数据
//输出:无
//功能描述:串行发送一个字节 高位在前
/*****************************************************************************************/
static
void NRF2410_WriteByte(uchar dat)
{
uchar i;
CLK1 = 0;
_nop_();
_nop_();
for(i=0; i<8; i++)
{
if(dat & 0x80)
{
DATA = 1;
}
else
{
DATA = 0;
}
CLK1 = 1;
_nop_();
_nop_();
dat <<= 1;
CLK1 = 0;
_nop_();
_nop_();
}
}
/*****************************************************************************************
//函数名:uchar NRF2401_ReadByte(void)
//输入:无
//输出:读出的数据
//功能描述:SPI读出一个字节
/*****************************************************************************************/
static
uchar NRF2401_ReadByte(void)
{
uchar i,temp= 0;
DATA = 1;
CLK1 = 0;
_nop_();
_nop_();
for(i=0; i<8; i++)
{
temp <<= 1;
CLK1 = 1;
_nop_();
_nop_();
if(DATA)++temp;
CLK1 = 0;
_nop_();
_nop_();
}
return temp;
}
/*****************************************************************************************
//函数名:void NRF2401_SetTxMode(void)
//输入:无
//输出:无
//功能描述:转为发送模式
/*****************************************************************************************/
void NRF2401_SetTxMode(void)
{
uchar ch;
CS = 1;
Delay1us(10);
ch = FRESELE;
NRF2410_WriteByte(ch);
CS = 0;
Delay1us(200);
}
/*****************************************************************************************
//函数名:NRF2401_SetRxMode()
//输入:无
//输出:无
//功能描述:转为接收模式
/*****************************************************************************************/
void NRF2401_SetRxMode(void)
{
uchar ch;
CS = 1;
Delay1us(10);
ch = FRESELE;
NRF2410_WriteByte(ch | 0x01);
CS = 0;
Delay1us(200); //200us
}
/*****************************************************************************************
//函数名:NRF2401_Init()
//输入:无
//输出:无
//功能描述:Nrf2401_Init初始化,配置成32位地址。
/*****************************************************************************************/
void NRF2401_Init(void)
{
uchar i;
CE = 0;
CS = 1;
Delay1us(10);
for(i=0; i<15; i++)
{
NRF2410_WriteByte(CofigBuf);
}
CS = 0;
Delay1ms(1);
}
/*****************************************************************************************
//函数名:void NRF2401_TX_Data(uchar *TxBuf)
//输入:uchar *TxBuf 5字节缓冲
//输出:无
//功能描述:发送缓冲区的数据。
/*****************************************************************************************/
void NRF2401_TX_Data(uchar *TxBuf)
{
uchar i;
NRF2401_SetTxMode();
CE = 1;
Delay1us(100);
for(i=0; i<4; i++)
{
NRF2410_WriteByte(AddrCofig); //发送地址
}
for(i=0; i<5; i++)
{
NRF2410_WriteByte(TxBuf); //发送五位数据
}
CE = 0;
Delay1ms(1);
}
/*****************************************************************************************
//函数名:uchar NRF2401_RX_Data(uchar *RxBuf)
//输入:uchar *RxBuf 5字节接收缓冲
//输出:0 :超时错误 1 :正常返回
//功能描述:接收数据 保存在*RxBuf接收缓冲区内
/*****************************************************************************************/
uchar NRF2401_RX_Data(uchar *RxBuf)
{
uchar i;
uint time=0;
NRF2401_SetRxMode();
CE = 1;
while(DR1 == 0)
{
++time;
if(DR1==1) break ;
if (time > 200)
{
CE = 0;
return 0;
}
}
i = 0;
while(DR1)
{
RxBuf = NRF2401_ReadByte();
++i;
if (i == 5)
break;
}
while(DR1)
{
NRF2401_ReadByte();
}
CE = 0;
return 1;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|