Register names for NRF.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 23 May 2010 00:43:51 +0000 (00:43 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 23 May 2010 00:43:51 +0000 (00:43 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@554 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFETNRF.py
client/goodfet.nrf

index 8de2993..007ae0f 100644 (file)
@@ -40,14 +40,22 @@ class GoodFETNRF(GoodFET):
         for i in range(0,bytes):
             toret=toret|(ord(self.data[i+1])<<(8*i));
         return toret;
         for i in range(0,bytes):
             toret=toret|(ord(self.data[i+1])<<(8*i));
         return toret;
-    def poke(self,reg,val,bytes=1):
+    def poke(self,reg,val,bytes=-1):
         """Write an NRF Register."""
         data=[reg];
         """Write an NRF Register."""
         data=[reg];
+        
+        #Automatically calibrate the len.
+        if bytes==-1:
+            bytes=1;
+            if reg==0x0a or reg==0x0b or reg==0x10: bytes=5;
+        
         for i in range(0,bytes):
             data=data+[(val>>(8*i))&0xFF];
         self.writecmd(self.NRFAPP,0x03,len(data),data);
         if self.peek(reg,bytes)!=val and reg!=0x07:
         for i in range(0,bytes):
             data=data+[(val>>(8*i))&0xFF];
         self.writecmd(self.NRFAPP,0x03,len(data),data);
         if self.peek(reg,bytes)!=val and reg!=0x07:
-            print "Warning, failed to set register %02x." %reg;
+            print "Warning, failed to set r%02x=%02x, got %02x." %(reg,
+                                                                 val,
+                                                                 self.peek(reg,bytes));
         return;
     
     def status(self):
         return;
     
     def status(self):
@@ -56,6 +64,34 @@ class GoodFETNRF(GoodFET):
         print "Status=%02x" % status;
     
     #Radio stuff begins here.
         print "Status=%02x" % status;
     
     #Radio stuff begins here.
+    def RF_setenc(self,code="GFSK"):
+        """Set the encoding type."""
+        if code!=GFSK:
+            return "%s not supported by the NRF24L01.  Try GFSK."
+        return;
+    def RF_getenc(self):
+        """Get the encoding type."""
+        return "GFSK";
+    def RF_getrate(self):
+        rate=self.peek(0x06)&0x28;
+        if rate==0x28:
+            rate=250*10**3; #256kbps
+        elif rate==0x08:
+            rate=2*10**6;  #2Mbps
+        elif rate==0x00: 
+            rate=1*10**6;  #1Mbps
+        return rate;
+    def RF_setrate(self,rate=2*10**6):
+        r6=self.peek(0x06); #RF_SETUP register
+        r6=r6&(~0x28);   #Clear rate fields.
+        if rate==2*10**6:
+            r6=r6|0x08;
+        elif rate==1*10**6:
+            r6=r6;
+        elif rate==250*10**3:
+            r6=r6|0x20;
+        print "Setting r6=%02x." % r6;
+        self.poke(0x06,r6); #Write new setting.
     def RF_setfreq(self,frequency):
         """Set the frequency in Hz."""
         
     def RF_setfreq(self,frequency):
         """Set the frequency in Hz."""
         
index 54f816e..117a272 100755 (executable)
@@ -21,17 +21,21 @@ def printpacket(packet):
     print "%s" %s;
 
 def printconfig():
     print "%s" %s;
 
 def printconfig():
-    print "SMAC  0x%010x" % client.RF_getsmac();
-    print "TMAC  0x%010x" % client.RF_gettmac();
+    print "Encoding %s" % client.RF_getenc();
     print "Freq    %10i MHz" % (client.RF_getfreq()/10**6);
     print "Freq    %10i MHz" % (client.RF_getfreq()/10**6);
+    print "Rate    %10i kbps" % (client.RF_getrate()/1000);
     print "PacketLen %02i bytes" % client.RF_getpacketlen();
     print "MacLen    %2i bytes" % client.RF_getmaclen();
     print "PacketLen %02i bytes" % client.RF_getpacketlen();
     print "MacLen    %2i bytes" % client.RF_getmaclen();
+    print "SMAC  0x%010x" % client.RF_getsmac();
+    print "TMAC  0x%010x" % client.RF_gettmac();
+
 
 if(len(sys.argv)==1):
     print "Usage: %s verb [objects]\n" % sys.argv[0];
     print "%s info" % sys.argv[0];
     print "%s test" % sys.argv[0];
     print "%s regs" % sys.argv[0];
 
 if(len(sys.argv)==1):
     print "Usage: %s verb [objects]\n" % sys.argv[0];
     print "%s info" % sys.argv[0];
     print "%s test" % sys.argv[0];
     print "%s regs" % sys.argv[0];
+    print "%s sniff\n\tSniffs packets by current config." % sys.argv[0];
     print "%s sniffob\n\tSniffs OpenBeacon traffic." % sys.argv[0];
     print "%s carrier [freq]\n\tHolds a carrier on [freq] Hz." % sys.argv[0];
     sys.exit();
     print "%s sniffob\n\tSniffs OpenBeacon traffic." % sys.argv[0];
     print "%s carrier [freq]\n\tHolds a carrier on [freq] Hz." % sys.argv[0];
     sys.exit();
@@ -46,21 +50,32 @@ if(sys.argv[1]=="info"):
     printconfig();
 
 if(sys.argv[1]=="test"):
     printconfig();
 
 if(sys.argv[1]=="test"):
+    print "Old registers:"
+    printconfig();
+    
     # Set PWR_UP=1 and PRIM_RX=0 in CONFIG.
     client.poke(0x00,2);
     #Delay of 1.5ms by round-trip.
     # Set PWR_UP=1 and PRIM_RX=0 in CONFIG.
     client.poke(0x00,2);
     #Delay of 1.5ms by round-trip.
-    # Set CONT_WAVE, PLL_LOCK, and 0dBm in RF_SETUP
-    client.poke(0x06,8+10+4+2);
-    client.RF_setfreq(2480 * 10**6);
     
     
-    #Print registers, just for fun.
-    printconfig();
+    print "\n\n";
     
     
+    #Try all data rates
+    for foo in [250*10**3,
+                1*10**6,
+                2*10**6]:
+        client.RF_setrate(foo);
+        if(client.RF_getrate()!=foo):
+            print "ERROR Rate %i not supported.  Got %i instead." % (foo,
+                                                                     client.RF_getrate());
+    
+    print "\n\n";
     client.poke(0x0A,0xDEADBEEF,5);
     #print "SMAC set to %010x" % client.RF_getsmac();
     if client.RF_getsmac()!=0xdeadbeef:
         print "ERROR: Failed to set MAC address.";
     client.poke(0x0A,0xDEADBEEF,5);
     #print "SMAC set to %010x" % client.RF_getsmac();
     if client.RF_getsmac()!=0xdeadbeef:
         print "ERROR: Failed to set MAC address.";
-
+    print "Final registers:"
+    printconfig();
+    
 if(sys.argv[1]=="carrier"):
     if len(sys.argv)>2:
         client.RF_setfreq(eval(sys.argv[2]));
 if(sys.argv[1]=="carrier"):
     if len(sys.argv)>2:
         client.RF_setfreq(eval(sys.argv[2]));
@@ -70,8 +85,39 @@ if(sys.argv[1]=="carrier"):
     while(1):
         time.sleep(1);
 if(sys.argv[1]=="regs"):
     while(1):
         time.sleep(1);
 if(sys.argv[1]=="regs"):
+    regnames=["CONFIG","EN_AA","EN_RXADDR","SETUP_AW","SETUP_RET",
+              "RF_CH","RF_SETUP","STATUS","OBSERVE_TX","RPD",
+              "RX_ADDR_P0","RX_ADDR_P1","RX_ADDR_P2","RX_ADDR_P3","RX_ADDR_P4","RX_ADDR_P5",
+              "TX_ADDR",
+              "RX_PW_P0","RX_PW_P1","RX_PW_P2","RX_PW_P3","RX_PW_P4","RX_PW_P5",
+              "FIFO_STATUS","?",
+              "?","?","DYNPD","?","?","?","?","?",
+              "?","?","?","?","?","?","?","?"];
     for r in range(0,0x20):
     for r in range(0,0x20):
-        print "r[0x%02x]=0x%010x" % (r,client.peek(r));
+        print "r[0x%02x]=0x%010x //%16s " % (r,client.peek(r),regnames[r]);
+
+if(sys.argv[1]=="peek"):
+    start=0x0000;
+    if(len(sys.argv)>2):
+        start=int(sys.argv[2],16);
+    stop=start;
+    if(len(sys.argv)>3):
+        stop=int(sys.argv[3],16);
+    print "Peeking from %02x to %02x." % (start,stop);
+    while start<=stop:
+        print "%02x: %010x" % (start,client.peek(start));
+        start=start+1;
+if(sys.argv[1]=="poke"):
+    start=0x0000;
+    val=0x00;
+    if(len(sys.argv)>2):
+        start=int(sys.argv[2],16);
+    if(len(sys.argv)>3):
+        val=int(sys.argv[3],16);
+    print "Poking %02x to become %010x." % (start,val);
+    
+    client.poke(start,val);
+    print "Poked to %04x" % client.peek(start);
 
 if(sys.argv[1]=="sniffob"):
     #Reversal of transmitter code from nRF_CMD.c of OpenBeacon
 
 if(sys.argv[1]=="sniffob"):
     #Reversal of transmitter code from nRF_CMD.c of OpenBeacon
@@ -108,3 +154,22 @@ if(sys.argv[1]=="sniffob"):
             packet=client.RF_rxpacket();
         printpacket(packet);
         sys.stdout.flush();
             packet=client.RF_rxpacket();
         printpacket(packet);
         sys.stdout.flush();
+
+if(sys.argv[1]=="sniff"):
+    #client.poke(0x00,0x00); #Stop nRF
+    client.poke(0x07,0x78); #Reset status register
+    
+    #Power radio, prime for RX, checksum.
+    client.poke(0x00,0x70|0x03|0x08);
+    
+    print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
+                                           client.RF_getfreq()/10**6);
+    #Now we're ready to get packets.
+    
+    while 1:
+        packet=None;
+        while packet==None:
+            #time.sleep(0.1);
+            packet=client.RF_rxpacket();
+        printpacket(packet);
+        sys.stdout.flush();