nrf24l01 IRQ脚无法恢复到高电位

2020-01-30 14:00发布

本帖最后由 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. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
zjsxwc
2020-01-30 23:57
本帖最后由 zjsxwc 于 2013-3-24 22:31 编辑
noynot 发表于 2013-3-24 21:13
中断PIN是几个共用的,特别是接收数据缓冲,需要把缓冲区的数据都读取


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

一周热门 更多>