搜索
bottom↓
回复: 1

请教一下44B0和NRF2401传输的问题!【恢复】

[复制链接]

出0入0汤圆

发表于 2009-1-8 10:36:44 | 显示全部楼层 |阅读模式
最近在做单片机和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, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-1-8 10:44:42 | 显示全部楼层
串口可以打印的,说明串口部分没问题,IO口的初始化是这样的:

CE-GPC0:输出模式(01)

CS-GPE4:输出模式(01)

DR1-GPE5:输入模式(00)

CLK1-GPE6:输出模式(01)

DATA-GPE7:输出模式(00)



5个口都已经上拉。

程序中对DATA的操作之前应该对其端口进行输入/输出模式配置吧,但不知道错在哪,还请大家帮忙看看!

                                                           

                                                                  
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 23:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表