搜索
bottom↓
回复: 4

nrf24l01 IRQ脚无法恢复到高电位

[复制链接]

出0入0汤圆

发表于 2013-3-24 17:41:49 | 显示全部楼层 |阅读模式
本帖最后由 zjsxwc 于 2013-3-24 17:43 编辑

我用中断写的接收端程序,但是只有第一次他irq脚由高电位跳到低电位,然后向status寄存器写相应的位
为1后,irq脚仍旧没有恢复为高电位。然后就无法响应后面的事情了
  1. #include <reg52.h>
  2. #include <intrins.h>


  3. typedef unsigned char uint;//uint is a byte long

  4. sbit         MISO        =P1^5;
  5. sbit         MOSI        =P1^1;
  6. sbit        SCK          =P1^6;
  7. sbit        CE          =P1^7;
  8. sbit        CSN                =P1^2;
  9. sbit        IRQ                =P3^3;

  10. sbit LED=P3^7;

  11. #define ADR_WIDTH 5       
  12. #define AW_ADR_WIDTH 0x03
  13. #define PLOAD_WIDTH  20


  14. uint const TX_ADDRESS[ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //address that the RF packets contain
  15. uint const RX_ADDRESS[ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //RF packets with *which address* that the pipes like to receive

  16. //THE COMMANDS
  17. #define READ_REG        0x00           
  18. #define WRITE_REG       0x20          
  19. #define RD_RX_PLOAD     0x61           
  20. #define WR_TX_PLOAD     0xA0           
  21. #define FLUSH_TX        0xE1          
  22. #define FLUSH_RX        0xE2           
  23. #define REUSE_TX_PL     0xE3           
  24. #define NOP             0xFF           

  25. //THE REGISTERS' ADDRESSES
  26. #define CONFIG          0x00   
  27. #define EN_AA           0x01  
  28. #define EN_RXADDR       0x02   
  29. #define SETUP_AW        0x03   
  30. #define SETUP_RETR      0x04  
  31. #define RF_CH           0x05  
  32. #define RF_SETUP        0x06   
  33. #define STATUS          0x07   
  34. #define OBSERVE_TX      0x08   
  35. #define CD              0x09   
  36. #define RX_ADDR_P0      0x0A   
  37. #define RX_ADDR_P1      0x0B  
  38. #define RX_ADDR_P2      0x0C  
  39. #define RX_ADDR_P3      0x0D  
  40. #define RX_ADDR_P4      0x0E  
  41. #define RX_ADDR_P5      0x0F   
  42. #define TX_ADDR         0x10   
  43. #define RX_PW_P0        0x11  
  44. #define RX_PW_P1        0x12   
  45. #define RX_PW_P2        0x13   
  46. #define RX_PW_P3        0x14  
  47. #define RX_PW_P4        0x15   
  48. #define RX_PW_P5        0x16   
  49. #define FIFO_STATUS     0x17  


  50. uint         bdata sta;  
  51. sbit        RX_DR        =sta^6;
  52. sbit        TX_DS        =sta^5;
  53. sbit        MAX_RT        =sta^4;


  54. //THE FUNCTIONS
  55. uint SPI_write_byte(uint the_byte){
  56.         uint count;
  57.         SCK=0;
  58.         for (count=0;count<8;count++){
  59.                 MOSI=(the_byte&0x80);//get the left most bit of the byte,and put on MOSI
  60.                 the_byte=the_byte<<1;//left move one bit
  61.                 SCK=1;                                                        //the SCK upside occurs,nrf24 eats the bit on mosi,nrf24 generates the bit on miso
  62.                 the_byte = the_byte|MISO;//the right most bit of the byte become MISO
  63.                 SCK=0;
  64.         }
  65.         return the_byte;
  66. }

  67. uint SPI_WRITE_REG_DATA_OR_CMD(uint reg,uint data_cmd){
  68.         uint status;
  69.         CSN =0;
  70.         status =SPI_write_byte(reg);
  71.         SPI_write_byte(data_cmd);
  72.         CSN=1;
  73.         return status;
  74. }

  75. uint SPI_WRITE_REG_ARRAY(uint reg,uint * array,uint length){
  76.         uint status,count;
  77.         CSN=0;
  78.         status =SPI_write_byte(reg);
  79.         for (count=0;count<length;count++){
  80.                 SPI_write_byte(array[count]);
  81.         }
  82.         CSN=1;
  83.         return status;
  84. }

  85. void inerDelay_us(unsigned char n){
  86.         for(;n>0;n--) _nop_();
  87. }
  88. void init_NRF24L01(void){
  89.         inerDelay_us(200);//100 us is okay,but 100 us as redundance
  90.         CE=0;         //let nrf24 stop Trans/Recev packets
  91.         CSN=0;        //let spi starts to work
  92.         SCK=0;        //ready for SCK upside
  93.        
  94.         //set the addresses width
  95.         SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+SETUP_AW,AW_ADR_WIDTH);
  96.         //write the addr width
  97.         SPI_WRITE_REG_ARRAY(WRITE_REG+TX_ADDR,TX_ADDRESS,ADR_WIDTH);
  98.         SPI_WRITE_REG_ARRAY(WRITE_REG+RX_ADDR_P0,RX_ADDRESS,ADR_WIDTH);
  99.        
  100.         SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+EN_RXADDR,0x01);        //allow pipe0 to receive packets
  101. //        SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+EN_AA,0x01);                        //allow pipe0 auto ACK,enter the SHOCKBURST MODE
  102.         SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+EN_AA,0x00);
  103.         SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+RF_CH,0);                                        //let the channel become 2.4000 GHz
  104.         SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+RX_PW_P0,PLOAD_WIDTH);//set the payload width of pipe0
  105.   SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+RF_SETUP,0x07);                //let the data rate 1 Mbps,the power amplifier 0 dBm
  106.        
  107.         CSN=1;
  108.        
  109. }

  110. void SET_RX_MODE(void){
  111.         CE=0;                //stop nrf24 Trans/Recv
  112.         SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+CONFIG,0x0f);
  113.         //1. allow all 3 interrupts,
  114.         //2. allow 16 bits CRC code,
  115.         //3. start PWR_UP,
  116.         //4. PRIM_RX=1,let nrf24 become RX MODE
  117.        
  118.         CE=1;                //start listining to receive packets
  119.         inerDelay_us(200);//130 us is okay,but 70 us as redundance
  120. }






  121. uint SPI_READ_REG(uint reg){
  122.         uint status,val;
  123.         CSN=0;
  124.         status=SPI_write_byte(READ_REG+reg);//bcs READ_REG =0,so just a form for uinty
  125.         val=SPI_write_byte(READ_REG+0);
  126.         CSN=1;
  127.         return val;
  128. }

  129. uint SPI_READ_REG_ARRAY(uint reg, uint * array, uint length)
  130. {
  131.         uint status,count;
  132.        
  133.         CSN = 0;                                   
  134.         status = SPI_write_byte(reg);                      
  135.        
  136.         for(count=0;count<length;count++)
  137.                 array[count] = SPI_write_byte(0);   
  138.         SPI_write_byte(FLUSH_RX );
  139.         CSN = 1;                           
  140.        
  141.         return(status);                    
  142. }

  143.        








  144. //THE NORMAL FUNCTION
  145. /*
  146. void longdelay(void){
  147.         uint n=100,m=100,k=200;
  148.         for (;k>0;k--) for (;m>0;m--) for (;n>0;n--) _nop_();
  149. }*/
  150. uint payload[PLOAD_WIDTH]={0};

  151. void main(){



  152.   init_NRF24L01();
  153.         CE=0;
  154.         SET_RX_MODE();
  155.         CE=1;
  156.   
  157.         IT1=0;
  158.         EX1=1;
  159.         EA=1;
  160.         PX1=0;


  161.         LED=0;
  162.   while (1){
  163.                         payload[2]=0;
  164.                         sta=SPI_READ_REG(STATUS);
  165.        
  166.                         if (RX_DR)        {
  167.                                 SPI_READ_REG_ARRAY(RD_RX_PLOAD,payload,PLOAD_WIDTH);
  168.        
  169.                
  170.                
  171.                         }
  172.                                 SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+STATUS,sta);//回写后irq没恢复。
  173.                         if (payload[2]) LED=~LED;
  174.                
  175.         }
  176.                
  177. }

  178. void Renrf24() interrupt 2
  179. {
  180.         payload[2]=0;
  181.        
  182.         sta=SPI_READ_REG(STATUS);
  183.        
  184.         if (RX_DR)        {
  185.                 SPI_READ_REG_ARRAY(RD_RX_PLOAD,payload,PLOAD_WIDTH);
  186.                 SPI_WRITE_REG_DATA_OR_CMD(WRITE_REG+STATUS,sta);//回写后irq没恢复。
  187.        
  188.                
  189.         }

  190.        
  191.        
  192.        
  193.        
  194.         if (payload[2]==1) {
  195.                 if (LED=0) LED=1;
  196.                 else LED=0;
  197.         }

  198. }
复制代码

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-3-24 17:49:09 | 显示全部楼层
中断状态要手动清除,回写状态字

出0入0汤圆

 楼主| 发表于 2013-3-24 17:49:55 | 显示全部楼层
noynot 发表于 2013-3-24 17:49
中断状态要手动清除,回写状态字

就是回写了后没有恢复

出0入0汤圆

发表于 2013-3-24 21:13:30 | 显示全部楼层
中断PIN是几个共用的,特别是接收数据缓冲,需要把缓冲区的数据都读取

出0入0汤圆

 楼主| 发表于 2013-3-24 22:29:13 | 显示全部楼层
本帖最后由 zjsxwc 于 2013-3-24 22:31 编辑
noynot 发表于 2013-3-24 21:13
中断PIN是几个共用的,特别是接收数据缓冲,需要把缓冲区的数据都读取


多谢你的回复,我发现原因了,是因为我本来不想使用自动回复,于是把AA都设置为0,把pipe 0的AA设置为自动恢复后就可以恢复irq脚了。应该是在没有自动回复时tx fifo中有东西没发完

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

本版积分规则

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

GMT+8, 2024-5-22 17:58

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

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