Skip to content

Commit 8436e76

Browse files
authored
Merge pull request #18 from caternuson/blinka_iss262
Reimplement wakeup()
2 parents 678b7ab + 06dfad3 commit 8436e76

File tree

1 file changed

+15
-35
lines changed

1 file changed

+15
-35
lines changed

adafruit_atecc/adafruit_atecc.py

Lines changed: 15 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -113,48 +113,28 @@ def __init__(self, i2c_bus, address=_REG_ATECC_DEVICE_ADDR, debug=False):
113113
"""
114114
self._debug = debug
115115
self._i2cbuf = bytearray(12)
116-
self._i2c_bus = i2c_bus
117-
self._i2c_device = None
118-
self.wakeup()
119-
if not self._i2c_device:
120-
self._i2c_device = I2CDevice(self._i2c_bus, address)
121-
self.idle()
116+
# don't probe, the device will NACK until woken up
117+
self._wake_device = I2CDevice(i2c_bus, 0x00, probe=False)
118+
self._i2c_device = I2CDevice(i2c_bus, address, probe=False)
122119
if (self.version() >> 8) not in (_ATECC_508_VER, _ATECC_608_VER):
123120
raise RuntimeError(
124121
"Failed to find 608 or 508 chip. Please check your wiring."
125122
)
126123

127124
def wakeup(self):
128-
"""Wakes up THE ATECC608A from sleep or idle modes.
129-
Returns True if device woke up from sleep/idle mode.
130-
"""
131-
while not self._i2c_bus.try_lock():
132-
pass
133-
# check if it exists, first
134-
if 0x60 in self._i2c_bus.scan():
135-
self._i2c_bus.unlock()
136-
return
137-
zero_bits = bytearray(2)
125+
"""Wakes up THE ATECC608A from sleep or idle modes."""
126+
# This is a hack to generate the ATECC Wake condition, which is SDA
127+
# held low for t > 60us (twlo). For an I2C clock freq of 100kHz, 8
128+
# clock cycles will be 80us. This signal is generated by trying to
129+
# address something at 0x00. It will fail, but the pattern should
130+
# wake up the ATECC.
131+
# pylint: disable=bare-except
138132
try:
139-
self._i2c_bus.writeto(0x0, zero_bits)
140-
except OSError:
141-
pass # this may fail, that's ok - its just to wake up the chip!
142-
time.sleep(_TWLO_TIME)
143-
data = self._i2c_bus.scan() # check for an i2c device
144-
145-
try:
146-
if data[0] != 96:
147-
raise TypeError("ATECCx08 not found - please check your wiring!")
148-
except IndexError as err:
149-
raise IndexError("ATECCx08 not found - please check your wiring!") from err
150-
self._i2c_bus.unlock()
151-
if not self._i2c_device:
152-
self._i2c_device = I2CDevice(self._i2c_bus, _REG_ATECC_DEVICE_ADDR)
153-
# check if we are ready to read from
154-
r = bytearray(1)
155-
self._get_response(r)
156-
if r[0] != 0x11:
157-
raise RuntimeError("Failed to wakeup")
133+
with self._wake_device as i2c:
134+
i2c.write(bytes([0x00]))
135+
except:
136+
pass
137+
time.sleep(0.001)
158138

159139
def idle(self):
160140
"""Puts the chip into idle mode

0 commit comments

Comments
 (0)