查看: 1359|回复: 0
打印 上一主题 下一主题

[绝对原创] 2.4G通讯 nrf2401A(PTR4000模块) 程序源代码

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-20 22:36:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


讯通肯定不喜欢我了:)



这次调试比较痛苦,因为2401A发送没有任何的指示,根本没法判断问题,必须发送板和接收板程序都要通过才能知道程序对了。



我在楼道里面,使用250KBps,可以到40米,没有正式到楼下拉距离测试。



还是ICCAVR环境 MEGA16L+11.0592M



点击此处下载armok01113426.rar


为什么上一贴内容自动加上了呢?中文提示还乱码。。。。



贴个主要模块的代码,好参考:

#include "config.h"



extern void DelayMs(uchar ms);

extern void DelayUs(uint us);



//×¢Ò⣺

//1¡¢nef2401AÅäÖÃ×ÖÊÇÏÈдµÚ15×ֽڵģ¡£¡

//2¡¢·¢ËͺóÒªÑÓʱµÈ·¢ËͽáÊøºó²ÅÄÜת»Ø½ÓÊÕģʽ£¬·ñÔòÊý¾Ý·¢ËͲ»³ö





#define SIZE 25     //×î´óÊý¾Ý°ü³¤¶È 32-ADDR4-CRC2=26Byte

#define ADDRSIZE 4  //µØÖ·³¤¶ÈByte



#define CH_NO 2     //Ƶ¶Î±àºÅ



#define BPS_1M      //±àÒë¿ØÖÆ£º1M or 250Kbps



uchar TxBuf[SIZE],RxBuf[SIZE];



/*-------------------------------------------------------------------------------------------

nrf2401AÅäÖüĴæÆ÷ºê¶¨Òå

nrf2401AÅäÖüĴæÆ÷(15Byte)

¹¤×÷ƵÂÊf=2.4G+CH_NO*1MHz

-------------------------------------------------------------------------------------------*/

#define RX_ADDRESS           0xCCCCCCCC               //½ÓÊÕÓÐЧµØÖ·(±¾·½)

#define TX_ADDRESS           0xCCCCCCCC               //·¢ËÍÓÐЧµØÖ·(¶Ô·½)



#define CH_NO_FREQ           CH_NO<<1                 //&sup1;¤×÷&AElig;&micro;&para;&Icirc;       Byte1.7-2

#define RX_EN                                 1                                                  //&frac12;&Oacute;&Ecirc;&Otilde;·&cent;&Euml;&Iacute;&Ccedil;&ETH;&raquo;&raquo;   Byte1.0 1&frac12;&Oacute;&Ecirc;&Otilde; 0·&cent;&Euml;&Iacute;



#define RX2EN_YES            128                       //&micro;&Uacute;2&frac12;&Oacute;&Ecirc;&Otilde;&Iacute;¨&micro;&Agrave;&Ecirc;&sup1;&Auml;&Uuml;1    Byte2.7

#define RX2EN_NO             0                         //&micro;&Uacute;2&frac12;&Oacute;&Ecirc;&Otilde;&Iacute;¨&micro;&Agrave;&Ecirc;&sup1;&Auml;&Uuml;0    Byte2.7

#define CM_SHOCK             64                        //&Ecirc;&Otilde;·&cent;&Auml;&pound;&Ecirc;&frac12;ShockBurst  Byte2.6

#define CM_DIRECT            0                         //&Ecirc;&Otilde;·&cent;&Auml;&pound;&Ecirc;&frac12;DirectMode  Byte2.6

#define RFDR_1M              32                        //&iquest;&Otilde;&Ouml;&ETH;Baud=1M         Byte2.5

#define RFDR_250K            0                         //&iquest;&Otilde;&Ouml;&ETH;Baud=250K       Byte2.5

#define XOF_20MHz            4*4                       //&frac34;§&Igrave;&aring;&Otilde;&ntilde;&micro;&acute;&AElig;÷&AElig;&micro;&Acirc;&Ecirc;20MHz Byte2.4~2

#define XOF_16MHz            3*4                       //&frac34;§&Igrave;&aring;&Otilde;&ntilde;&micro;&acute;&AElig;÷&AElig;&micro;&Acirc;&Ecirc;16MHz

#define XOF_12MHz            2*4                       //&frac34;§&Igrave;&aring;&Otilde;&ntilde;&micro;&acute;&AElig;÷&AElig;&micro;&Acirc;&Ecirc;12MHz

#define XOF_8MHz             1*4                       //&frac34;§&Igrave;&aring;&Otilde;&ntilde;&micro;&acute;&AElig;÷&AElig;&micro;&Acirc;&Ecirc;8MHz  

#define XOF_4MHz             0*4                       //&frac34;§&Igrave;&aring;&Otilde;&ntilde;&micro;&acute;&AElig;÷&AElig;&micro;&Acirc;&Ecirc;4MHz  

#define PA_PWR_0                 0                         //&Ecirc;&auml;&sup3;&ouml;&sup1;&brvbar;&Acirc;&Ecirc;-20dBm      Byte2.1~0

#define PA_PWR_1                  1                         //&Ecirc;&auml;&sup3;&ouml;&sup1;&brvbar;&Acirc;&Ecirc;-10dBm      

#define PA_PWR_2                   2                         //&Ecirc;&auml;&sup3;&ouml;&sup1;&brvbar;&Acirc;&Ecirc;-5dBm      

#define PA_PWR_3                  3                         //&Ecirc;&auml;&sup3;&ouml;&sup1;&brvbar;&Acirc;&Ecirc; 0dBm         



#define ADDR_W                                 (ADDRSIZE<<5)                           //&micro;&Oslash;&Ouml;·&Icirc;&raquo;&Ecirc;&yacute;                          Byte3.7~2

#define CRC_MODE_16BIT       2                         //CRC16&Auml;&pound;&Ecirc;&frac12;           Byte3.1     1

#define CRC_MODE_8BIT        0                         //CRC8&Auml;&pound;&Ecirc;&frac12;            Byte3.1     

#define CRC_EN               1                         //CRC&Ecirc;&sup1;&Auml;&Uuml;             Byte3.0     1

#define CRC16_EN             3                         //CRC16&Auml;&pound;&Ecirc;&frac12;&Ecirc;&sup1;&Auml;&Uuml;      

#define CRC8_EN              1                         //CRC8&Auml;&pound;&Ecirc;&frac12;&Ecirc;&sup1;&Auml;&Uuml;        



#define RX_ADDRESS_0         RX_ADDRESS & 0xff         //&Iacute;¨&micro;&Agrave;1&frac12;&Oacute;&Ecirc;&Otilde;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;1×&Ouml;&frac12;&Uacute; Byte4

#define RX_ADDRESS_1         (RX_ADDRESS >> 8) & 0xff  //&Iacute;¨&micro;&Agrave;1&frac12;&Oacute;&Ecirc;&Otilde;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;2×&Ouml;&frac12;&Uacute; Byte5

#define RX_ADDRESS_2         (RX_ADDRESS >> 16) & 0xff //&Iacute;¨&micro;&Agrave;1&frac12;&Oacute;&Ecirc;&Otilde;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;3×&Ouml;&frac12;&Uacute; Byte6

#define RX_ADDRESS_3         RX_ADDRESS >> 24          //&Iacute;¨&micro;&Agrave;1&frac12;&Oacute;&Ecirc;&Otilde;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;4×&Ouml;&frac12;&Uacute; Byte7

#define RX_ADDRESS_4         0                                       //&Iacute;¨&micro;&Agrave;1&frac12;&Oacute;&Ecirc;&Otilde;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;5×&Ouml;&frac12;&Uacute; Byte8

  

#define RX_ADDRESS2          0                                                   //Byte9,10,11,12,13×&Ouml;&frac12;&Uacute;&Icirc;&ordf;&Iacute;¨&micro;&Agrave;2&frac12;&Oacute;&Ecirc;&Otilde;&micro;&Oslash;&Ouml;·



#define DATA1_W                                 SIZE*8                                           //&frac12;&Oacute;&Ecirc;&Otilde;&Iacute;¨&micro;&Agrave;1&Ecirc;&yacute;&frac34;&Yacute;°ü&sup3;¤&para;&Egrave;&pound;&not;Bit&frac14;&AElig;&Euml;&atilde; Byte14

#define DATA2_W                                 SIZE*8                                           //&frac12;&Oacute;&Ecirc;&Otilde;&Iacute;¨&micro;&Agrave;2&Ecirc;&yacute;&frac34;&Yacute;°ü&sup3;¤&para;&Egrave;&pound;&not;Bit&frac14;&AElig;&Euml;&atilde; Byte15



#define TX_ADDRESS_4                 0                                                    //·&cent;&Euml;&Iacute;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;5×&Ouml;&frac12;&Uacute;

#define TX_ADDRESS_3         TX_ADDRESS >> 24          //·&cent;&Euml;&Iacute;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;4×&Ouml;&frac12;&Uacute;

#define TX_ADDRESS_2         (TX_ADDRESS >> 16) & 0xff //·&cent;&Euml;&Iacute;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;3×&Ouml;&frac12;&Uacute;

#define TX_ADDRESS_1         (TX_ADDRESS >> 8) & 0xff  //·&cent;&Euml;&Iacute;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;2×&Ouml;&frac12;&Uacute;

#define TX_ADDRESS_0         TX_ADDRESS & 0xff         //·&cent;&Euml;&Iacute;&Oacute;&ETH;&ETH;§&micro;&Oslash;&Ouml;·&micro;&Uacute;1×&Ouml;&frac12;&Uacute;





//&ETH;&acute;1Byte

void nrf2401A_WR(uchar val)

{uchar temp,i;

  //MSB first &cedil;&szlig;&Icirc;&raquo;&iquest;&ordf;&Ecirc;&frac14;,&Iuml;&Egrave;&Ecirc;&auml;&sup3;&ouml;DATA&pound;&not;&Egrave;&raquo;&ordm;óCLK_Up&pound;&not;&Ocirc;&Ugrave;CLK_Dn

  SET(DDRA,DATA);//&Ouml;&Atilde;DATA&Ecirc;&auml;&sup3;&ouml;

  temp=val;

  

  for (i=0;i<8;i++)

  {

    if ((temp&0x80)>0)

        SET(PORTA,DATA);

          else

             CLR(PORTA,DATA);

        

        NOP();

          SET(PORTA,CLK);

          NOP();

          CLR(PORTA,CLK);

  

          temp=temp<<1;

  }

}



//&para;&Aacute;1Byte

uchar nrf2401A_RD()

{uchar temp,i;

  //MSB first &cedil;&szlig;&Icirc;&raquo;&iquest;&ordf;&Ecirc;&frac14;,&Iuml;&Egrave;&para;&Aacute;&Egrave;&euml;DATA&pound;&not;&Egrave;&raquo;&ordm;óCLK_Up&pound;&not;&Ocirc;&Ugrave;CLK_Dn

  CLR(DDRA,DATA);//&Ouml;&Atilde;DATA&Ecirc;&auml;&Egrave;&euml;

  temp=0;

  

  for (i=0;i<8;i++)

  {

    temp=temp<<1;

    if ((PINA&(1<<DATA))>0)

       temp=temp|1;

        

        NOP();

          SET(PORTA,CLK);

          NOP();

          CLR(PORTA,CLK);

  }

  

        return temp;

}



//PwrDown->StandBy

void nrf2401A_StandBy()

{

   SET(PORTA,PWR2);

   CLR(PORTA,CE);

   CLR(PORTA,CS);

}



//->PwrDown

void nrf2401A_Off()

{

  CLR(PORTA,PWR2);

  CLR(PORTA,CE);

  CLR(PORTA,CS);

}



//&Aring;&auml;&Ouml;&Atilde;&Auml;&pound;&Ecirc;&frac12;

void nrf2401A_RwOn()

{

  SET(PORTA,PWR2);

  CLR(PORTA,CE);

  SET(PORTA,CS);



}



//&sup1;¤×÷&Auml;&pound;&Ecirc;&frac12;

void nrf2401A_Run()

{

  SET(PORTA,PWR2);

  CLR(PORTA,CS);//first

  SET(PORTA,CE);



}



//&Aring;&auml;&Ouml;&Atilde;nRF2401A

void nrf2401A_Config(void)

{

   nrf2401A_RwOn();//&Aring;&auml;&Ouml;&Atilde;×&acute;&Igrave;&not;



   nrf2401A_WR(DATA2_W);

   nrf2401A_WR(DATA1_W);

   nrf2401A_WR(RX_ADDRESS2);

   nrf2401A_WR(RX_ADDRESS2);

   nrf2401A_WR(RX_ADDRESS2);

   nrf2401A_WR(RX_ADDRESS2);

   nrf2401A_WR(RX_ADDRESS2);

   nrf2401A_WR(RX_ADDRESS_4);

   nrf2401A_WR(RX_ADDRESS_3);

   nrf2401A_WR(RX_ADDRESS_2);

   nrf2401A_WR(RX_ADDRESS_1);

   nrf2401A_WR(RX_ADDRESS_0);

   nrf2401A_WR(CRC16_EN|ADDR_W);//CRC16,AddrWidth

   

   #ifdef BPS_1M                  

    nrf2401A_WR(PA_PWR_3|XOF_16MHz|RFDR_1M|CM_SHOCK);//0dbm,16M,1Mbps,ShockBurst

   #else

    nrf2401A_WR(PA_PWR_3|XOF_16MHz|CM_SHOCK);//0dbm,16M,250Kbps,ShockBurst

   #endif

   

   nrf2401A_WR(CH_NO_FREQ|RX_EN); //RxMode,Chan

   

   nrf2401A_StandBy();//&Ouml;&acute;&ETH;&ETH;&Aring;&auml;&Ouml;&Atilde;

}



//&frac12;&Oacute;&Ecirc;&Otilde;&Auml;&pound;&Ecirc;&frac12;

void nrf2401A_RxOn()

{

   nrf2401A_RwOn();

   nrf2401A_WR(CH_NO_FREQ|RX_EN); //RxMode,Chan

   nrf2401A_Run();

}



//·&cent;&Euml;&Iacute;&Auml;&pound;&Ecirc;&frac12;

void nrf2401A_TxOn()

{

   nrf2401A_RwOn();

   nrf2401A_WR(CH_NO_FREQ); //TxMode,Chan

   nrf2401A_Run();

}



//&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;nrf2401A

void nrf2401A_Init()

{

   CLR(PORTA,CLK);//

   nrf2401A_StandBy();

   DelayMs(10);//!!!must >3ms

   nrf2401A_Config();

   

   nrf2401A_RxOn();//&frac12;&Oacute;&Ecirc;&Otilde;×&acute;&Igrave;&not;

}





//&ETH;&acute;Tx&micro;&Oslash;&Ouml;·

void nrf2401A_SetTxAddr()

{

  nrf2401A_WR(TX_ADDRESS_3);

  nrf2401A_WR(TX_ADDRESS_2);

  nrf2401A_WR(TX_ADDRESS_1);

  nrf2401A_WR(TX_ADDRESS_0);

  

}



//&ETH;&acute;Tx&Ecirc;&yacute;&frac34;&Yacute;

void nrf2401A_SetData()

{uchar i;

  

  for (i=0;i<SIZE;i++)

    nrf2401A_WR(TxBuf);

  

}



//·&cent;&Euml;&Iacute;TxBuf&Ouml;&ETH;&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;

void nrf2401A_SendData()

{

   nrf2401A_TxOn();

   SET(PORTA,CE);

   nrf2401A_SetTxAddr();//&ETH;&acute;·&cent;&Euml;&Iacute;&micro;&Oslash;&Ouml;·

   nrf2401A_SetData();//&ETH;&acute;&Ecirc;&yacute;&frac34;&Yacute;

   CLR(PORTA,CE);//&AElig;&ocirc;&para;&macr;·&cent;&Euml;&Iacute;

   //·&cent;&Euml;&Iacute;&Iacute;ê±&Iuml;&ordm;ó&frac12;&oslash;&Egrave;&euml;StandBy



}





//&para;&Aacute;&sup3;&ouml;&frac12;&Oacute;&Ecirc;&Otilde;&micro;&frac12;&micro;&Auml;&Ecirc;&yacute;&frac34;&Yacute;

void nrf2401A_ReadData()

{uchar i;

   for (i=0;i<SIZE;i++)

     {

           RxBuf=nrf2401A_RD();

         }

  

}

再传个资料试试:



PTR4000模块PDF:

点击此处打开armok01113449.pdf



nrf2401A英文PDF:

点击此处打开armok01113450.pdf

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

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