from GoodFET import GoodFET;
class GoodFETCCSPI(GoodFET):
- CCSPIAPP=0x50;
- def CCSPIsetup(self):
+ CCSPIAPP=0x51;
+ def setup(self):
"""Move the FET into the CCSPI application."""
self.writecmd(self.CCSPIAPP,0x10,0,self.data); #CCSPI/SETUP
- def CCSPItrans8(self,byte):
+ def trans8(self,byte):
"""Read and write 8 bits by CCSPI."""
data=self.CCSPItrans([byte]);
return ord(data[0]);
- def CCSPItrans(self,data):
+ def trans(self,data):
"""Exchange data by CCSPI."""
self.data=data;
self.writecmd(self.CCSPIAPP,0x00,len(data),data);
return self.data;
-
- def peek(self,reg,bytes=-1):
+ def strobe(self,reg=0x00):
+ """Strobes a strobe register, returning the status."""
+ data=[reg];
+ self.trans(data);
+ return ord(self.data[0]);
+ def peek(self,reg,bytes=2):
"""Read a CCSPI Register. For long regs, result is flipped."""
- data=[reg,0,0,0,0,0];
+ data=[reg,0,0];
#Automatically calibrate the len.
- if bytes==-1:
- bytes=1;
- if reg==0x0a or reg==0x0b or reg==0x10: bytes=5;
+ bytes=2;
self.writecmd(self.CCSPIAPP,0x02,len(data),data);
toret=0;
+ #print "Status: %02x" % ord(self.data[0]);
for i in range(0,bytes):
toret=toret|(ord(self.data[i+1])<<(8*i));
return toret;
self.writecmd(self.CCSPIAPP,0x03,len(data),data);
if self.peek(reg,bytes)!=val and reg!=0x07:
print "Warning, failed to set r%02x=%02x, got %02x." %(reg,
- val,
- self.peek(reg,bytes));
+ val,
+ self.peek(reg,bytes));
return;
def status(self):
"""Read the status byte."""
- status=self.peek(0x07);
+ status=self.strobe(0x00);
print "Status=%02x" % status;
#Radio stuff begins here.
def RF_setfreq(self,frequency):
"""Set the frequency in Hz."""
- #On the CCSPI24L01+, register 0x05 is the offset in
- #MHz above 2400.
-
- chan=frequency/1000000-2400;
- self.poke(0x05,chan);
+ print "TODO write the setfreq() function.";
def RF_getfreq(self):
"""Get the frequency in Hz."""
-
- #On the CCSPI24L01+, register 0x05 is the offset in
- #MHz above 2400.
-
- return (2400+self.peek(0x05))*10**6
- self.poke(0x05,chan);
+ print "TODO write the getfreq() function.";
+ return 0;
def RF_getsmac(self):
"""Return the source MAC address."""
- #Register 0A is RX_ADDR_P0, five bytes.
- mac=self.peek(0x0A, 5);
- return mac;
+ return 0xdeadbeef;
def RF_setsmac(self,mac):
"""Set the source MAC address."""
-
- #Register 0A is RX_ADDR_P0, five bytes.
- self.poke(0x0A, mac, 5);
- return mac;
+ return 0xdeadbeef;
def RF_gettmac(self):
"""Return the target MAC address."""
-
- #Register 0x10 is TX_ADDR, five bytes.
- mac=self.peek(0x10, 5);
- return mac;
+ return 0xdeadbeef;
def RF_settmac(self,mac):
"""Set the target MAC address."""
-
- #Register 0x10 is TX_ADDR, five bytes.
- self.poke(0x10, mac, 5);
- return mac;
+ return 0xdeadbeef;
def RF_rxpacket(self):
"""Get a packet from the radio. Returns None if none is waiting."""
- if self.peek(0x07) & 0x40:
- #Packet has arrived.
- self.writecmd(self.CCSPIAPP,0x80,0,None); #RX Packet
- data=self.data;
- self.poke(0x07,0x40);#clear bit.
- return data;
- elif self.peek(0x07)==0:
- self.writecmd(self.CCSPIAPP,0x82,0,None); #Flush
- self.poke(0x07,0x40);#clear bit.
+ print "Don't know how to get a packet.";
return None;
def RF_carrier(self):
"""Hold a carrier wave on the present frequency."""
- # Set CONT_WAVE, PLL_LOCK, and 0dBm in RF_SETUP
- self.poke(0x06,8+10+4+2);
-
+ print "Don't know how to hold a carrier.";
packetlen=16;
def RF_setpacketlen(self,len=16):
"""Set the number of bytes in the expected payload."""
- self.poke(0x11,len);
+ #self.poke(0x11,len);
self.packetlen=len;
def RF_getpacketlen(self):
"""Set the number of bytes in the expected payload."""
- len=self.peek(0x11);
+ #len=self.peek(0x11);
self.packetlen=len;
return len;
maclen=5;
"swap-reset-test", "telos-latch", "telos-i2c", "telos", "telosb",
"tmote","no-BSL-download", "force-BSL-download", "slow",
"dumpivt", "dumpinfo", "fromweb",
- "goodfet30", "goodfet20", "goodfet10"
+ "goodfet40", "goodfet30", "goodfet20", "goodfet10",
+ "nhbadge", "nhbadgeb", "goodfet"
]
)
except getopt.GetoptError:
elif o in ("--goodfet30", ):
bsl.invertRST = 1
bsl.invertTEST = 0
+ elif o in ("--goodfet40", ):
+ bsl.invertRST = 1
+ bsl.invertTEST = 1
+ elif o in ("--goodfet", ):
+ bsl.invertRST = 1
+ bsl.invertTEST = 1
+ elif o in ("--nhbadge", "--nhbadgeb" ):
+ bsl.invertRST = 1
+ bsl.invertTEST = 1
elif o in ("--telosb", ):
bsl.swapRSTTEST = 1
bsl.telosI2C = 1
--- /dev/null
+#!/usr/bin/env python
+
+#GoodFET Chipcon SPI Client
+# (C) 2011 Travis Goodspeed
+
+#N.B.,
+#Might be CC2420 Specific
+
+import sys;
+import binascii;
+import array;
+
+from GoodFETCCSPI import GoodFETCCSPI;
+
+if(len(sys.argv)==1):
+ print "Usage: %s verb [objects]\n" % sys.argv[0];
+ print "%s regs" % sys.argv[0];
+ print "%s test" % sys.argv[0];
+ print "%s peek 0x$start [0x$stop]" % sys.argv[0];
+ print "%s poke 0x$adr 0x$val" % sys.argv[0];
+ sys.exit();
+
+#Initialize FET and set baud rate
+client=GoodFETCCSPI();
+client.serInit()
+
+
+client.setup();
+
+#Dummy read.
+#Might read as all ones if chip has a startup delay.
+
+if(sys.argv[1]=="info"):
+ print "Status is %02x" % client.strobe(0x00);
+if(sys.argv[1]=="regs"):
+ for adr in range(0x10,0x40): #*1024):
+ val=client.peek(adr);
+ print "%04x:=%02x" % (adr,val);
+if(sys.argv[1]=="test"):
+ data=client.trans([0x20, 0xde, 0xad]);
+ print "%02x %02x" % (ord(data[1]), ord(data[2]));
+ data=client.trans([0x40|0x20, 0xde, 0xad]);
+ print "%02x %02x" % (ord(data[1]), ord(data[2]));
+
+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 %04x to %04x." % (start,stop);
+ while start<=stop:
+ print "%04x: %02x" % (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);
+