@@ -161,17 +161,18 @@ def frequency(self) -> int:
161
161
162
162
def _configure_registers (self , p1 : int , p2 : int , p3 : int ) -> None :
163
163
# 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 )
175
176
# Reset both PLLs.
176
177
self ._si5351 ._write_u8 (_SI5351_REGISTER_177_PLL_RESET , (1 << 7 ) | (1 << 5 ))
177
178
@@ -311,16 +312,18 @@ def r_divider(self, divider: int) -> None:
311
312
312
313
def _configure_registers (self , p1 : int , p2 : int , p3 : int ) -> None :
313
314
# 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 )
324
327
325
328
def configure_integer (
326
329
self , pll : "PLL" , divider : int , inverted : bool = False
@@ -406,22 +409,21 @@ def configure_fractional(
406
409
407
410
# Class-level buffer to reduce allocations and heap fragmentation.
408
411
# This is not thread-safe or re-entrant by design!
409
- _BUFFER = bytearray (2 )
412
+ _BUFFER = bytearray (9 )
410
413
411
414
def __init__ (self , i2c : I2C , * , address : int = _SI5351_ADDRESS ) -> None :
412
415
self ._device = i2c_device .I2CDevice (i2c , address )
413
416
# Setup the SI5351.
414
417
# Disable all outputs setting CLKx_DIS high.
415
418
self ._write_u8 (_SI5351_REGISTER_3_OUTPUT_ENABLE_CONTROL , 0xFF )
416
419
# 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 )
425
427
# Initialize PLL A and B objects.
426
428
self .pll_a = self ._PLL (self , 26 , 0 )
427
429
self .pll_b = self ._PLL (self , 34 , (1 << 5 ))
0 commit comments