3 #GoodFET Chipcon SPI Client
4 # (C) 2011 Travis Goodspeed
7 #Might be CC2420 Specific
13 from GoodFETCCSPI import GoodFETCCSPI;
16 print "Usage: %s verb [objects]\n" % sys.argv[0];
17 print "%s info" % sys.argv[0];
18 print "%s regs" % sys.argv[0];
19 print "%s test" % sys.argv[0];
20 print "%s peek 0x$start [0x$stop]" % sys.argv[0];
21 print "%s poke 0x$adr 0x$val" % sys.argv[0];
22 print "%s txtest" % sys.argv[0];
24 print "\n%s rssi" % sys.argv[0];
25 print "%s sniff [chan]" % sys.argv[0];
26 print "%s bsniff [chan]" % sys.argv[0];
27 print "%s sniffdissect" % sys.argv[0];
31 #Initialize FET and set baud rate
32 client=GoodFETCCSPI();
39 #Might read as all ones if chip has a startup delay.
41 if(sys.argv[1]=="carrier"):
43 client.RF_setfreq(eval(sys.argv[2]));
49 if(sys.argv[1]=="modulated_spectrum"):
51 client.RF_setfreq(eval(sys.argv[2]));
53 client.RF_modulated_spectrum();
57 if(sys.argv[1]=="info"):
58 print "Found %s" % client.identstr();
59 print "Freq: %05f MHz" % (client.RF_getfreq()/(10**6));
60 print "Status: %s" % client.status();
61 if(sys.argv[1]=="regs"):
62 for adr in range(0x10,0x40): #*1024):
64 print "%04x:=0x%04x" % (adr,val);
65 if(sys.argv[1]=="test"):
66 data=client.trans([0x20, 0xde, 0xad]);
67 print "%02x %02x" % (ord(data[1]), ord(data[2]));
68 data=client.trans([0x40|0x20, 0xde, 0xad]);
69 print "%02x %02x" % (ord(data[1]), ord(data[2]));
70 if(sys.argv[1]=="rssi"):
72 freq=eval(sys.argv[2]);
74 client.RF_setfreq(freq);
76 client.RF_setchan(freq);
77 print "Listening on %f MHz." % (client.RF_getfreq()/10.0**6);
79 client.strobe(0x02); #Calibrate
84 #client.strobe(0x03); #SRXON
85 rssi=client.RF_getrssi();
86 #client.CC_RFST_IDLE(); #idle
89 for foo in range(0,rssi>>2):
90 string=("%s."%string);
91 print "%02x %04i %s" % (rssi,rssi, string);
92 if(sys.argv[1]=="sniff" or sys.argv[1]=="sniffdissect"):
94 client.RF_promiscuity(1);
98 freq=eval(sys.argv[2]);
100 client.RF_setfreq(freq);
102 client.RF_setchan(freq);
104 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
105 client.RF_getfreq()/10**6);
106 #Now we're ready to get packets.
110 packet=client.RF_rxpacket();
111 if sys.argv[1]=="sniffdissect":
112 client.printdissect(packet);
114 client.printpacket(packet);
116 if(sys.argv[1]=="bsniff"):
118 client.RF_promiscuity(0);
119 client.RF_setsmac(0xFFFFFFFF);
120 client.RF_autocrc(1);
123 freq=eval(sys.argv[2]);
125 client.RF_setfreq(freq);
127 client.RF_setchan(freq);
129 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
130 client.RF_getfreq()/10**6);
131 #Now we're ready to get packets.
135 packet=client.RF_rxpacket();
136 client.printpacket(packet);
139 if(sys.argv[1]=="txtest"):
141 freq=eval(sys.argv[2]);
143 client.RF_setfreq(freq);
145 client.RF_setchan(freq);
146 print "Transmitting DEADBEEF as %010x on %i MHz" % (
148 client.RF_getfreq()/10**6);
151 client.RF_txpacket([0x0f, 0x01, 0x08, 0x82,
152 0xff, 0xff, 0xff, 0xff,
153 0xde, 0xad, 0xbe, 0xef,
155 if(sys.argv[1]=="txtoscount"):
157 Clone of what TinyOS's BlinkToLED demo code does.
158 Specify a channel a TinyOS mote programmed with BlinkToLED is on, and this will act as the second device.
160 if (len(sys.argv)<=3):
161 print "Provide -r to work via replays or -i to work via incrementing itself.";
163 if (sys.argv[3]=="-r"):
164 client.RF_promiscuity(1);
165 client.RF_autocrc(1);
167 freq=eval(sys.argv[2]);
169 client.RF_setfreq(freq);
171 client.RF_setchan(freq);
172 if (sys.argv[3]=="-r"):
174 print "Listening as %010x on %i MHz" % (client.RF_getsmac(), client.RF_getfreq()/10**6);
175 print "Transmitting like the TinyOS CountToRadio program on %i MHz" % (client.RF_getfreq()/10**6);
176 if (sys.argv[3]=="-i"):
178 countpkt = [0x0f, 0x41, 0x88, 0xFF, 0x22, 0x00, 0xff, 0xff, 0x01, 0x00, 0x3f, 0x06, 0x00, 0xFF];
180 if (sys.argv[3]=="-r"): #give -r to do via replays from the other device
183 packet=client.RF_rxpacket();
185 #client.printpacket(packet);
188 #client.printpacket(pkt)
189 client.RF_txpacket(pkt);
190 elif (sys.argv[3]=="-i"): #give -i to have it increment and send
191 #Use this code for it to actually do increments itself:
198 client.RF_txpacket(pkt);
203 if(sys.argv[1]=="txpiptest"):# or sys.argv[1]=="txpipscapy"):
205 freq=eval(sys.argv[2]);
207 client.RF_setfreq(freq);
209 client.RF_setchan(freq);
210 print "Transmitting on as %010x on %i MHz" % (
212 client.RF_getfreq()/10**6);
214 client.RF_setsync(0xFFFF);
219 #Real header, must begin with SFD.
224 0x1f, 0x01, 0x08, 0x82,
225 0xDF, 0xff, 0xff, 0xff,
226 0xde, 0xad, 0xbe, 0xef,
232 0x00, 0xA7, #CC2420 SFD
234 0x0f, 0x01, 0x08, 0x82,
235 0xff, 0xff, 0xff, 0xff,
236 0xde, 0xad, 0xbe, 0xef,
239 0xff, 0xff, 0xff, 0xff,
240 0xff, 0xff, 0xff, 0xff,
241 0xff, 0xff, 0xff, 0xff,
242 0xff, 0xff, 0xff, 0xff,
243 0xff, 0xff, 0xff, 0xff,
244 0xff, 0xff, 0xff, 0xff,
245 0xff, 0xff, 0xff, 0xff,
248 if(sys.argv[1]=="peek"):
251 start=int(sys.argv[2],16);
254 stop=int(sys.argv[3],16);
255 print "Peeking from %04x to %04x." % (start,stop);
257 print "%04x: 0x%04x" % (start,client.peek(start));
259 if(sys.argv[1]=="poke"):
263 start=int(sys.argv[2],16);
265 val=int(sys.argv[3],16);
266 print "Poking r%02x to become 0x%04x." % (start,val);
268 client.poke(start,val);