搜索
bottom↓
回复: 69

nrf24l01读取STATUS不正确

[复制链接]

出0入0汤圆

发表于 2014-3-21 23:22:02 | 显示全部楼层 |阅读模式
程序都断断续续搞了好几天了,高中生求大神们讲解。(为了这个问题刚刚给阿莫贡献了30元人民币
  程序在向上位机发送的STATUS总是0x0e,我没有用另一个nrf24L01就收,没有接收机STATUS寄存器也应该有发送次数溢出中断啊。怎么修改能让程序等待IRQ引脚变低,然后正确读出STATUS寄存器,获知是发送成功还是发送次数溢出。我是跪了,大家帮帮我。
                                #include "reg51.h"
                sbit Led_red=P2^0;
                sbit Led_green=P2^1;
                sbit g=P2^2;
                #define on 1;
                #define off 0;
                #define h 1;
                #define l 0;
                sbit si=P3^4;
                sbit so=P3^3;
                sbit irq=P3^2;
                sbit  sl=P3^5;
                sbit csn=P3^6;
                        sbit ce=P3^7;

                                #define uchar  date
                #define READ_REG        0x00   // ??????
#define WRITE_REG       0x20  // ??????
#define RD_RX_PLOAD     0x61   // ????????
#define WR_TX_PLOAD     0xA0   // ???????
#define FLUSH_TX        0xE1  // ???? FIFO??
#define FLUSH_RX        0xE2   // ???? FIFO??
#define REUSE_TX_PL     0xE3   // ??????????
#define NOP             0xFF   // ??
                #define TX_ADR_WIDTH    5   
#define RX_ADR_WIDTH    5   
#define TX_PLOAD_WIDTH  1   
#define RX_PLOAD_WIDTH  1  
const  char TX_ADDRESS[TX_ADR_WIDTH]= {0x01,0x22,0x03,0x04,0x05}; //????
const char RX_ADDRESS[RX_ADR_WIDTH]= {0x01,0x22,0x33,0x44,0x05}; //
#define CONFIG          0x00  // ??????,CRC??????????????
#define EN_AA           0x01  // ????????
#define EN_RXADDR       0x02  // ??????
#define SETUP_AW        0x03  // ????????
#define SETUP_RETR      0x04  // ????????
#define RF_CH           0x05  // ??????
#define RF_SETUP        0x06  // ???????????
#define STATUS          0x07  // ?????
#define OBSERVE_TX      0x08  // ??????
#define CD              0x09  // ????           
#define RX_ADDR_P0      0x0A  // ??0??????
#define RX_ADDR_P1      0x0B  // ??1??????
#define RX_ADDR_P2      0x0C  // ??2??????
#define RX_ADDR_P3      0x0D  // ??3??????
#define RX_ADDR_P4      0x0E  // ??4??????
#define RX_ADDR_P5      0x0F  // ??5??????
#define TX_ADDR         0x10  // ???????
#define RX_PW_P0        0x11  // ????0??????
#define RX_PW_P1        0x12  // ????0??????
#define RX_PW_P2        0x13  // ????0??????
#define RX_PW_P3        0x14  // ????0??????
#define RX_PW_P4        0x15  // ????0??????
#define RX_PW_P5        0x16  // ????0??????
#define FIFO_STATUS     0x17  // FIFO???????????
#define XTAL 11059200    // CUP ????
#define baudrate 9600    // ?????
void  system_init();
                                void nrf_init();
                                void other_init();
                                char  Spi_rw(char);
                                void delay();
                                        char SPI_Read_Reg(char address);
  void SPI_Write_Reg(char address,char value);
int SPI_Write_Buf(char reg, char *pBuf, char uchars);
        void  SPI_Read_Buf(char reg, char *pBuf, char chars);                               
                        void delay()
{int a;
        for(a=1;a<10;a++);

}                       
                       
                        char Vibration=1;
                                void exit_init();void sleep();
void receive () interrupt 0
{
g=on;
        delay();
                g=off;
sleep();
}
void send (char date,int time)
        {int dir=0,success,temp;
                char a[5];
       
        ce=l;
               
                        SPI_Write_Reg(WRITE_REG+WR_TX_PLOAD,0XAA);       
  
                ce=h;
                delay();
ce=l;

}
void usart()
{TMOD = 0x20;
TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));
TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));    // ???0???
SCON = 0x50;
PCON = 0x00;   
TR1 = 1;
IE = 0x00; // ??????
}
void main ()
                                {usart();
                        //        system_init();
                                        nrf_init();
                send (0xaa,2);
                                        SBUF=SPI_Read_Reg(STATUS);
while(1);
                                       
}
                                void        system_init()
                                {
                                        g=off;
                                nrf_init();
      //  exit_init();
                               
                                //        Led_green=off;
                                }
                                void nrf_init()
                                {
                                                ce=l;
csn=h;
sl=0;
                                        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);

                                SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, RX_ADR_WIDTH); // ??????
SPI_Write_Reg(WRITE_REG + EN_AA, 0x01);      //  0ͨµÀ´ò¿ª

SPI_Write_Reg(WRITE_REG + EN_RXADDR, 0x01);  //0ͨµÀÓ¦´ð
SPI_Write_Reg(WRITE_REG + RF_CH, 0);        //  ÆµÂÊ
SPI_Write_Reg(WRITE_REG + RX_PW_P0, 0x01); //0ͨµÀÊý¾Ý¿í¶È
SPI_Write_Reg(WRITE_REG + RF_SETUP, 0x07);       //ËÙÂÊ
                                       
SPI_Write_Reg(WRITE_REG + SETUP_AW,0x03);     //5×Ö½ÚµØÖ·¿í¶È
                                        SPI_Write_Reg(WRITE_REG + CONFIG,0xa);
       

}
                                char Spi_rw(char date)

                        {       
                                char dir=0;
                                for (dir=0;dir<8;dir++)
                                                                        {
                si = (date & 0x80);         // output 'uchar', MSB to MOSI
  date = (date << 1);           // shift next bit into MSB..
  sl = 1;                      // Set SCK high..
  date |= so;           // capture current MISO bit
  sl= 0;                                         
                                                                         }
   
                                                                       
                                                                         return (date);

                        }
                        int SPI_Write_Buf(char reg, char *pBuf, char chars)
{int dir;
        csn=l;
Spi_rw(reg);
for (dir=0;dir<chars;dir++)
        {
Spi_rw(*pBuf++);

}
        csn=h;
}
                        void  SPI_Read_Buf(char reg, char *pBuf, char chars)
{int dir;
        csn=l;
Spi_rw(reg);
for (dir=0;dir<chars;dir++)
        {
pBuf[dir]=Spi_rw(0);

}
csn=h;       
}
void  SPI_Write_Reg(char address,char value)
{csn=l;
Spi_rw(address);
        Spi_rw(value);
        csn=h;
}
char SPI_Read_Reg(char address)
{char temp;
        csn=l;
Spi_rw(address);
        temp=Spi_rw(0);
        csn=h;
return        temp;
}                               

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2014-3-21 23:22:58 | 显示全部楼层
求大神啊,我跪了好几天了

出0入0汤圆

发表于 2014-3-21 23:34:16 | 显示全部楼层
过来看看

出0入0汤圆

 楼主| 发表于 2014-3-21 23:38:36 来自手机 | 显示全部楼层
你别光冒泡刷分啊,解决问题啊

出0入0汤圆

发表于 2014-3-22 08:17:23 | 显示全部楼层
本帖最后由 windingway 于 2014-3-22 08:32 编辑

建议楼主发帖的时候,在功能栏最右边一组里选择"添加代码文字",这样代码比较好阅读啊..
这个芯片的参考程序很多,楼主可以参考.
比如这个:参考程序,还有这个野火哥的资料

出0入0汤圆

 楼主| 发表于 2014-3-22 08:33:18 来自手机 | 显示全部楼层
我用别人的例程也是这个问题

出0入0汤圆

 楼主| 发表于 2014-3-22 08:34:19 来自手机 | 显示全部楼层
昨天才30注册的amo,不会用,下次注意,"添加代码"

出0入0汤圆

 楼主| 发表于 2014-3-22 08:35:25 来自手机 | 显示全部楼层
windingway 发表于 2014-3-22 08:17
建议楼主发帖的时候,在功能栏最右边一组里选择"添加代码文字",这样代码比较好阅读啊..
这个芯片的参考程序 ...

你做过?我都调试好几天了,就是不对,我跑别人的程序,问题依旧。

出0入0汤圆

发表于 2014-3-22 08:40:17 | 显示全部楼层
勤劳的小码农 发表于 2014-3-22 08:35
你做过?我都调试好几天了,就是不对,我跑别人的程序,问题依旧。

就我观察,楼主的send()函数中
  1. void send (char date,int time)
  2. {       
  3.         int dir=0,success,temp;
  4.         char a[5];
  5.         ce=l;
  6.         SPI_Write_Reg(WRITE_REG+WR_TX_PLOAD,0XAA);
  7.         ce=h;
  8.         delay();
  9.         ce=l;
  10. }
复制代码

调用的SPI_Write_Reg(WRITE_REG+WR_TX_PLOAD,0XAA);有些问题?
看数据手册的SPI Command,想要发送有效数据(payload),要使用的SPI指令是W_TX_PAYLOAD吧,而不是"WRITE_REG+WR_TX_PLOAD"

出0入0汤圆

 楼主| 发表于 2014-3-22 09:05:28 来自手机 | 显示全部楼层
windingway 发表于 2014-3-22 08:40
就我观察,楼主的send()函数中

调用的SPI_Write_Reg(WRITE_REG+WR_TX_PLOAD,0XAA);有些问题?

看到了。我竟然没注意到,好多天了。中午放学回家我再试试。谢谢皮卡丘

出0入0汤圆

发表于 2014-3-22 09:18:02 | 显示全部楼层
勤劳的小码农 发表于 2014-3-22 09:05
看到了。我竟然没注意到,好多天了。中午放学回家我再试试。谢谢皮卡丘 ...

楼主你是高中生啊,厉害。

出0入0汤圆

 楼主| 发表于 2014-3-22 09:45:15 来自手机 | 显示全部楼层
logosz 发表于 2014-3-22 09:18
楼主你是高中生啊,厉害。

过奖过奖,还请前辈多多指导

出0入0汤圆

发表于 2014-3-22 09:46:53 | 显示全部楼层
勤劳的小码农 发表于 2014-3-22 09:45
过奖过奖,还请前辈多多指导

你用示波器看下波形。再有就是注意是否开启了自动重发功能。以及中断是否开启。

出0入0汤圆

发表于 2014-3-22 09:48:27 | 显示全部楼层
勤劳的小码农 发表于 2014-3-22 09:45
过奖过奖,还请前辈多多指导

同学我很好奇你是怎么知道电子的,比如单片机之类的,可以编程的。我高中那会儿连C语言都没听说过。大学快毕业了才知道。

出0入0汤圆

 楼主| 发表于 2014-3-22 09:55:33 来自手机 | 显示全部楼层
logosz 发表于 2014-3-22 09:48
同学我很好奇你是怎么知道电子的,比如单片机之类的,可以编程的。我高中那会儿连C语言都没听说过。大学 ...

最初知道易语言 然后vb再然后c+再再然后单片机

出0入0汤圆

发表于 2014-3-22 10:03:29 | 显示全部楼层
勤劳的小码农 发表于 2014-3-22 09:55
最初知道易语言 然后vb再然后c+再再然后单片机

这么厉害。

出0入0汤圆

发表于 2014-3-22 11:00:19 | 显示全部楼层
logosz 发表于 2014-3-22 09:48
同学我很好奇你是怎么知道电子的,比如单片机之类的,可以编程的。我高中那会儿连C语言都没听说过。大学 ...

话说我初中的时候就买过电子制作的书(青少年电子制作,一套10本的样子),可惜完全看不懂...小学的时候捣鼓小霸王,还写过basic程序呢.可惜直到大学毕业才开始入门的

出0入0汤圆

 楼主| 发表于 2014-3-22 11:46:37 来自手机 | 显示全部楼层
我大学打算学计算机应用技术,真心喜欢电子

出0入0汤圆

 楼主| 发表于 2014-3-22 12:48:05 | 显示全部楼层
windingway 发表于 2014-3-22 11:00
话说我初中的时候就买过电子制作的书(青少年电子制作,一套10本的样子),可惜完全看不懂...小学的时候捣鼓 ...

你qq多少?你能不能远程协控帮我调一下程序,还是不对

出0入0汤圆

发表于 2014-3-22 12:58:07 | 显示全部楼层
勤劳的小码农 发表于 2014-3-22 12:48
你qq多少?你能不能远程协控帮我调一下程序,还是不对

同学,不知道你把手册看明白没有。看明白再搞。

出0入0汤圆

 楼主| 发表于 2014-3-22 13:04:20 | 显示全部楼层
我认为我吧数据手册看明白了,你找到的那个是我写的时候没注意到,是个失误。我阿莫上看到的别人的程序,在我这也是有毛病,和我写的程序一样

出0入0汤圆

 楼主| 发表于 2014-3-22 13:04:55 | 显示全部楼层
logosz 发表于 2014-3-22 12:58
同学,不知道你把手册看明白没有。看明白再搞。

我认为我吧数据手册看明白了,你找到的那个是我写的时候没注意到,是个失误。我阿莫上看到的别人的程序,在我这也是有毛病,和我写的程序一样

出0入0汤圆

 楼主| 发表于 2014-3-23 17:33:26 | 显示全部楼层
windingway 发表于 2014-3-22 08:40
就我观察,楼主的send()函数中

调用的SPI_Write_Reg(WRITE_REG+WR_TX_PLOAD,0XAA);有些问题?

你在回帖子时在那选的输入源码使输入显示成源码形式?

出0入0汤圆

发表于 2014-3-23 17:35:52 | 显示全部楼层
勤劳的小码农 发表于 2014-3-23 17:33
你在回帖子时在那选的输入源码使输入显示成源码形式?


你的程序调通了没?翻出来买的几个吃灰的24L01模块,我也试试..

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-3-23 17:38:20 | 显示全部楼层
windingway 发表于 2014-3-23 17:35
你的程序调通了没?翻出来买的几个吃灰的24L01模块,我也试试..
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. sbit MOSI=P3^4;
  4.                 sbit MISO=P3^3;
  5.                 sbit IRQ=P3^2;
  6.                 sbit  SCK=P3^5;
  7.                 sbit CSN=P3^6;
  8.                         sbit CE=P3^7;
  9. void usart()
  10. {TMOD = 0x20; // ???1???8???????, ???????
  11. TH1=(unsigned char)(256 - (11059200 / (32L * 12L * 9600)));
  12. TL1=(unsigned char)(256 - (11059200  / (32L * 12L * 9600)));    // ???0???
  13. SCON = 0x50;
  14. PCON = 0x00;   
  15. TR1 = 1;
  16. IE = 0x00; // ??????
  17. }
  18. #include <reg52.h>
  19. #include <intrins.h>
  20. typedef unsigned int uint;
  21. typedef unsigned char uchar;
  22. #define TX_ADDR_WITDH 5//?????????5???
  23. #define RX_ADDR_WITDH 5//?????????5???
  24. #define TX_DATA_WITDH 8//
  25. #define RX_DATA_WITDH 8

  26. #define R_REGISTER    0x00  // ????
  27. #define W_REGISTER    0x20  // ????
  28. #define R_RX_PLOAD    0x61  // ?RX FIFO????,1-32??,???????,?????,???????
  29. #define W_TX_PLOAD    0xA0  // ?TX FIFO????,1-32??,??????0??,???????
  30. #define FLUSH_TX    0xE1  // ??TX FIFO???,???????
  31. #define FLUSH_RX    0xE2  // ??RX FIFO???,???????
  32. #define REUSE_TX_PL 0xE3  // ???????????,?CE?????,???????????
  33. #define NOP         0xFF  // ???,??????????

  34. #define CONFIG      0x00  // ?????
  35. #define EN_AA       0x01  // “????”????
  36. #define EN_RX_ADDR  0x02  // ?????????
  37. #define SETUP_AW    0x03  // ?????????
  38. #define SETUP_RETR  0x04  // ?????????
  39. #define RF_CH       0x05  // ???????????
  40. #define RF_SETUP    0x06  // ???????
  41. #define STATUS      0x07  // ?????
  42. #define OBSERVE_TX  0x08  // ???????
  43. #define CD          0x09  // ???????
  44. #define RX_ADDR_P0  0x0A  // ????0???????
  45. #define RX_ADDR_P1  0x0B  // ????1???????
  46. #define RX_ADDR_P2  0x0C  // ????2???????
  47. #define RX_ADDR_P3  0x0D  // ????3???????
  48. #define RX_ADDR_P4  0x0E  // ????4???????
  49. #define RX_ADDR_P5  0x0F  // ????5???????
  50. #define TX_ADDR     0x10  // ???????
  51. #define RX_PW_P0    0x11  // ????0???????????
  52. #define RX_PW_P1    0x12  // ????1???????????
  53. #define RX_PW_P2    0x13  // ????2???????????
  54. #define RX_PW_P3    0x14  // ????3???????????
  55. #define RX_PW_P4    0x15  // ????4???????????
  56. #define RX_PW_P5    0x16  // ????5???????????
  57. #define FIFO_STATUS 0x17  // FIFO?????
  58. //*********************************************************************************
  59. uchar sta;    // ????
  60. #define RX_DR  (sta & 0x40)  // ????????
  61. #define TX_DS  (sta & 0x20)  // ????????
  62. #define MAX_RT (sta & 0x10)  // ????????


  63. sbit LED=P2^4;
  64. uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};
  65. uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};
  66. uchar RX_Buffer[RX_DATA_WITDH];
  67. void _delay_us(uint x)
  68. {
  69. uint i,j;
  70. for (j=0;j<x;j++)
  71.   for (i=0;i<12;i++);
  72. }
  73. void _delay_ms(uint x)
  74. {
  75. uint i,j;
  76. for (j=0;j<x;j++)
  77.   for (i=0;i<120;i++);
  78. }
  79. //nRF24L01???
  80. void nRF24L01_Init(void)
  81. {
  82. CE=0;//?????
  83. CSN=1;
  84. SCK=0;
  85. IRQ=1;
  86. }
  87. //SPI????
  88. uchar SPI_RW(uchar byte)
  89. {
  90. uchar i;
  91. for(i=0;i<8;i++)//???8???8???
  92. {
  93.   if(byte&0x80)//????????1
  94.    MOSI=1;//?NRF24L01?1
  95.   else //???0
  96.    MOSI=0;
  97.   byte<<=1;//????????
  98.   SCK=1;//SCK??,??????,????????
  99.   if(MISO)
  100.    byte|=0x01;
  101.   SCK=0;//SCK??
  102. }
  103. return byte;//???????
  104. }
  105. //SPI?????????
  106. //reg:?????
  107. //value:???(?)
  108. uchar SPI_W_Reg(uchar reg,uchar value)
  109. {
  110. uchar status;//????
  111. CSN=0;//SPI??
  112. status=SPI_RW(reg);//???????,??????
  113. SPI_RW(value);//?????
  114. CSN=1;//
  115. return status;//????
  116. }
  117. //SPI????
  118. uchar SPI_R_byte(uchar reg)
  119. {
  120. uchar reg_value;
  121. CSN=0;//SPI??
  122. SPI_RW(reg);//????
  123. reg_value=SPI_RW(0);//???????
  124. CSN=1;
  125. return reg_value;//??????
  126. }
  127. //SPI??RXFIFO?????
  128. //reg:?????
  129. //Dat_Buffer:????????
  130. //DLen:????
  131. uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
  132. {
  133. uchar status,i;
  134. CSN=0;//SPI??
  135. status=SPI_RW(reg);//???????,????
  136. for(i=0;i<Dlen;i++)
  137. {
  138.   Dat_Buffer[i]=SPI_RW(0);//????
  139. }
  140. CSN=1;
  141. return status;
  142. }
  143. //SPI?TXFIFO???????
  144. //reg:???????
  145. //TX_Dat_Buffer:?????????
  146. //Dlen:????
  147. uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
  148. {
  149. uchar status,i;
  150. CSN=0;//SPI??,????
  151. status=SPI_RW(reg);
  152. for(i=0;i<Dlen;i++)
  153. {
  154.   SPI_RW(TX_Dat_Buffer[i]);//????
  155. }
  156. CSN=1;
  157. return status;
  158. }
  159. //??????
  160. void nRF24L01_Set_TX_Mode(uchar *TX_Data)
  161. {
  162. CE=0;//??(????????????????????)
  163. SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);//??????+??????+????
  164. SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);//??????????,????0?????????
  165. SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);//???????+????+??????
  166. SPI_W_Reg(W_REGISTER+EN_AA,0x01);//????0????
  167. SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);//??????0
  168. SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a);//??????250US+86US,??10?
  169. SPI_W_Reg(W_REGISTER+RF_CH,0);//2.4GHZ
  170. SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);//1Mbps??,????:0DBM,????????
  171. SPI_W_Reg(W_REGISTER+CONFIG,0x0e);//????,??,16?CRC??,CRC??
  172. CE=1;//????
  173. _delay_ms(5);//CE?????????10US??
  174. }
  175. //??????
  176. uchar Check_Ack(void)
  177. {
  178. sta=SPI_R_byte(R_REGISTER+STATUS);//??????
  179. if(TX_DS||MAX_RT)//??TX_DS?MAX_RT?1,????????TX_FIFO?????
  180. {
  181.           SBUF=SPI_R_byte(R_REGISTER+STATUS);
  182.   SPI_W_Reg(W_REGISTER+STATUS,0xff);
  183.   CSN=0;
  184.   SPI_RW(FLUSH_TX);//??????????????,?????
  185.   CSN=1;
  186.   return 0;
  187. }
  188. else{
  189.           SBUF=SPI_R_byte(R_REGISTER+STATUS);
  190.          return 1;
  191. }

  192. }
  193. void main(void)
  194. {
  195. uchar i;
  196. P0=0xff;//???IO?
  197. P1=0xff;
  198. P2=0xff;
  199. P3=0xff;
  200. _delay_us(100);
  201. usart();
  202. nRF24L01_Init();//NRF24L01???
  203. while(1)
  204. {
  205.   for(i=0;i<TX_DATA_WITDH-1;i++)//??7???
  206.   {
  207.    nRF24L01_Set_TX_Mode(&TX_Buffer[i]);//????
  208.    while(Check_Ack());//??????
  209.     LED=0;
  210.     _delay_us(5000);
  211.     LED=1;
  212.   }
  213. }
  214. }
复制代码

出0入0汤圆

 楼主| 发表于 2014-3-23 17:40:09 | 显示全部楼层
windingway 发表于 2014-3-23 17:35
你的程序调通了没?翻出来买的几个吃灰的24L01模块,我也试试..

我是11.0592晶振,9600波特率,你试试上位机收到什么?我测试就用这一个nrf,正常情况应该在STATUS读到发送次数溢出标志啊,你试试

出0入0汤圆

发表于 2014-3-23 17:41:50 | 显示全部楼层
勤劳的小码农 发表于 2014-3-23 17:40
我是11.0592晶振,9600波特率,你试试上位机收到什么?我测试就用这一个nrf,正常情况应该在STATUS读到发 ...

恩,我周一上班搭个板子试试,我不会用AVR,一直用PIC,不过调起来应该是一样的.

出0入0汤圆

 楼主| 发表于 2014-3-23 17:52:14 | 显示全部楼层
windingway 发表于 2014-3-23 17:41
恩,我周一上班搭个板子试试,我不会用AVR,一直用PIC,不过调起来应该是一样的. ...

这是51的,直接插好数据线,打开串口9600波特率就会收到STATUS的内容,看看StATUS合不合法就行,反正我是收到的0xff。

出0入0汤圆

 楼主| 发表于 2014-3-24 11:26:04 来自手机 | 显示全部楼层
windingway 发表于 2014-3-23 17:41
恩,我周一上班搭个板子试试,我不会用AVR,一直用PIC,不过调起来应该是一样的. ...

程序测试了?

出0入0汤圆

发表于 2014-3-24 12:07:11 | 显示全部楼层

正在搭电路板

出0入0汤圆

 楼主| 发表于 2014-3-24 13:35:22 | 显示全部楼层

你只要修改io和串口的程序,尽量保持我的程序是我原来的逻辑

出0入0汤圆

发表于 2014-3-24 15:50:09 | 显示全部楼层
勤劳的小码农 发表于 2014-3-24 13:35
你只要修改io和串口的程序,尽量保持我的程序是我原来的逻辑

我自己移植了卖给我模块的人提供的程序,只发送的话,读取回来status寄存器的值为二进制0b00011111,看起来是正常的MAX_RT被置1了.
待会我再把接收端的板子搭起来看看.
另外,你的24L01供电是3.3V不?不能用5V供电的.

出0入0汤圆

 楼主| 发表于 2014-3-24 15:54:14 来自手机 | 显示全部楼层
windingway 发表于 2014-3-24 15:50
我自己移植了卖给我模块的人提供的程序,只发送的话,读取回来status寄存器的值为二进制0b00011111,看起来 ...

你移植我的程序试试

出0入0汤圆

发表于 2014-3-24 15:56:42 | 显示全部楼层


我打算先用自己移植好的,跑通了再说..

出0入0汤圆

 楼主| 发表于 2014-3-24 16:05:06 来自手机 | 显示全部楼层
windingway 发表于 2014-3-24 15:56
我打算先用自己移植好的,跑通了再说..

我特关心我的程序

出0入0汤圆

 楼主| 发表于 2014-3-24 16:23:35 来自手机 | 显示全部楼层
windingway 发表于 2014-3-24 15:56
我打算先用自己移植好的,跑通了再说..

你是如何做到天天在线的

出0入0汤圆

发表于 2014-3-24 18:01:31 | 显示全部楼层
勤劳的小码农 发表于 2014-3-24 16:23
你是如何做到天天在线的

上班党,困了累了一定要上论坛!..
今天下班前吧接收机的电路搭好了,明天调试.

出0入0汤圆

 楼主| 发表于 2014-3-24 18:27:08 来自手机 | 显示全部楼层
你做什么工作?一月多少工资

出0入0汤圆

 楼主| 发表于 2014-3-25 10:07:43 来自手机 | 显示全部楼层
windingway 发表于 2014-3-24 18:01
上班党,困了累了一定要上论坛!..
今天下班前吧接收机的电路搭好了,明天调试. ...

比卡丘,我的程序什么时候测试啊

出0入0汤圆

发表于 2014-3-25 19:02:54 | 显示全部楼层
本帖最后由 windingway 于 2014-3-25 19:04 编辑
勤劳的小码农 发表于 2014-3-25 10:07
比卡丘,我的程序什么时候测试啊


我移植的程序已经初步测试好了,你的程序我就不再移植了,看了看基本上是一个模式.这种事干一次就好.
我的测试代码很简单,发送端发送4个数,如果接收端收到,并向发送端发出响应,那么发送端把这4个数加1后,再次发送,如此循环..
发送端和接收端只有main.c文件不同,其他文件一致
hardware.h保存硬件连线配置
NRF24L01.c和NRF24L01.h是无线模块的功能函数
main.c为发送端和接收端的测试.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
hardware.h
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  1. #ifndef HARDWARE_H
  2. #define HARDWARE_H

  3. #include <htc.h>
  4. #define _XTAL_FREQ 4000000

  5. #define INPUT        1
  6. #define OUTPUT        0
  7. #define HIGH        1
  8. #define LOW                0

  9. #define _NRF_CE                RA0
  10. #define _NRF_CSN        RA1
  11. #define _NRF_IRQ        RA2
  12. #define _DIR_NRF_CE                TRISA0
  13. #define _DIR_NRF_CSN        TRISA1
  14. #define _DIR_NRF_IRQ        TRISA2

  15. #define        _SPI_SCK                RC3
  16. #define        _SPI_MISO                RC4
  17. #define        _SPI_MOSI                RC5
  18. #define _DIR_SPI_SCK                TRISC3
  19. #define _DIR_SPI_MISO        TRISC4
  20. #define _DIR_SPI_MOSI        TRISC5

  21. #endif
复制代码


------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NRF24L01.h
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  1. #ifndef NRF24L01_H
  2. #define NRF24L01_H

  3. /*******************************************************/
  4. #define TX_ADDR_WITDH 5        //发送地址宽度设置为5个字节
  5. #define RX_ADDR_WITDH 5        //接收地址宽度设置为5个字节
  6. #define TX_DATA_WITDH 4//发送数据宽度4个字节
  7. #define RX_DATA_WITDH 4//接收数据宽度4个字节
  8. /*******************命令寄存器***************************/
  9. #define  R_REGISTER      0x00//读取配置寄存器
  10. #define  W_REGISTER      0x20//写配置寄存器
  11. #define  R_RX_PAYLOAD          0x61//读取RX有效数据
  12. #define  W_TX_PAYLOAD         0xa0//写TX有效数据
  13. #define  FLUSH_TX                 0xe1//清除TXFIFO寄存器
  14. #define  FLUSH_RX                 0xe2//清除RXFIFO寄存器
  15. #define  REUSE_TX_PL     0xe3//重新使用上一包有效数据
  16. #define  NRF_NOP             0xff//空操作
  17. /******************寄存器地址****************************/
  18. #define  NRF_CONFIG          0x00//配置寄存器
  19. #define  EN_AA                         0x01//使能自动应答
  20. #define  EN_RXADDR       0x02//接收通道使能0-5个通道
  21. #define  SETUP_AW        0x03//设置数据通道地址宽度3-5
  22. #define  SETUP_RETR      0x04//建立自动重发
  23. #define  RF_CH           0x05//射频通道设置
  24. #define  RF_SETUP        0x06//射频寄存器
  25. #define  NRF_STATUS_ADR          0x07//状态寄存器
  26. #define  OBSERVE_TX      0x08//发送检测寄存器
  27. #define  NRF_CD              0x09//载波
  28. #define  RX_ADDR_P0      0x0a//数据通道0接收地址
  29. #define  RX_ADDR_P1      0x0b//数据通道1接收地址
  30. #define  RX_ADDR_P2      0x0c//数据通道2接收地址
  31. #define  RX_ADDR_P3      0x0d//数据通道3接收地址
  32. #define  RX_ADDR_P4      0x0e//数据通道4接收地址
  33. #define  RX_ADDR_P5      0x0f//数据通道5接收地址
  34. #define  TX_ADDR         0x10//发送地址
  35. #define  RX_PW_P0        0x11//P0通道数据宽度设置
  36. #define  RX_PW_P1        0x12//P1通道数据宽度设置
  37. #define  RX_PW_P2        0x13//P2通道数据宽度设置
  38. #define  RX_PW_P3        0x14//P3通道数据宽度设置
  39. #define  RX_PW_P4        0x15//P4通道数据宽度设置
  40. #define  RX_PW_P5        0x16//P5通道数据宽度设置
  41. #define  FIFO_STATUS     0x17//FIFO状态寄存器

  42. /*STATUS寄存器的位mask*/
  43. #define        bitRX_DR        0b01000000
  44. #define bitTX_DS        0b00100000
  45. #define bitMAX_RT        0b00010000
  46. #define bitPX_P_NO        0b00001110
  47. #define bit_TX_FULL        0b00000001

  48. /*初始化 NRF24L01*/
  49. void Nrf_Init(void);
  50. /*SPI通信 NRF24L01*/
  51. /*data为地址或数据*/
  52. unsigned char Nrf_SPI(unsigned char data);
  53. /*清空 TX FIFO*/
  54. void Nrf_Flush_TX(void);
  55. /*清空 RX FIFO*/
  56. void Nrf_Flush_RX(void);
  57. /*从NRF24L01读取一个字节的寄存器信息*/
  58. /*address为寄存器地址*/
  59. unsigned char Nrf_Read_Reg(unsigned char address);
  60. /*向NRF24L01的寄存器写入一个字节*/
  61. /*address为寄存器地址,data为要写入寄存器的数据*/
  62. void Nrf_Write_Reg(unsigned char address,unsigned char data);
  63. /*读取NRF24L01的寄存器,保存在data[]中*/
  64. /*address为寄存器地址,*data为保存数组地址,length为保存字节数*/
  65. /*当address为RX FIFO时,可保存NRF24L01收到的数据*/
  66. void Nrf_Read_RX(unsigned char address,
  67.                         unsigned char *data,unsigned char length);
  68. /*读取NRF24L01的寄存器,保存在data[]中*/
  69. /*address为寄存器地址,*data为发送数据数组地址,length为发送字节数*/
  70. /*当address为TX FIFO时,可向FIFO写入数据*/
  71. void Nrf_Write_TX(unsigned char address,
  72.                         unsigned char *data,unsigned char length);
  73. /*设置NRF24L01为接收模式,并启动发射*/
  74. /**data为要传输的数据数组地址*/
  75. void Nrf_Set_Tx(unsigned char *data);
  76. /*设置NRF24L01为掉电模式*/
  77. void Nrf_Power_Down(void);
  78. /*设置NRF24L01为发送模式*/
  79. void Nrf_Set_Rx(void);
  80. /*产生IRQ中断后,检查NRF24L01的状态*/
  81. unsigned char Nrf_Check_ACK(void);
  82. /*读取NRF24L01接收到的数据*/
  83. /* *data为保存数组的地址*/
  84. unsigned char Nrf_Recevie_Data(unsigned char *data);

  85. unsigned char NRF_STATUS;
  86. unsigned char RX_ADR0[5] = {0x34,0x43,0x10,0x10,0x01};//pipe0 address

  87. #endif
复制代码


------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NRF24L01.c
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  1. #include "NRF24L01.h"
  2. #include "hardware.h"

  3. void Nrf_Init(void)
  4. {
  5.         Nrf_Write_Reg(W_REGISTER+NRF_CONFIG,0x02);//power up
  6.         Nrf_Write_Reg(W_REGISTER+NRF_STATUS_ADR,0xff);//clear interrupt
  7.         Nrf_Flush_TX();        //clear TX FIFO
  8.         Nrf_Flush_RX();        //clear RX FIFO
  9. }

  10. /*This function use hardware SPI of PIC16F883*/
  11. unsigned char Nrf_SPI(unsigned char data)
  12. {
  13.         unsigned char readback;

  14.         SSPBUF = data;
  15.         while (SSPIF==0) {}
  16.         while(BF==0){}
  17.         readback = SSPBUF;
  18.         return readback;
  19. }

  20. void Nrf_Flush_TX(void)
  21. {
  22.         _NRF_CSN= 0;        //enable SPI
  23.         NRF_STATUS = Nrf_SPI(FLUSH_TX);        //write Reg address
  24.         //first write,NRF24L01 will return STATUS register
  25.         _NRF_CSN= 1;        //disable SPI
  26. }

  27. void Nrf_Flush_RX(void)
  28. {
  29.         _NRF_CSN= 0;        //enable SPI
  30.         NRF_STATUS = Nrf_SPI(FLUSH_RX);        //write Reg address
  31.         //first write,NRF24L01 will return STATUS register
  32.         _NRF_CSN= 1;        //disable SPI
  33. }

  34. unsigned char Nrf_Read_Reg(unsigned char address)
  35. {
  36.         unsigned char readback;
  37.         _NRF_CSN= 0;        //enable SPI
  38.         NRF_STATUS = Nrf_SPI(address);        //write Reg address
  39.         //first write,NRF24L01 will return STATUS register
  40.         readback = Nrf_SPI(0);        //read Reg
  41.         _NRF_CSN= 1;        //disable SPI
  42.         return readback;
  43. }

  44. void Nrf_Write_Reg(unsigned char address,unsigned char data)
  45. {
  46.         _NRF_CSN= 0;        //enable SPI
  47.         NRF_STATUS = Nrf_SPI(address);        //write Reg address
  48.         //first write,NRF24L01 will return STATUS register
  49.         Nrf_SPI(data);
  50.         _NRF_CSN= 1;        //disable SPI
  51. }

  52. void Nrf_Read_RX(unsigned char address,
  53.                         unsigned char *data,unsigned char length)
  54. {
  55.         unsigned char i;
  56.         _NRF_CSN= 0;        //enable SPI
  57.         NRF_STATUS = Nrf_SPI(address);        //write Reg address
  58.         for(i=0;i<length;i++)        //read registers, and save
  59.         {
  60.                 *(data+i) = Nrf_SPI(0);
  61.         }
  62.         _NRF_CSN= 1;        //disable SPI
  63. }

  64. void Nrf_Write_TX(unsigned char address,
  65.                         unsigned char *data,unsigned char length)
  66. {
  67.         unsigned char i;
  68.         _NRF_CSN= 0;        //enable SPI
  69.         NRF_STATUS = Nrf_SPI(address);        //write Reg address
  70.         for(i=0;i<length;i++)        //write
  71.         {
  72.                 Nrf_SPI(*(data+i));
  73.         }
  74.         _NRF_CSN= 1;        //disable SPI
  75. }

  76. void Nrf_Set_Tx(unsigned char *data)
  77. {
  78.         _NRF_CE= 0;
  79.         Nrf_Write_TX(W_REGISTER+TX_ADDR,RX_ADR0,TX_ADDR_WITDH);//Pipe0
  80.         Nrf_Write_TX(W_REGISTER+RX_ADDR_P0,RX_ADR0,TX_ADDR_WITDH);        //Pipe0
  81.         Nrf_Write_TX(W_TX_PAYLOAD,data,TX_DATA_WITDH);
  82.         Nrf_Write_Reg(W_REGISTER+EN_AA,0x01);        //enable auto ACK of Pipe0
  83.         Nrf_Write_Reg(W_REGISTER+EN_RXADDR,0x01);        //enable Piep0
  84.         Nrf_Write_Reg(W_REGISTER+SETUP_RETR,0x0a);        //retry 10 times,250us delay
  85.         Nrf_Write_Reg(W_REGISTER+RF_CH,0x40);        //use channel 0x40
  86.         Nrf_Write_Reg(W_REGISTER+RF_SETUP,0x0f);        //data rate 2Mbps
  87.         Nrf_Write_Reg(W_REGISTER+NRF_CONFIG,0x0e);        //enable CRC,2bytes
  88.         _NRF_CE= 1;
  89.         __delay_us(20);        //wait to transmit
  90. //        _NRF_CE= 0;
  91. }

  92. void Nrf_Power_Down(void)
  93. {
  94.         _NRF_CE= 0;
  95.         Nrf_Write_Reg(W_REGISTER+NRF_CONFIG,0x0d);        //PRX,PowerDown,16bitCRC
  96.         _NRF_CE= 1;
  97.         __delay_us(20);
  98. }

  99. void Nrf_Set_Rx(void)
  100. {
  101.         _NRF_CE= 0;
  102.         Nrf_Write_TX(W_REGISTER+RX_ADDR_P0,RX_ADR0,TX_ADDR_WITDH);        //Pipe0
  103.         Nrf_Write_Reg(W_REGISTER+EN_AA,0x01);        //enable pipe0 auto ACK
  104.         Nrf_Write_Reg(W_REGISTER+EN_RXADDR,0x01);        //enable pipe0
  105.         Nrf_Write_Reg(W_REGISTER+RF_CH,0x40);        //use channel 0x40
  106.         Nrf_Write_Reg(W_REGISTER+RX_PW_P0,TX_DATA_WITDH);        //pipe0 payload width
  107.         Nrf_Write_Reg(W_REGISTER+RF_SETUP,0x0f);        //data rate 2Mbps
  108.         Nrf_Write_Reg(W_REGISTER+NRF_CONFIG,0x0f);        //enable CRC,2bytes
  109.         _NRF_CE= 1;        //Start active RX mode
  110.         __delay_us(150);
  111. }

  112. unsigned char Nrf_Check_ACK(void)
  113. {
  114.         NRF_STATUS = Nrf_Read_Reg(R_REGISTER+NRF_STATUS_ADR);
  115.         if(NRF_STATUS&bitTX_DS)        //PTX received ACK from PRX
  116.         {
  117.                 Nrf_Flush_TX();
  118.                 Nrf_Write_Reg(W_REGISTER+NRF_STATUS_ADR,bitTX_DS);        //clear TX_DS bit
  119.                 return 1;
  120.         }
  121.         else if(NRF_STATUS&bitMAX_RT)        //PTX re-transmit over maximum number
  122.                 {
  123.                         Nrf_Flush_TX();
  124.                         Nrf_Write_Reg(W_REGISTER+NRF_STATUS_ADR,bitMAX_RT);        //clear MAX_RT bit
  125.                         return 2;
  126.                 }
  127.         else if(NRF_STATUS&bitRX_DR)        //PRX received new data
  128.                 {
  129.                         return 3;
  130.                 }
  131.         else
  132.                 return 0;
  133.                
  134. }

  135. unsigned char Nrf_Recevie_Data(unsigned char *data)
  136. {
  137.         unsigned char rx_address,stat;
  138.         NRF_STATUS = Nrf_Read_Reg(R_REGISTER+NRF_STATUS_ADR);        //read status register
  139.         if(NRF_STATUS&bitRX_DR)        //PRX received new data
  140.         {
  141.                 rx_address = NRF_STATUS & bitPX_P_NO; //pipe number
  142.                 switch(rx_address)
  143.                 {
  144.                         case 0x00:        Nrf_Read_RX(R_RX_PAYLOAD,data,RX_DATA_WITDH);//pipe0
  145.                                                 stat = 1;
  146.                         break;
  147.                         default:        stat = 0;
  148.                         break;
  149.                 }
  150.                 Nrf_Write_Reg(W_REGISTER+NRF_STATUS_ADR,bitRX_DR);        //clear RX_DR bit
  151.                 _NRF_CSN= 0;
  152.                 Nrf_SPI(FLUSH_RX);        //flush RX FIFO
  153.                 _NRF_CSN= 1;
  154.         }
  155.         return stat;
  156. }
复制代码

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
发射端 main.c
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  1. #include "hardware.h"
  2. #include "NRF24L01.h"

  3. __CONFIG(XT & WDTDIS  & LVPDIS & DEBUGEN);

  4. extern unsigned char NRF_STATUS;
  5. unsigned char Data_TX[4]={4,3,2,1};
  6. unsigned char Data_RX[4];
  7. unsigned char Trans_Status;

  8. /*initialize PIC16F883*/
  9. void Init_Sys(void)
  10. {
  11.         ANSEL = ANSEL & 0b11111000;        //RA0,RA1,RA2 as digital I/O
  12.         _DIR_NRF_CE= OUTPUT;
  13.         _DIR_NRF_CSN= OUTPUT;
  14.         _DIR_NRF_IRQ= INPUT;
  15.        
  16.         _NRF_CE= 0;
  17.         _NRF_CSN= 1;
  18.        
  19.         _DIR_SPI_SCK= OUTPUT;
  20.         _DIR_SPI_MISO= INPUT;
  21.         _DIR_SPI_MOSI= OUTPUT;
  22.        
  23.         //set up MSSP mode as SPI master
  24.         CKP= 0;
  25.         CKE= 1;
  26.         SMP= 0;
  27.         SSPM3= 0;SSPM2= 0;SSPM1= 0;SSPM0= 0;
  28.         SSPEN= 1;
  29. }

  30. void main(void)
  31. {
  32.         unsigned char i;
  33.         Nrf_Init();        //initialize NRF24L01
  34.         NRF_STATUS = Nrf_Read_Reg(R_REGISTER+NRF_STATUS_ADR);        //get status of NRF24L01,for debug..
  35.         while(1)
  36.                 {
  37.                         Nrf_Set_Tx(Data_TX);        //set NRF24L01 as transmitter,then transmit Data_TX[]
  38.                         while(_NRF_IRQ){}        //wait for ACK from receiver
  39.                         Trans_Status = Nrf_Check_ACK();        //get transmit status
  40.                         if(Trans_Status==2)        //no ACK,for debug
  41.                         {
  42.                                 Trans_Status = 2;
  43.                                 NRF_STATUS = Nrf_Read_Reg(R_REGISTER+NRF_STATUS_ADR);
  44.                                 Nrf_Write_Reg(W_REGISTER+NRF_STATUS_ADR,0xff);//clear interrupt
  45.                         }
  46.                         if(Trans_Status==1)        //received ACK
  47.                         {
  48.                                 Data_TX[0]=i;
  49.                                 Data_TX[1]=i;
  50.                                 Data_TX[2]=i;
  51.                                 Data_TX[3]=i;
  52.                                 i++;
  53.                                 __delay_ms(10);
  54.                         }
  55.                 }
  56. }
复制代码

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
接收端 main.c
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  1. #include "hardware.h"
  2. #include "NRF24L01.h"

  3. __CONFIG(XT & WDTDIS  & LVPDIS & DEBUGEN);

  4. extern unsigned char NRF_STATUS;
  5. unsigned char Data_TX[4]={1,2,3,4};
  6. unsigned char Data_RX[4]={0,0,0,0};
  7. unsigned char Trans_Status;

  8. /*initialize PIC16F883*/
  9. void Init_Sys(void)
  10. {
  11.         ANSEL = ANSEL & 0b11111000;        //RA0,RA1,RA2 as digital I/O
  12.         _DIR_NRF_CE= OUTPUT;
  13.         _DIR_NRF_CSN= OUTPUT;
  14.         _DIR_NRF_IRQ= INPUT;
  15.        
  16.         _NRF_CE= 0;
  17.         _NRF_CSN= 1;
  18.        
  19.         _DIR_SPI_SCK= OUTPUT;
  20.         _DIR_SPI_MISO= INPUT;
  21.         _DIR_SPI_MOSI= OUTPUT;
  22.        
  23.         //set up MSSP mode as SPI master
  24.         CKP= 0;
  25.         CKE= 1;
  26.         SMP= 0;
  27.         SSPM3= 0;SSPM2= 0;SSPM1= 0;SSPM0= 0;
  28.         SSPEN= 1;       
  29. }

  30. void main(void)
  31. {
  32.         Nrf_Init();        //initialize NRF24L01
  33.         Nrf_Set_Rx();        //set NRF24L01 as receiver
  34.         while(1)
  35.                 {
  36.                         while(_NRF_IRQ){NRF_STATUS = Nrf_Read_Reg(R_REGISTER+NRF_STATUS_ADR);/*for debug*/}        //wait for data from transimitter
  37.                         Trans_Status = Nrf_Check_ACK();        ////get transmit status
  38.                          if(Trans_Status==3)        //received valid data
  39.                                 {
  40.                                         Trans_Status = 3;        //for debug
  41.                                         Trans_Status  = Nrf_Recevie_Data(Data_RX);        //save data in Data_RX[]
  42.                                         NRF_STATUS = Nrf_Read_Reg(R_REGISTER+NRF_STATUS_ADR);        //frodebug
  43.                                         _NRF_CE= 1;        //re-enable receiver
  44.                                 }
  45.                 }
  46. }
复制代码

还有一些逻辑分析仪抓的图,写注释比较麻烦就先不上传了


出0入0汤圆

发表于 2014-3-25 19:07:30 | 显示全部楼层
勤劳的小码农 发表于 2014-3-24 18:27
你做什么工作?一月多少工资

坑爹的医疗设备,月薪3K

出0入0汤圆

 楼主| 发表于 2014-3-25 19:11:31 来自手机 | 显示全部楼层
windingway 发表于 2014-3-25 19:07
坑爹的医疗设备,月薪3K

你是写大程序写管了,写个测试程序,命名还搞这么长

出0入0汤圆

发表于 2014-3-25 19:21:27 | 显示全部楼层
勤劳的小码农 发表于 2014-3-25 19:11
你是写大程序写管了,写个测试程序,命名还搞这么长


不是想命名长,而是命名短的时候会踩地雷.刚开始直接复制了头文件.一编译,江山一片红...查了一会发现
#define STATUS          0x07
这一句,跟单片机的头文件有冲突,PIC单片机也有个STATUS寄存器.
所以命名太短也有问题,另外,测试程序也是程序,以后也会用到,一次性搞定,以后直接拿来用就行了,就不用重新再把程序看一遍了.最近打算拿这玩意给相机做个无线快门遥控器...

出0入0汤圆

 楼主| 发表于 2014-3-25 19:31:33 来自手机 | 显示全部楼层
这要是51单片机多好,我就能直接测试我的设备了

出0入0汤圆

 楼主| 发表于 2014-3-25 22:19:09 | 显示全部楼层
windingway 发表于 2014-3-25 19:02
我移植的程序已经初步测试好了,你的程序我就不再移植了,看了看基本上是一个模式.这种事干一次就好.{:2_35 ...

好像无论在什么状态,无论ce是高还是低,无论发送模式还是接收模式还是掉电,STATUS的寄存器都是可以正常读取的吧。

出0入0汤圆

发表于 2014-3-26 08:21:19 | 显示全部楼层
勤劳的小码农 发表于 2014-3-25 22:19
好像无论在什么状态,无论ce是高还是低,无论发送模式还是接收模式还是掉电,STATUS的寄存器都是可以正常 ...

应该是这样的.
51的参考程序我也有.
http://pan.baidu.com/s/1qWjSbfA

出0入0汤圆

 楼主| 发表于 2014-3-26 13:44:21 | 显示全部楼层
windingway 发表于 2014-3-22 11:00
话说我初中的时候就买过电子制作的书(青少年电子制作,一套10本的样子),可惜完全看不懂...小学的时候捣鼓 ...

#define KEY2                                 P22
这个p22是什么?找不到他的定义
晚上回家我试试。给你发信息还要是好友

出0入0汤圆

发表于 2014-3-26 13:49:57 | 显示全部楼层
勤劳的小码农 发表于 2014-3-26 13:44
#define KEY2                                 P22
这个p22是什么?找不到他的定义
晚上回家我试试。给 ...

这个应该是测试程序定义的按键,P22是51的端口.定义在reg51.h里面
sbit P22        =   P2^2;

出0入0汤圆

 楼主| 发表于 2014-3-26 14:18:28 来自手机 | 显示全部楼层
没用过,goto指令找不到他

出0入0汤圆

 楼主| 发表于 2014-3-27 11:12:36 来自手机 | 显示全部楼层
windingway 发表于 2014-3-26 13:49
这个应该是测试程序定义的按键,P22是51的端口.定义在reg51.h里面
sbit P22        =   P2^2; ...

确认是模块损坏,卖我模块的淘宝已经关门大吉

出0入0汤圆

发表于 2014-3-27 11:23:33 | 显示全部楼层
勤劳的小码农 发表于 2014-3-27 11:12
确认是模块损坏,卖我模块的淘宝已经关门大吉

再买个新的好了,几块钱.供电不要用5V,很容易挂.手册上说IO可承受5V逻辑电平,我没试过,估计5V单片机直接连要串联2K左右电阻吧.

出0入0汤圆

 楼主| 发表于 2014-3-27 23:51:24 来自手机 | 显示全部楼层
windingway 发表于 2014-3-27 11:23
再买个新的好了,几块钱.供电不要用5V,很容易挂.手册上说IO可承受5V逻辑电平,我没试过,估计5V单片机直接连 ...

你的nrf是pcb天线还是外接天线?隔一道墙的情况下能传输多远?

出0入0汤圆

发表于 2014-3-28 08:09:34 | 显示全部楼层
勤劳的小码农 发表于 2014-3-27 23:51
你的nrf是pcb天线还是外接天线?隔一道墙的情况下能传输多远?

PCB天线的,便宜..
没试过具体能传多远,40块钱左右可以买到带功率放大的模块,用250kpbs速率,空旷地方传输距离一公里以上.

出0入0汤圆

 楼主| 发表于 2014-3-28 11:03:12 来自手机 | 显示全部楼层
windingway 发表于 2014-3-28 08:09
PCB天线的,便宜..
没试过具体能传多远,40块钱左右可以买到带功率放大的模块,用250kpbs速率,空旷地方传输 ...

pcb天线的(最强体积),隔一道墙,5米可以不?(250kbps)

出0入0汤圆

 楼主| 发表于 2014-3-28 11:03:54 来自手机 | 显示全部楼层
是追求体积小,发错了

出0入0汤圆

发表于 2014-3-28 11:59:04 | 显示全部楼层
勤劳的小码农 发表于 2014-3-28 11:03
是追求体积小,发错了

未实验,不知道.不过估计差不多.
我说的带放大器的模块体积也不大,比如这个

出0入0汤圆

 楼主| 发表于 2014-3-29 22:51:14 | 显示全部楼层
windingway 发表于 2014-3-22 11:00
话说我初中的时候就买过电子制作的书(青少年电子制作,一套10本的样子),可惜完全看不懂...小学的时候捣鼓 ...

我在c语言里面嵌入汇编,嵌入的汇编程序需要用到内存,如何保证我嵌入的程序不使用c语言用到的内存

出0入0汤圆

发表于 2014-3-30 18:30:30 | 显示全部楼层
勤劳的小码农 发表于 2014-3-29 22:51
我在c语言里面嵌入汇编,嵌入的汇编程序需要用到内存,如何保证我嵌入的程序不使用c语言用到的内存
...

C代码在编译的时候会自动分配内存,除非你在C代码里指定了内存分配,如果没这样作,内存分配的问题就交给编译器处理了.

出0入0汤圆

 楼主| 发表于 2014-3-30 19:28:38 来自手机 | 显示全部楼层
windingway 发表于 2014-3-30 18:30
C代码在编译的时候会自动分配内存,除非你在C代码里指定了内存分配,如果没这样作,内存分配的问题就交给编 ...

怎么限定变量位置?是不是在指定位置定义变量,编译器就不会再用它,我可以随便在汇编修改?我追求精确,写了一个严格的精确到毫秒级别的延时程序

出0入0汤圆

 楼主| 发表于 2014-3-30 19:29:11 来自手机 | 显示全部楼层
windingway 发表于 2014-3-28 11:59
未实验,不知道.不过估计差不多.
我说的带放大器的模块体积也不大,比如这个 ...

发错了,微妙

出0入0汤圆

发表于 2014-3-30 19:44:19 | 显示全部楼层
勤劳的小码农 发表于 2014-3-30 19:28
怎么限定变量位置?是不是在指定位置定义变量,编译器就不会再用它,我可以随便在汇编修改?我追求精确, ...

你在C代码里定义变量,可以指定变量在内存中的地址.如果不指定,编译器就自动为其分配地址.具体代码如何写,你可以发帖问一下,我基本上不用51,所以也不太清楚.

出0入0汤圆

 楼主| 发表于 2014-4-1 22:35:55 | 显示全部楼层
windingway 发表于 2014-3-30 19:44
你在C代码里定义变量,可以指定变量在内存中的地址.如果不指定,编译器就自动为其分配地址.具体代码如何写, ...

我竟然驱动不起来24c08……我这么笨……驱动IIC的ad完全正常,驱动24C08就没反应

出0入0汤圆

发表于 2014-4-1 22:59:39 | 显示全部楼层
勤劳的小码农 发表于 2014-4-1 22:35
我竟然驱动不起来24c08……我这么笨……驱动IIC的ad完全正常,驱动24C08就没反应 ...

那啥,有个简单的办法,就是得花点钱.买个逻辑分析仪,论坛邮购部就有卖.我几年前花了接近1千块买了个周立功的逻辑分析仪,现在貌似几百块钱就可以买到了.用来看各种协议的通信波形很是便利.

出0入0汤圆

 楼主| 发表于 2014-4-1 23:24:33 来自手机 | 显示全部楼层
windingway 发表于 2014-4-1 22:59
那啥,有个简单的办法,就是得花点钱.买个逻辑分析仪,论坛邮购部就有卖.我几年前花了接近1千块买了个周立功 ...

这个对目前的我还有点奢侈,我的小金库就一千多点……
我要是有时间可以看看我发的帖子,不过那个程序,不是我写的,别人写的,很简短,不知怎么驱动不起来24c08
那个nrf估计是以前有过误接5v,烧了

出0入0汤圆

 楼主| 发表于 2014-4-1 23:40:38 来自手机 | 显示全部楼层
windingway 发表于 2014-4-1 22:59
那啥,有个简单的办法,就是得花点钱.买个逻辑分析仪,论坛邮购部就有卖.我几年前花了接近1千块买了个周立功 ...

在淘宝看了看逻辑分析仪,包邮才40。24m(有买家评论说用的是24m的精振,所以……)8通道。感觉一般的小设计还是降得住的

出0入0汤圆

 楼主| 发表于 2014-4-5 11:33:16 来自手机 | 显示全部楼层
windingway 发表于 2014-4-1 22:59
那啥,有个简单的办法,就是得花点钱.买个逻辑分析仪,论坛邮购部就有卖.我几年前花了接近1千块买了个周立功 ...

我的amo账号在电脑上怎么登录不上去

出0入0汤圆

发表于 2014-4-5 11:34:41 | 显示全部楼层
你用的是不是360浏览器,是的话估计扥不上去   

出0入0汤圆

发表于 2014-4-5 11:45:34 | 显示全部楼层
高中生 厉害

出0入0汤圆

发表于 2014-4-21 22:31:11 | 显示全部楼层
楼上好基友啊!!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 03:48

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

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