#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
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"):
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);
return 0xdeadbeef;
def RF_getrssi(self):
"""Returns the received signal strenght, with a weird offset."""
- rssival=self.peek(0x13)&0xFF; #raw RSSI register, should normalize this
+ rssival=self.peek(0x13)&0xFF; #raw RSSI register
return rssival^0x80;
lastpacket=range(0,0xff);
def RF_rxpacket(self):
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(2,20):
- if buffer[foo]!=self.lastpacket[foo]:
- new=True;
- if not new:
- return None;
+ data="\0";
+ self.data=data;
+ self.writecmd(self.CCSPIAPP,0x80,len(data),data);
+ buffer=self.data;
self.lastpacket=buffer;
+ if(len(buffer)==0):
+ return None;
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;
+ mdmctrl0=mdmctrl0&(~0x800);
+ #print "mdmctrl0 is now %04x" % mdmctrl0;
+ self.poke(0x11,mdmctrl0);
+ return;
+
packetlen=16;
def RF_setpacketlen(self,len=16):
"""Set the number of bytes in the expected payload."""