|
最近在做单片机和44B0的无线通信,其实还没有加操作系统,所以不涉及到无线模块的驱动问题,就当单片机用的。之前用一对51单片机做已经成功了,所以把接收程序修改了一下,想用44B0接收,但是收不到数据,自己感觉是端口输入输出配置问题,发送模块也已经测试过了,是可以的。程序如下,麻烦大家帮忙看看。程序在ADS下已经编译通过了,头文件我没有写出来。
/*GPC0 CE
GPE4 CS
GPE5 DR1
GPE6 CLK1
GPE7 DATA 用到5个IO口
*/
#define MASK_BIT(bit) (1<<(bit))
#define SET_DATA() rPDATE |= MASK_BIT(7) //sbit Data=1
#define CLR_DATA() rPDATE &= ~MASK_BIT(7) //clr Data=0
#define SET_CLK1() rPDATE |= MASK_BIT(6) //sbit CLK1=1
#define CLR_CLK1() rPDATE &= ~MASK_BIT(6) //clr CLK1=0
#define SET_DR1() rPDATE |= MASK_BIT(5) //sbit DR1=1
#define CLR_DR1() rPDATE &= ~MASK_BIT(5) //clr DR1=0
#define SET_CS() rPDATE |= MASK_BIT(4) //sbit CS=1
#define CLR_CS() rPDATE &= ~MASK_BIT(4) //clr CS=0
#define SET_CE() rPDATC |= MASK_BIT(0) //sbit CE=1
#define CLR_CE() rPDATC &= ~MASK_BIT(0) //clr CE=0
#define SET_OUTPUT_DATA() rPCONE |= MASK_BIT(14) //设DATA为输出模式
#define SET_INPUT_DATA() rPCONE &= ~MASK_BIT(14)
#define _nop_() __asm{nop;}
#define nRF2401_DataLength_TX (24+4) //发送数据的长度
#define nRF2401_DataLength_RX (24) //接收数据的长度
#define uchar unsigned char
//for nRF2401
uchar InitData[15];
uchar TXData[nRF2401_DataLength_TX];
uchar RXData[nRF2401_DataLength_RX];
uchar Temp;
uchar BitCnt;
uchar ByteCnt;
uchar tempi;
void BuildInitWord()
{
InitData[0]=nRF2401_DataLength_RX<<3;//InitData[0]=0x50; //RX receiver 2, Datalength 80bit(10 byte)
InitData[1]=InitData[0];//InitData[1]=0x50; //RX receiver 1, Datalength 80bit(10 byte)
InitData[2]=0x00;
InitData[3]=0xcc;
InitData[4]=0xcc;
InitData[5]=0xcc;
InitData[6]=0xcc;
InitData[7]=0x00;
InitData[8]=0xcc; //RX receiver 1 address High byte
InitData[9]=0xcc; //RX receiver 1 address High byte
InitData[10]=0xcc; //RX receiver 1 address Low byte
InitData[11]=0xcc; //RX receiver 1 address Low byte
//InitData[12]=0x82; //this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC disable(Bit0) for ES chip
InitData[12]=0x83; //this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0) for final chip
InitData[13]=0x4f; //One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 250K, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
//InitData[13]=0x6f; //One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 1M, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
InitData[14]=0x05; //Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
TXData[0]=0xcc; //MSB ;RX receiver 1 address High byte
TXData[1]=0xcc; //MSB-1 ;RX receiver 1 address High byte
TXData[2]=0xcc; //MSB-2 ;RX receiver 1 address Low byte
TXData[3]=0xcc; //MSB-3 ;RX receiver 1 address Low byte
}
void DoSPIClock()
{
SET_CLK1();//CLK1=1;
_nop_();
_nop_();
CLR_CLK1();//CLK1=0;
}
void InitnRF2401()
{
SET_INPUT_DATA(); //设DATA为输入
CLR_CE(); //CE=0; //Disable CE
SET_CS(); //CS=1; //Enable CS--confige mode
for (ByteCnt=0;ByteCnt<15;ByteCnt++)
{
tempi=InitData[ByteCnt];
for (BitCnt=0;BitCnt<8;BitCnt++)
{
if ((tempi | MASK_BIT(7))==tempi) //if (bflag==1) //Check if first bit is HIGH
SET_DATA(); //Set Data high
else
CLR_DATA(); //Set Data low
tempi=tempi<<1; //Left Shift to get next bit
DoSPIClock(); //Call "DoClock" to generate a clock pulse
}
}
CLR_CS();//CS=0; //Disable CS--standby mode
CLR_DATA();//Data=0; //Set Data low
}
void CE_High()
{
SET_CE();//CE=1;
}
void RXEN_HIGH()
{
CLR_CE(); //CE=0; //Set CE LOW
SET_CS(); //CS=1; //Set CS HIGH--confige mode
SET_INPUT_DATA(); //设DATA为输入
SET_DATA();//Data=1; //Set Data HIGH
DoSPIClock(); //Make one SPIClock cycle
CLR_CS();//CS=0; //Set CS LOW
SET_CE();//CE=1; //Set CE HIGH--active mode
}
void TXEN_LOW()
{
CLR_CE();//CE=0; //Set CE LOW
SET_CS();//CS=1; //Set CS HIGH--confige mode
SET_INPUT_DATA();//设DATA为输入
CLR_DATA();//Data=0; //Set Data LOW
DoSPIClock(); //Make one SPIClock cycle
CLR_CS();//CS=0; //Set CS LOW
SET_CE();//CE=1; //Set CE HIGH--active mode
}
void ReceiveShock()
{
SET_INPUT_DATA();//设DATA为输入
SET_DATA();//Data=1; //Set Data tri state
Temp=0;
for (ByteCnt=0;ByteCnt<nRF2401_DataLength_RX;ByteCnt++)
{
for(BitCnt=0;BitCnt<8;BitCnt++)
{
Temp=Temp<<1; //shift left to receive next bit
SET_CLK1();//CLK1=1; //set clock high
_nop_();
_nop_(); //wait one clk cycle
Delay_1(50);
SET_DATA();//Data=1;
if((rPDATE | MASK_BIT(7))==rPDATE)//if(Data==1) //check if Data=high
Temp|=0x01; //yes - set bit high
CLR_CLK1();//CLK1=0; //set clock low
_nop_(); //wait one clk cycle
Delay_1(50);
}
_nop_();
Delay_1(50);
RXData[ByteCnt]=Temp;
SET_DR1();//DR1=1;
}
}
void Main(void)
{ rSYSCFG=SYSCFG_8KB;
//#if (PLLON==1)
ChangePllValue(PLL_M,PLL_P,PLL_S);
//#endif;
Port_Init ();
Uart_Init (0,115200);
Uart_Select (0);
Uart_Printf("nRF2401a test!!\n\r");
Uart_Printf("Data=GPE5;\n\rCLK1=GPE6;\n\rDR1=GPE5;\n\rCS=GPE4;\n\rCE=GPC0;\n\r");
TXData[0]=0xcc; //MSB ;RX receiver 1 address High byte
TXData[1]=0xcc; //MSB-1 ;RX receiver 1 address High byte
TXData[2]=0xcc; //MSB-2 ;RX receiver 1 address Low byte
TXData[3]=0xcc; //MSB-3 ;RX receiver 1 address Low byte
Uart_Printf("nRF2401a init......\n\r");
BuildInitWord();
InitnRF2401();
CE_High();
RXEN_HIGH();
BuildShockWord();
Uart_Printf("nRF2401A is receiveing data......\n\r");
while(1)
{
if((rPDATE | MASK_BIT(5))==rPDATE)//if(DR1==1)
{
ReceiveShock();
//Uart_Printf("DATA:");
Uart_Printf("DATA1:",RXData[0]);
//Uart_Printf("DATA2:",RXData[1]);
Uart_Printf("\n\r");
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|