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 print "%s txtoscount [-i|-r] TinyOS BlinkToLED" % sys.argv[0];
35 #Initialize FET and set baud rate
36 client=GoodFETCCSPI();
43 #Might read as all ones if chip has a startup delay.
45 if(sys.argv[1]=="carrier"):
47 client.RF_setfreq(eval(sys.argv[2]));
53 if(sys.argv[1]=="modulated_spectrum"):
55 client.RF_setfreq(eval(sys.argv[2]));
57 client.RF_modulated_spectrum();
61 if(sys.argv[1]=="info"):
62 print "Found %s" % client.identstr();
63 print "Freq: %05f MHz" % (client.RF_getfreq()/(10**6));
64 print "Status: %s" % client.status();
65 if(sys.argv[1]=="regs"):
66 for adr in range(0x10,0x40): #*1024):
68 print "%04x:=0x%04x" % (adr,val);
69 if(sys.argv[1]=="test"):
70 data=client.trans([0x20, 0xde, 0xad]);
71 print "%02x %02x" % (ord(data[1]), ord(data[2]));
72 data=client.trans([0x40|0x20, 0xde, 0xad]);
73 print "%02x %02x" % (ord(data[1]), ord(data[2]));
74 if(sys.argv[1]=="rssi"):
76 freq=eval(sys.argv[2]);
78 client.RF_setfreq(freq);
80 client.RF_setchan(freq);
81 print "Listening on %f MHz." % (client.RF_getfreq()/10.0**6);
83 client.strobe(0x02); #Calibrate
88 #client.strobe(0x03); #SRXON
89 rssi=client.RF_getrssi();
90 #client.CC_RFST_IDLE(); #idle
93 for foo in range(0,rssi>>2):
94 string=("%s."%string);
95 print "%02x %04i %s" % (rssi,rssi, string);
96 if(sys.argv[1]=="sniff" or sys.argv[1]=="sniffdissect"):
98 client.RF_promiscuity(1);
102 freq=eval(sys.argv[2]);
104 client.RF_setfreq(freq);
106 client.RF_setchan(freq);
108 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
109 client.RF_getfreq()/10**6);
110 #Now we're ready to get packets.
114 packet=client.RF_rxpacket();
115 if sys.argv[1]=="sniffdissect":
116 client.printdissect(packet);
118 client.printpacket(packet);
120 if(sys.argv[1]=="bsniff"):
122 client.RF_promiscuity(0);
123 client.RF_setsmac(0xFFFFFFFF);
124 client.RF_autocrc(1);
127 freq=eval(sys.argv[2]);
129 client.RF_setfreq(freq);
131 client.RF_setchan(freq);
133 print "Listening as %010x on %i MHz" % (client.RF_getsmac(),
134 client.RF_getfreq()/10**6);
135 #Now we're ready to get packets.
139 packet=client.RF_rxpacket();
140 client.printpacket(packet);
143 if(sys.argv[1]=="txtest"):
145 freq=eval(sys.argv[2]);
147 client.RF_setfreq(freq);
149 client.RF_setchan(freq);
150 print "Transmitting DEADBEEF as %010x on %i MHz" % (
152 client.RF_getfreq()/10**6);
155 client.RF_txpacket([0x0f, 0x01, 0x08, 0x82,
156 0xff, 0xff, 0xff, 0xff,
157 0xde, 0xad, 0xbe, 0xef,
159 if(sys.argv[1]=="txtoscount"):
161 Clone of what TinyOS's BlinkToLED demo code does.
162 Specify a channel a TinyOS mote programmed with BlinkToLED is on, and this will act as the second device.
164 if (len(sys.argv)<=3):
165 print "Provide -r to work via replays or -i to work via incrementing itself.";
167 if (sys.argv[3]=="-r"):
168 client.RF_promiscuity(1);
169 client.RF_autocrc(1);
171 freq=eval(sys.argv[2]);
173 client.RF_setfreq(freq);
175 client.RF_setchan(freq);
176 if (sys.argv[3]=="-r"):
178 print "Listening as %010x on %i MHz" % (client.RF_getsmac(), client.RF_getfreq()/10**6);
179 print "Transmitting like the TinyOS CountToRadio program on %i MHz" % (client.RF_getfreq()/10**6);
180 if (sys.argv[3]=="-i"):
182 countpkt = [0x0f, 0x41, 0x88, 0xFF, 0x22, 0x00, 0xff, 0xff, 0x01, 0x00, 0x3f, 0x06, 0x00, 0xFF];
184 if (sys.argv[3]=="-r"): #give -r to do via replays from the other device
187 packet=client.RF_rxpacket();
189 #client.printpacket(packet);
192 #client.printpacket(pkt)
193 client.RF_txpacket(pkt);
194 elif (sys.argv[3]=="-i"): #give -i to have it increment and send
195 #Use this code for it to actually do increments itself:
202 client.RF_txpacket(pkt);
207 if(sys.argv[1]=="txpiptest"):# or sys.argv[1]=="txpipscapy"):
209 freq=eval(sys.argv[2]);
211 client.RF_setfreq(freq);
213 client.RF_setchan(freq);
214 print "Transmitting on as %010x on %i MHz" % (
216 client.RF_getfreq()/10**6);
218 client.RF_setsync(0xFFFF);
223 #Real header, must begin with SFD.
228 0x1f, 0x01, 0x08, 0x82,
229 0xDF, 0xff, 0xff, 0xff,
230 0xde, 0xad, 0xbe, 0xef,
236 0x00, 0xA7, #CC2420 SFD
238 0x0f, 0x01, 0x08, 0x82,
239 0xff, 0xff, 0xff, 0xff,
240 0xde, 0xad, 0xbe, 0xef,
243 0xff, 0xff, 0xff, 0xff,
244 0xff, 0xff, 0xff, 0xff,
245 0xff, 0xff, 0xff, 0xff,
246 0xff, 0xff, 0xff, 0xff,
247 0xff, 0xff, 0xff, 0xff,
248 0xff, 0xff, 0xff, 0xff,
249 0xff, 0xff, 0xff, 0xff,
252 if(sys.argv[1]=="peek"):
255 start=int(sys.argv[2],16);
258 stop=int(sys.argv[3],16);
259 print "Peeking from %04x to %04x." % (start,stop);
261 print "%04x: 0x%04x" % (start,client.peek(start));
263 if(sys.argv[1]=="poke"):
267 start=int(sys.argv[2],16);
269 val=int(sys.argv[3],16);
270 print "Poking r%02x to become 0x%04x." % (start,val);
272 client.poke(start,val);