X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETCCSPI.py;h=5ffeb9deaae27033952b8003b097676e5384574a;hp=612ce3e685ca2f4bb2f9c0ae2946db9114179e06;hb=fc395768eb33962fe7f8e8e6d575117ddfb6265b;hpb=73a31780aab1bea70e6e201dad4c752a3e253536 diff --git a/client/GoodFETCCSPI.py b/client/GoodFETCCSPI.py index 612ce3e..5ffeb9d 100644 --- a/client/GoodFETCCSPI.py +++ b/client/GoodFETCCSPI.py @@ -19,6 +19,7 @@ class GoodFETCCSPI(GoodFET): #Set up the radio for ZigBee self.strobe(0x01); #SXOSCON + self.strobe(0x02); #SCAL self.poke(0x11, 0x0AC2); #MDMCTRL0 self.poke(0x12, 0x0500); #MDMCTRL1 self.poke(0x1C, 0x007F); #IOCFG0 @@ -91,8 +92,22 @@ class GoodFETCCSPI(GoodFET): def status(self): """Read the status byte.""" + statusbits={0x80: "?", + 0x40: "XOSC16M_STABLE", + 0x20: "TX_UNDERFLOW", + 0x10: "ENC_BUSY", + 0x08: "TX_ACTIVE", + 0x04: "LOCK", + 0x02: "RSSI_VALID", + 0x01: "?"}; status=self.strobe(0x00); - print "Status=%02x" % status; + i=1; + str=""; + while i<0x100: + if status&i: + str="%s %s" % (statusbits[i],str); + i*=2; + return str; #Radio stuff begins here. def RF_setenc(self,code="802.15.4"): @@ -111,6 +126,7 @@ class GoodFETCCSPI(GoodFET): fsctrl=self.peek(0x18)&~0x3FF; fsctrl=fsctrl+int(mhz-2048) self.poke(0x18,fsctrl); + self.strobe(0x02); def RF_getfreq(self): """Get the frequency in Hz.""" fsctrl=self.peek(0x18); @@ -140,9 +156,6 @@ class GoodFETCCSPI(GoodFET): contents. """ - # TODO -- Flush only if there's an overflow. - #self.strobe(0x08); #SFLUSHRX - data="\0"; self.data=data; self.writecmd(self.CCSPIAPP,0x80,len(data),data); @@ -152,37 +165,80 @@ class GoodFETCCSPI(GoodFET): if(len(buffer)==0): return None; return buffer; - def RF_rxpacket_old(self): - """Get a packet from the radio. Returns None if none is waiting. In - order to not require the SFD, FIFO, or FIFOP lines, this - implementation works by comparing the buffer to the older - contents. - """ - self.strobe(0x03); #SRXON - self.strobe(0x08); #SFLUSHRX - - buffer=range(0,0xff); - buffer[0]=0x3F | 0x40; #RXFIFO - buffer=self.trans(buffer); - - new=False; - for foo in range(0,ord(buffer[0])): - if buffer[foo]!=self.lastpacket[foo]: - new=True; - if not new: - return None; - - - self.lastpacket=buffer; - return buffer; + def RF_txpacket(self,packet): + """Send a packet through the radio.""" + self.writecmd(self.CCSPIAPP,0x81,len(packet),packet); + #time.sleep(1); + #self.strobe(0x09); + return; + + + def RF_modulated_spectrum(self): + """Hold a carrier wave on the present frequency.""" + # print "Don't know how to hold a carrier."; + # 33.1 p.55: + # reset chip + # SXOSCON + # set MDMCTRL1.TX_MODE to 3 0x12 3:2 + # STXON 0x04 + + mdmctrl1=self.peek(0x12); + #print "mdmctrl1 was %04x" % mdmctrl1; + mdmctrl1=mdmctrl1|0x00c0; #MDMCTRL1.TX_MODE = 3 + self.poke(0x12, mdmctrl1); #MDMCTRL1 + + mdmctrl1=self.peek(0x12); + #print "mdmctrl1 is %04x" % mdmctrl1; + + # http://e2e.ti.com/support/low_power_rf/f/155/t/15914.aspx?PageIndex=2 + # suggests this + self.strobe(0x02); #STXCAL + #print "STXCAL status: %s" % self.status() + + # is this necessary? + self.strobe(0x09); #SFLUSHTX + #print "SFLUSHTX status: %s" % self.status() + + self.strobe(0x04); #STXON + #print "STXON status: %s" % self.status() + def RF_carrier(self): """Hold a carrier wave on the present frequency.""" - print "Don't know how to hold a carrier."; + # print "Don't know how to hold a carrier."; + # 33.1 p.54: + # reset chip + # SXOSCON + # set MDMCTRL1.TX_MODE to 2 or 3 0x12 3:2 + # set DACTST to 0x1800 0x2E + # STXON 0x04 + + mdmctrl1=self.peek(0x12); + #print "mdmctrl1 was %04x" % mdmctrl1; + mdmctrl1=mdmctrl1|0x0080; + mdmctrl1=mdmctrl1&0x0080; #MDMCTRL1.TX_MODE = 2 + self.poke(0x12, mdmctrl1); #MDMCTRL1 + + mdmctrl1=self.peek(0x12); + #print "mdmctrl1 is %04x" % mdmctrl1; + + self.poke(0x2E, 0x1800); #DACTST + dactst=self.peek(0x2E); + #print "dactst is %04x" % dactst; + + # see above for why this is here + self.strobe(0x02); #STXCAL + #print "STXCAL status: %s" % self.status() + self.strobe(0x09); #SFLUSHTX + #print "SFLUSHTX status: %s" % self.status() + + self.strobe(0x04); #STXON + #print "STXON status: %s" % self.status() + def RF_promiscuity(self,promiscuous=1): mdmctrl0=self.peek(0x11); - print "mdmctrl0 was %04x" % mdmctrl0; + #print "mdmctrl0 was %04x" % mdmctrl0; mdmctrl0=mdmctrl0&(~0x800); - print "mdmctrl0 is now %04x" % mdmctrl0; + #print "mdmctrl0 is now %04x" % mdmctrl0; self.poke(0x11,mdmctrl0); return;