|
@@ -0,0 +1,57 @@
|
|
|
+import enum
|
|
|
+
|
|
|
+import spidev
|
|
|
+
|
|
|
+
|
|
|
+class CC1101:
|
|
|
+
|
|
|
+
|
|
|
+ _READ_SINGLE_BYTE = 0x80
|
|
|
+
|
|
|
+ class _Register(enum.IntEnum):
|
|
|
+ SRES = 0x30
|
|
|
+
|
|
|
+ PARTNUM = 0xF0
|
|
|
+ VERSION = 0xF1
|
|
|
+
|
|
|
+
|
|
|
+ _SUPPORTED_PARTNUM = 0
|
|
|
+ _SUPPORTED_VERSION = 0x14
|
|
|
+
|
|
|
+ def __init__(self) -> None:
|
|
|
+ self._spi = spidev.SpiDev()
|
|
|
+
|
|
|
+ def _reset(self) -> None:
|
|
|
+ assert self._spi.xfer([self._Register.SRES, 0]) == [0x0F, 0x0F]
|
|
|
+
|
|
|
+ def _read_single_byte(self, register: _Register) -> int:
|
|
|
+ response = self._spi.xfer([self._READ_SINGLE_BYTE | register, 0])
|
|
|
+ assert len(response) == 2, response
|
|
|
+ assert response[0] == 0
|
|
|
+ return response[1]
|
|
|
+
|
|
|
+ def __enter__(self) -> "CC1101":
|
|
|
+
|
|
|
+ self._spi.open(0, 0)
|
|
|
+ self._spi.max_speed_hz = 55700
|
|
|
+ self._reset()
|
|
|
+ partnum = self._read_single_byte(self._Register.PARTNUM)
|
|
|
+ if partnum != self._SUPPORTED_PARTNUM:
|
|
|
+ raise ValueError(
|
|
|
+ "unexpected chip part number {} (expected: {})".format(
|
|
|
+ partnum, self._SUPPORTED_PARTNUM
|
|
|
+ )
|
|
|
+ )
|
|
|
+ version = self._read_single_byte(self._Register.VERSION)
|
|
|
+ if version != self._SUPPORTED_VERSION:
|
|
|
+ raise ValueError(
|
|
|
+ "unexpected chip version number {} (expected: {})".format(
|
|
|
+ version, self._SUPPORTED_VERSION
|
|
|
+ )
|
|
|
+ )
|
|
|
+ return self
|
|
|
+
|
|
|
+ def __exit__(self, exc_type, exc_value, traceback) -> bool:
|
|
|
+
|
|
|
+ self._spi.close()
|
|
|
+ return False
|