__init__.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import enum
  2. import spidev
  3. class CC1101:
  4. # Table 45: SPI Address Space
  5. _READ_SINGLE_BYTE = 0x80
  6. class _Register(enum.IntEnum):
  7. SRES = 0x30
  8. # 29.3 Status Register Details
  9. PARTNUM = 0xF0
  10. VERSION = 0xF1
  11. # 29.3 Status Register Details
  12. _SUPPORTED_PARTNUM = 0
  13. _SUPPORTED_VERSION = 0x14
  14. def __init__(self) -> None:
  15. self._spi = spidev.SpiDev()
  16. def _reset(self) -> None:
  17. assert self._spi.xfer([self._Register.SRES, 0]) == [0x0F, 0x0F]
  18. def _read_single_byte(self, register: _Register) -> int:
  19. response = self._spi.xfer([self._READ_SINGLE_BYTE | register, 0])
  20. assert len(response) == 2, response
  21. assert response[0] == 0
  22. return response[1]
  23. def __enter__(self) -> "CC1101":
  24. # https://docs.python.org/3/reference/datamodel.html#object.__enter__
  25. self._spi.open(0, 0)
  26. self._spi.max_speed_hz = 55700 # empirical
  27. self._reset()
  28. partnum = self._read_single_byte(self._Register.PARTNUM)
  29. if partnum != self._SUPPORTED_PARTNUM:
  30. raise ValueError(
  31. "unexpected chip part number {} (expected: {})".format(
  32. partnum, self._SUPPORTED_PARTNUM
  33. )
  34. )
  35. version = self._read_single_byte(self._Register.VERSION)
  36. if version != self._SUPPORTED_VERSION:
  37. raise ValueError(
  38. "unexpected chip version number {} (expected: {})".format(
  39. version, self._SUPPORTED_VERSION
  40. )
  41. )
  42. return self
  43. def __exit__(self, exc_type, exc_value, traceback) -> bool:
  44. # https://docs.python.org/3/reference/datamodel.html#object.__exit__
  45. self._spi.close()
  46. return False