Skip to content

Commit 3c639c1

Browse files
authored
Merge pull request #31 from kamocat/main
Consolidated sequential writes
2 parents 8e4f603 + 40873a4 commit 3c639c1

File tree

1 file changed

+32
-30
lines changed

1 file changed

+32
-30
lines changed

adafruit_si5351.py

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -161,17 +161,18 @@ def frequency(self) -> int:
161161

162162
def _configure_registers(self, p1: int, p2: int, p3: int) -> None:
163163
# Update PLL registers.
164-
# The datasheet is a nightmare of typos and inconsistencies here!
165-
self._si5351._write_u8(self._base, (p3 & 0x0000FF00) >> 8)
166-
self._si5351._write_u8(self._base + 1, (p3 & 0x000000FF))
167-
self._si5351._write_u8(self._base + 2, (p1 & 0x00030000) >> 16)
168-
self._si5351._write_u8(self._base + 3, (p1 & 0x0000FF00) >> 8)
169-
self._si5351._write_u8(self._base + 4, (p1 & 0x000000FF))
170-
self._si5351._write_u8(
171-
self._base + 5, ((p3 & 0x000F0000) >> 12) | ((p2 & 0x000F0000) >> 16)
172-
)
173-
self._si5351._write_u8(self._base + 6, (p2 & 0x0000FF00) >> 8)
174-
self._si5351._write_u8(self._base + 7, (p2 & 0x000000FF))
164+
with self._si5351._device as i2c:
165+
buf = self._si5351._BUFFER
166+
buf[0] = self._base
167+
buf[1] = (p3 & 0x0000FF00) >> 8
168+
buf[2] = p3 & 0x000000FF
169+
buf[3] = (p1 & 0x00030000) >> 16
170+
buf[4] = (p1 & 0x0000FF00) >> 8
171+
buf[5] = p1 & 0x000000FF
172+
buf[6] = ((p3 & 0x000F0000) >> 12) | ((p2 & 0x000F0000) >> 16)
173+
buf[7] = (p2 & 0x0000FF00) >> 8
174+
buf[8] = p2 & 0x000000FF
175+
i2c.write(buf, end=9)
175176
# Reset both PLLs.
176177
self._si5351._write_u8(_SI5351_REGISTER_177_PLL_RESET, (1 << 7) | (1 << 5))
177178

@@ -311,16 +312,18 @@ def r_divider(self, divider: int) -> None:
311312

312313
def _configure_registers(self, p1: int, p2: int, p3: int) -> None:
313314
# Update MSx registers.
314-
self._si5351._write_u8(self._base, (p3 & 0x0000FF00) >> 8)
315-
self._si5351._write_u8(self._base + 1, (p3 & 0x000000FF))
316-
self._si5351._write_u8(self._base + 2, (p1 & 0x00030000) >> 16)
317-
self._si5351._write_u8(self._base + 3, (p1 & 0x0000FF00) >> 8)
318-
self._si5351._write_u8(self._base + 4, (p1 & 0x000000FF))
319-
self._si5351._write_u8(
320-
self._base + 5, ((p3 & 0x000F0000) >> 12) | ((p2 & 0x000F0000) >> 16)
321-
)
322-
self._si5351._write_u8(self._base + 6, (p2 & 0x0000FF00) >> 8)
323-
self._si5351._write_u8(self._base + 7, (p2 & 0x000000FF))
315+
with self._si5351._device as i2c:
316+
buf = self._si5351._BUFFER
317+
buf[0] = self._base
318+
buf[1] = (p3 & 0x0000FF00) >> 8
319+
buf[2] = p3 & 0x000000FF
320+
buf[3] = (p1 & 0x00030000) >> 16
321+
buf[4] = (p1 & 0x0000FF00) >> 8
322+
buf[5] = p1 & 0x000000FF
323+
buf[6] = ((p3 & 0x000F0000) >> 12) | ((p2 & 0x000F0000) >> 16)
324+
buf[7] = (p2 & 0x0000FF00) >> 8
325+
buf[8] = p2 & 0x000000FF
326+
i2c.write(buf, end=9)
324327

325328
def configure_integer(
326329
self, pll: "PLL", divider: int, inverted: bool = False
@@ -406,22 +409,21 @@ def configure_fractional(
406409

407410
# Class-level buffer to reduce allocations and heap fragmentation.
408411
# This is not thread-safe or re-entrant by design!
409-
_BUFFER = bytearray(2)
412+
_BUFFER = bytearray(9)
410413

411414
def __init__(self, i2c: I2C, *, address: int = _SI5351_ADDRESS) -> None:
412415
self._device = i2c_device.I2CDevice(i2c, address)
413416
# Setup the SI5351.
414417
# Disable all outputs setting CLKx_DIS high.
415418
self._write_u8(_SI5351_REGISTER_3_OUTPUT_ENABLE_CONTROL, 0xFF)
416419
# Power down all output drivers
417-
self._write_u8(_SI5351_REGISTER_16_CLK0_CONTROL, 0x80)
418-
self._write_u8(_SI5351_REGISTER_17_CLK1_CONTROL, 0x80)
419-
self._write_u8(_SI5351_REGISTER_18_CLK2_CONTROL, 0x80)
420-
self._write_u8(_SI5351_REGISTER_19_CLK3_CONTROL, 0x80)
421-
self._write_u8(_SI5351_REGISTER_20_CLK4_CONTROL, 0x80)
422-
self._write_u8(_SI5351_REGISTER_21_CLK5_CONTROL, 0x80)
423-
self._write_u8(_SI5351_REGISTER_22_CLK6_CONTROL, 0x80)
424-
self._write_u8(_SI5351_REGISTER_23_CLK7_CONTROL, 0x80)
420+
# Class-level buffer to reduce allocations and heap fragmentation.
421+
# This is not thread-safe or re-entrant by design!
422+
with self._device as i2c_bus:
423+
self._BUFFER[0] = _SI5351_REGISTER_16_CLK0_CONTROL
424+
for i in range(1, 9):
425+
self._BUFFER[i] = 0x80
426+
i2c_bus.write(self._BUFFER, end=9)
425427
# Initialize PLL A and B objects.
426428
self.pll_a = self._PLL(self, 26, 0)
427429
self.pll_b = self._PLL(self, 34, (1 << 5))

0 commit comments

Comments
 (0)