@@ -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