pycc1101.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. import spidev
  2. import time
  3. class TICC1101(object):
  4. WRITE_SINGLE_BYTE = 0x00
  5. WRITE_BURST = 0x40
  6. READ_SINGLE_BYTE = 0x80
  7. READ_BURST = 0xC0
  8. # Configuration Register Details - Registers with preserved values in SLEEP state
  9. # TI-CC1101 Datasheet
  10. IOCFG2 = 0x00 # GDO2 Output Pin Configuration
  11. IOCFG1 = 0x01 # GDO1 Output Pin Configuration
  12. IOCFG0 = 0x02 # GDO0 Output Pin Configuration
  13. FIFOTHR = 0x03 # RX FIFO and TX FIFO Thresholds
  14. SYNC1 = 0x04 # Sync Word, High Byte
  15. SYNC0 = 0x05 # Sync Word, Low Byte
  16. PKTLEN = 0x06 # Packet Length
  17. PKTCTRL1 = 0x07 # Packet Automation Control
  18. PKTCTRL0 = 0x08 # Packet Automation Control
  19. ADDR = 0x09 # Device Address
  20. CHANNR = 0x0A # Channel Number
  21. FSCTRL1 = 0x0B # Frequency Synthesizer Control
  22. FSCTRL0 = 0x0C # Frequency Synthesizer Control
  23. FREQ2 = 0x0D # Frequency Control Word, High Byte
  24. FREQ1 = 0x0E # Frequency Control Word, Middle Byte
  25. FREQ0 = 0x0F # Frequency Control Word, Low Byte
  26. MDMCFG4 = 0x10 # Modem Configuration
  27. MDMCFG3 = 0x11 # Modem Configuration
  28. MDMCFG2 = 0x12 # Modem Configuration
  29. MDMCFG1 = 0x13 # Modem Configuration
  30. MDMCFG0 = 0x14 # Modem Configuration
  31. DEVIATN = 0x15 # Modem Deviation Setting
  32. MCSM2 = 0x16 # Main Radio Control State Machine Configuration
  33. MCSM1 = 0x17 # Main Radio Control State Machine Configuration
  34. MCSM0 = 0x18 # Main Radio Control State Machine Configuration
  35. FOCCFG = 0x19 # Frequency Offset Compensation Configuration
  36. BSCFG = 0x1A # Bit Synchronization Configuration
  37. AGCCTRL2 = 0x1B # AGC Control
  38. AGCCTRL1 = 0x1C # AGC Control
  39. AGCCTRL0 = 0x1D # AGC Control
  40. WOREVT1 = 0x1E # High Byte Event0 Timeout
  41. WOREVT0 = 0x1F # Low Byte Event0 Timeout
  42. WORCTRL = 0x20 # Wake On Radio Control
  43. FREND1 = 0x21 # Front End RX Configuration
  44. FREND0 = 0x22 # Front End TX Configuration
  45. FSCAL3 = 0x23 # Frequency Synthesizer Calibration
  46. FSCAL2 = 0x24 # Frequency Synthesizer Calibration
  47. FSCAL1 = 0x25 # Frequency Synthesizer Calibration
  48. FSCAL0 = 0x26 # Frequency Synthesizer Calibration
  49. RCCTRL1 = 0x27 # RC Oscillator Configuration
  50. RCCTRL0 = 0x28 # RC Oscillator Configuration
  51. # Configuration Register Details - Registers that Loose Programming in SLEEP State
  52. FSTEST = 0x29 # Frequency Synthesizer Calibration Control
  53. PTEST = 0x2A # Production Test
  54. AGCTEST = 0x2B # AGC Test
  55. TEST2 = 0x2C # Various Test Settings
  56. TEST1 = 0x2D # Various Test Settings
  57. TEST0 = 0x2E # Various Test Settings
  58. # Command Strobe Registers
  59. SRES = 0x30 # Reset chip
  60. SFSTXON = 0x31 # Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
  61. # If in RX (with CCA): Go to a wait state where only the synthesizer
  62. # is running (for quick RX / TX turnaround).
  63. SXOFF = 0x32 # Turn off crystal oscillator.
  64. SCAL = 0x33 # Calibrate frequency synthesizer and turn it off.
  65. # SCAL can be strobed from IDLE mode without setting manual calibration mode.
  66. SRX = 0x34 # Enable RX. Perform calibration first if coming from IDLE and MCSM0.FS_AUTOCAL=1.
  67. STX = 0x35 # In IDLE state: Enable TX. Perform calibration first
  68. # if MCSM0.FS_AUTOCAL=1.
  69. # If in RX state and CCA is enabled: Only go to TX if channel is clear.
  70. SIDLE = 0x36 # Exit RX / TX, turn off frequency synthesizer and exit Wake-On-Radio mode if applicable.
  71. SWOR = 0x38 # Start automatic RX polling sequence (Wake-on-Radio)
  72. # as described in Section 19.5 if WORCTRL.RC_PD=0.
  73. SPWD = 0x39 # Enter power down mode when CSn goes high.
  74. SFRX = 0x3A # Flush the RX FIFO buffer. Only issue SFRX in IDLE or RXFIFO_OVERFLOW states.
  75. SFTX = 0x3B # Flush the TX FIFO buffer. Only issue SFTX in IDLE or TXFIFO_UNDERFLOW states.
  76. SWORRST = 0x3C # Reset real time clock to Event1 value.
  77. SNOP = 0x3D # No operation. May be used to get access to the chip status byte.
  78. PATABLE = 0x3E # PATABLE
  79. TXFIFO = 0x3F # TXFIFO
  80. RXFIFO = 0x3F # RXFIFO
  81. # Status Register Details
  82. PARTNUM = 0xF0 # Chip ID
  83. VERSION = 0xF1 # Chip ID
  84. FREQEST = 0xF2 # Frequency Offset Estimate from Demodulator
  85. LQI = 0xF3 # Demodulator Estimate for Link Quality
  86. RSSI = 0xF4 # Received Signal Strength Indication
  87. MARCSTATE = 0xF5 # Main Radio Control State Machine State
  88. WORTIME1 = 0xF6 # High Byte of WOR Time
  89. WORTIME0 = 0xF7 # Low Byte of WOR Time
  90. PKTSTATUS = 0xF8 # Current GDOx Status and Packet Status
  91. VCO_VC_DAC = 0xF9 # Current Setting from PLL Calibration Module
  92. TXBYTES = 0xFA # Underflow and Number of Bytes
  93. RXBYTES = 0xFB # Overflow and Number of Bytes
  94. RCCTRL1_STATUS = 0xFC # Last RC Oscillator Calibration Result
  95. RCCTRL0_STATUS = 0xFD # Last RC Oscillator Calibration Result
  96. def __init__(self, bus=0, device=0, speed=50000, debug=True):
  97. try:
  98. self.debug = debug
  99. self._spi = spidev.SpiDev()
  100. self._spi.open(bus, device)
  101. self._spi.max_speed_hz = speed
  102. except Exception as e:
  103. print e
  104. def _usDelay(self, useconds):
  105. time.sleep(useconds / 1000000.0)
  106. def _writeSingleByte(self, address, byte_data):
  107. return self._spi.xfer([self.WRITE_SINGLE_BYTE | address, byte_data])
  108. def _readSingleByte(self, address):
  109. return self._spi.xfer([self.READ_SINGLE_BYTE | address, 0x00])[1]
  110. def _readBurst(self, start_address, length):
  111. buff = []
  112. ret = []
  113. for x in range(length + 1):
  114. addr = (start_address + (x * 8)) | self.READ_BURST
  115. buff.append(addr)
  116. ret = self._spi.xfer(buff)[1:]
  117. if self.debug:
  118. print "_readBurst | start_address = %x, length = %x" % (start_address, length)
  119. return ret
  120. def _writeBurst(self, address, data):
  121. data.insert(0, (self.WRITE_BURST | address))
  122. return self._spi.xfer(data)
  123. def reset(self):
  124. return self._strobe(self.SRES)
  125. def _strobe(self, address):
  126. return self._spi.xfer([address, 0x00])
  127. def selfTest(self):
  128. part_number = self._readSingleByte(self.PARTNUM)
  129. component_version = self._readSingleByte(self.VERSION)
  130. # These asserts are based on the documentation
  131. # Section 29.3 "Status Register Details"
  132. # On reset PARTNUM == 0x00
  133. # On reset VERSION == 0x14
  134. assert part_number == 0x00
  135. assert component_version == 0x14
  136. if self.debug:
  137. print "Part Number: %x" % part_number
  138. print "Component Version: %x" % component_version
  139. print "Self test OK"
  140. def sidle(self):
  141. self._strobe(self.SIDLE)
  142. while (self._readSingleByte(self.MARCSTATE) != 0x01):
  143. self._usDelay(100)
  144. self._strobe(self.SFTX)
  145. self._usDelay(100)
  146. def powerDown(self):
  147. self.sidle()
  148. self._strobe(self.SPWD)
  149. def setCarrierFrequency(self, freq=433):
  150. # Register values extracted from SmartRF Studio 7
  151. if freq == 433:
  152. self._writeSingleByte(self.FREQ2, 0x10)
  153. self._writeSingleByte(self.FREQ1, 0xA7)
  154. self._writeSingleByte(self.FREQ0, 0x62)
  155. else:
  156. raise Exception("Only 433MHz is currently supported")
  157. def setChannel(self, channel=0x00):
  158. self._writeSingleByte(self.CHANNR, channel)
  159. def setSyncWord(self, sync_word="FAFA"):
  160. assert len(sync_word) == 4
  161. self._writeSingleByte(self.SYNC1, int(sync_word[:2], 16))
  162. self._writeSingleByte(self.SYNC0, int(sync_word[2:], 16))
  163. def getRegisterConfiguration(self, register, showConfig=True):
  164. def toBits(byte):
  165. return bin(byte)[2:].zfill(8)
  166. if register == "PKTCTRL1":
  167. bits = toBits(self._readSingleByte(self.PKTCTRL1))
  168. if showConfig:
  169. print "PKTCTRL1"
  170. print "PQT[7:5] = %s" % bits[:3]
  171. print "CRC_AUTOFLUSH = %s" % bits[4]
  172. print "APPEND_STATUS = %s" % bits[5]
  173. print "ADR_CHK[1:0] = %s" % bits[6:]
  174. elif register == "PKTCTRL0":
  175. bits = toBits(self._readSingleByte(self.PKTCTRL0))
  176. if showConfig:
  177. print "PKTCTRL0"
  178. print "WHITE_DATA = %s" % bits[1]
  179. print "PKT_FORMAT[1:0] = %s" % bits[2:4]
  180. print "CRC_EN = %s" % bits[5]
  181. print "LENGTH_CONFIG[1:0] = %s" % bits[6:]
  182. elif register == "ADDR":
  183. bits = toBits(self._readSingleByte(self.ADDR))
  184. if showConfig:
  185. print "ADDR"
  186. print "DEVICE_ADDR = %s" % bits
  187. elif register == "CHANNR":
  188. bits = toBits(self._readSingleByte(self.CHANNR))
  189. if showConfig:
  190. print "CAHNNR"
  191. print "CHAN = %s" % bits
  192. elif register == "PKTSTATUS":
  193. bits = toBits(self._readSingleByte(self.CHANNR))
  194. if showConfig:
  195. print "PKTSTATUS"
  196. print "CRC_OK = %s" % bits[0]
  197. print "CS = %s" % bits[1]
  198. print "PQT_REACHED = %s" % bits[2]
  199. print "CCA = %s" % bits[3]
  200. print "SFD = %s" % bits[4]
  201. print "GDO2 = %s" % bits[5]
  202. print "GDO0 = %s" % bits[7]
  203. elif register == "MDMCFG2":
  204. bits = toBits(self._readSingleByte(self.MDMCFG2))
  205. if showConfig:
  206. print "MDMCFG2"
  207. print "DEM_DCFILT_OFF = %s" % bits[0]
  208. print "MOD_FORMAT = %s" % bits[1:4]
  209. print "MANCHESTER_EN = %s" % bits[4]
  210. print "SYNC_MODE = %s" % bits[5:]
  211. elif register == "MDMCFG1":
  212. bits = toBits(self._readSingleByte(self.MDMCFG1))
  213. if showConfig:
  214. print "MDMCFG1"
  215. print "FEC_EN = %s" % bits[0]
  216. print "NUM_PREAMBLE = %s" % bits[1:4]
  217. print "CHANSPC_E = %s" % bits[6:]
  218. return bits
  219. def setDefaultValues(self, version=1):
  220. # Default values extracted from Smart RF Studio 7
  221. self._writeSingleByte(self.IOCFG2, 0x2E) # Panstamp
  222. self._writeSingleByte(self.IOCFG1, 0x2E) # Panstamp
  223. self._writeSingleByte(self.IOCFG0, 0x06) # Panstamp
  224. self._writeSingleByte(self.FIFOTHR, 0x07) # Panstamp
  225. self._writeSingleByte(self.PKTLEN, 20)
  226. self._writeSingleByte(self.PKTCTRL1, 0x06) # Panstamp
  227. self._writeSingleByte(self.PKTCTRL0, 0x04) # Panstamp
  228. self.setSyncWord()
  229. self.setChannel()
  230. self.configureAddressFiltering()
  231. self._writeSingleByte(self.FSCTRL1, 0x08) # Panstamp
  232. self._writeSingleByte(self.FSCTRL0, 0x00) # Panstamp
  233. self.setCarrierFrequency()
  234. self._writeSingleByte(self.MDMCFG4, 0xCA) # Panstamp
  235. self._writeSingleByte(self.MDMCFG3, 0x83) # Panstamp
  236. self._writeSingleByte(self.MDMCFG2, 0x93) # Panstamp
  237. self._writeSingleByte(self.MDMCFG1, 0x22)
  238. self._writeSingleByte(self.MDMCFG0, 0xF8)
  239. self._writeSingleByte(self.DEVIATN, 0x35) # Panstamp
  240. self._writeSingleByte(self.MCSM2, 0x07)
  241. self._writeSingleByte(self.MCSM1, 0x20) # Panstamp
  242. self._writeSingleByte(self.MCSM0, 0x18)
  243. self._writeSingleByte(self.FOCCFG, 0x16)
  244. self._writeSingleByte(self.BSCFG, 0x6C)
  245. self._writeSingleByte(self.AGCCTRL2, 0x43) # Panstamp
  246. self._writeSingleByte(self.AGCCTRL1, 0x40)
  247. self._writeSingleByte(self.AGCCTRL0, 0x91)
  248. self._writeSingleByte(self.WOREVT1, 0x87)
  249. self._writeSingleByte(self.WOREVT0, 0x6B)
  250. self._writeSingleByte(self.WORCTRL, 0xFB)
  251. self._writeSingleByte(self.FREND1, 0x56)
  252. self._writeSingleByte(self.FREND0, 0x10)
  253. self._writeSingleByte(self.FSCAL3, 0xE9)
  254. self._writeSingleByte(self.FSCAL2, 0x2A)
  255. self._writeSingleByte(self.FSCAL1, 0x00)
  256. self._writeSingleByte(self.FSCAL0, 0x1F)
  257. self._writeSingleByte(self.RCCTRL1, 0x41)
  258. self._writeSingleByte(self.RCCTRL0, 0x00)
  259. self._writeSingleByte(self.FSTEST, 0x59)
  260. self._writeSingleByte(self.PTEST, 0x7F)
  261. self._writeSingleByte(self.AGCTEST, 0x3F)
  262. self._writeSingleByte(self.TEST2, 0x81)
  263. self._writeSingleByte(self.TEST1, 0x35)
  264. self._writeSingleByte(self.TEST0, 0x09)
  265. self._writeSingleByte(0x3E, 0xC0) # Power 10dBm
  266. def setSyncMode(self, syncmode):
  267. regVal = list(self.getRegisterConfiguration("MDMCFG2"))
  268. if syncmode > 7:
  269. raise Exception("Invalid SYNC mode")
  270. regVal[5:] = bin(syncmode)[2:].zfill(3)
  271. regVal = int("".join(regVal), 2)
  272. self._writeSingleByte(self.MDMCFG2, regVal)
  273. def setModulation(self, modulation):
  274. regVal = list(self.getRegisterConfiguration("MDMCFG2"))
  275. if modulation == "2-FSK":
  276. modVal = "000"
  277. elif modulation == "GFSK":
  278. modVal = "001"
  279. elif modulation == "ASK" or modulation == "OOK":
  280. modVal = "011"
  281. elif modulation == "4-FSK":
  282. modVal = "100"
  283. elif modulation == "MSK":
  284. modVal = "111"
  285. else:
  286. raise Exception("Modulation type NOT SUPPORTED!")
  287. regVal[1:4] = modVal
  288. regVal = int("".join(regVal), 2)
  289. self._writeSingleByte(self.MDMCFG2, regVal)
  290. def _flushRXFifo(self):
  291. self._strobe(self.SFRX)
  292. self._usDelay(2)
  293. def _flushTXFifo(self):
  294. self._strobe(self.SFTX)
  295. self._usDelay(2)
  296. def _setTXState(self):
  297. self._strobe(self.STX)
  298. self._usDelay(2)
  299. def _setRXState(self):
  300. self._strobe(self.SRX)
  301. self._usDelay(2)
  302. def getRSSI(self):
  303. return self._readSingleByte(self.RSSI)
  304. def _getMRStateMachineState(self):
  305. # The &0x1F works as a mask due to the fact
  306. # that the MARCSTATE register only uses the
  307. # first 5 bits
  308. return (self._readSingleByte(self.MARCSTATE) & 0x1F)
  309. def getPacketConfigurationMode(self):
  310. pktCtrlVal = self.getRegisterConfiguration("PKTCTRL0", False)
  311. if pktCtrlVal[6:] == "00": # Packet len is fixed
  312. return "PKT_LEN_FIXED"
  313. elif pktCtrlVal[6:] == "01": # Packet len is variable
  314. return "PKT_LEN_VARIABLE"
  315. elif pktCtrlVal[6:] == "10": # Infinite packet len mode
  316. return "PKT_LEN_INFINITE"
  317. def setPacketMode(self, mode="PKT_LEN_VARIABLE"):
  318. regVal = list(self.getRegisterConfiguration("PKTCTRL0", False))
  319. if mode == "PKT_LEN_FIXED":
  320. val = "00"
  321. elif mode == "PKT_LEN_VARIABLE":
  322. val = "01"
  323. elif mode == "PKT_LEN_INFINITE":
  324. val = "10"
  325. else:
  326. raise Exception("Packet mode NOT SUPPORTED!")
  327. regVal[6:] = val
  328. regVal = int("".join(regVal), 2)
  329. self._writeSingleByte(self.PKTCTRL0, regVal)
  330. def setFilteringAddress(self, address=0x0E):
  331. self._writeSingleByte(self.ADDR, address)
  332. def configureAddressFiltering(self, value="DISABLED"):
  333. regVal = list(self.getRegisterConfiguration("PKTCTRL1", False))
  334. if value == "DISABLED":
  335. val = "00"
  336. elif value == "ENABLED_NO_BROADCAST":
  337. val = "01"
  338. elif value == "ENABLED_00_BROADCAST":
  339. val = "10"
  340. elif value == "ENABLED_00_255_BROADCAST":
  341. val = "11"
  342. else:
  343. raise Exception("Address filtering configuration NOT SUPPORTED!")
  344. regVal[6:] = val
  345. regVal = int("".join(regVal), 2)
  346. self._writeSingleByte(self.PKTCTRL1, regVal)
  347. def sendData(self, dataBytes):
  348. self._setRXState()
  349. marcstate = self._getMRStateMachineState()
  350. dataToSend = []
  351. while ((marcstate & 0x1F) != 0x0D):
  352. if self.debug:
  353. print "marcstate = %x" % marcstate
  354. print "waiting for marcstate == 0x0D"
  355. if marcstate == 0x11:
  356. self._flushRXFifo()
  357. marcstate = self._getMRStateMachineState()
  358. if len(dataBytes) == 0:
  359. if self.debug:
  360. print "sendData | No data to send"
  361. return False
  362. sending_mode = self.getPacketConfigurationMode()
  363. data_len = len(dataBytes)
  364. if sending_mode == "PKT_LEN_FIXED":
  365. if data_len > self._readSingleByte(self.PKTLEN):
  366. if self.debug:
  367. print "Len of data exceeds the configured packet len"
  368. return False
  369. if self.getRegisterConfiguration("PKTCTRL1", False)[6:] != "00":
  370. dataToSend.append(self._readSingleByte(self.ADDR))
  371. dataToSend.extend(dataBytes)
  372. dataToSend.extend([0] * (self._readSingleByte(self.PKTLEN) - len(dataToSend)))
  373. if self.debug:
  374. print "Sending a fixed len packet"
  375. print "data len = %d" % (data_len)
  376. elif sending_mode == "PKT_LEN_VARIABLE":
  377. dataToSend.append(data_len)
  378. if self.getRegisterConfiguration("PKTCTRL1", False)[6:] != "00":
  379. dataToSend.append(self._readSingleByte(self.ADDR))
  380. dataToSend[0] += 1
  381. dataToSend.extend(dataBytes)
  382. if self.debug:
  383. print "Sending a variable len packet"
  384. print "Length of the packet is: %d" % data_len
  385. elif sending_mode == "PKT_LEN_INFINITE":
  386. # ToDo
  387. raise Exception("MODE NOT IMPLEMENTED")
  388. print dataToSend
  389. self._writeBurst(self.TXFIFO, dataToSend)
  390. self._usDelay(2000)
  391. self._setTXState()
  392. marcstate = self._getMRStateMachineState()
  393. if marcstate not in [0x13, 0x14, 0x15]: # RX, RX_END, RX_RST
  394. self.sidle()
  395. self._flushTXFifo()
  396. self._setRXState()
  397. if self.debug:
  398. print "senData | FAIL"
  399. print "sendData | MARCSTATE: %x" % self._readSingleByte(self.MARCSTATE)
  400. return False
  401. remaining_bytes = self._readSingleByte(self.TXBYTES) & 0x7F
  402. while remaining_bytes != 0:
  403. self._usDelay(1000)
  404. remaining_bytes = self._readSingleByte(self.TXBYTES) & 0x7F
  405. if self.debug:
  406. print "Waiting until all bytes are transmited, remaining bytes: %d" % remaining_bytes
  407. if (self._readSingleByte(self.TXBYTES) & 0x7F) == 0:
  408. if self.debug:
  409. print "Packet sent!"
  410. return True
  411. else:
  412. if self.debug:
  413. print self._readSingleByte(self.TXBYTES) & 0x7F
  414. print "sendData | MARCSTATE: %x" % self._getMRStateMachineState()
  415. self.sidle()
  416. self._flushTXFifo()
  417. time.sleep(5)
  418. self._setRXState()
  419. return False
  420. def recvData(self):
  421. rx_bytes_val = self._readSingleByte(self.RXBYTES)
  422. #if rx_bytes_val has something and Underflow bit is not 1
  423. if (rx_bytes_val & 0x7F and not (rx_bytes_val & 0x80)):
  424. sending_mode = self.getPacketConfigurationMode()
  425. if sending_mode == "PKT_LEN_FIXED":
  426. data_len = self._readSingleByte(self.PKTLEN)
  427. elif sending_mode == "PKT_LEN_VARIABLE":
  428. max_len = self._readSingleByte(self.PKTLEN)
  429. data_len = self._readSingleByte(self.RXFIFO)
  430. if data_len > max_len:
  431. if self.debug:
  432. print "Len of data exceeds the configured maximum packet len"
  433. return False
  434. if self.debug:
  435. print "Receiving a variable len packet"
  436. print "max len: %d" % max_len
  437. print "Packet length: %d" % data_len
  438. elif sending_mode == "PKT_LEN_INFINITE":
  439. # ToDo
  440. raise Exception("MODE NOT IMPLEMENTED")
  441. data = self._readBurst(self.RXFIFO, data_len)
  442. valPktCtrl1 = self.getRegisterConfiguration("PKTCTRL1", False)
  443. if valPktCtrl1[5] == "1": # PKTCTRL1[5] == APPEND_STATUS
  444. # When enabled, two status bytes will be appended to the payload of the
  445. # packet. The status bytes contain RSSI and LQI values, as well as CRC OK.
  446. rssi = self._readSingleByte(self.RXFIFO)
  447. val = self._readSingleByte(self.RXFIFO)
  448. lqi = val & 0x7f
  449. if self.debug and valPktCtrl1[5] == "1":
  450. print "Packet information is enabled"
  451. print "RSSI: %d" % (rssi)
  452. print "VAL: %d" % (val)
  453. print "LQI: %d" % (lqi)
  454. print "Data: " + str(data)
  455. self._flushRXFifo()
  456. return data