From 1e326997ed26949ba6a95963ebe7099079ad1569 Mon Sep 17 00:00:00 2001 From: Hoernchen Date: Fri, 7 Jun 2013 22:53:50 +0200 Subject: [PATCH] firmware: enable int mode if div is even integer to improve jitter performance --- firmware/common/hackrf_core.c | 7 +++++++ firmware/common/si5351c.c | 18 ++++++++++++++++++ firmware/common/si5351c.h | 1 + 3 files changed, 26 insertions(+) diff --git a/firmware/common/hackrf_core.c b/firmware/common/hackrf_core.c index d1be02e7..7246d222 100644 --- a/firmware/common/hackrf_core.c +++ b/firmware/common/hackrf_core.c @@ -49,6 +49,9 @@ bool set_fracrate(const float freq) { if(a != div){ uint32_t j=0,k=1,l=1,m=1; + + si5351c_set_int_mode(0, 0); + while (k <= 0xFFFF && m <= 0xFFFF){ float n = (float)(j+l)/(k+m); if( x == n){ @@ -77,6 +80,10 @@ bool set_fracrate(const float freq) { b=j; c=k; } } else { + if(a & 0x1) // odd integer, needs frac mode + si5351c_set_int_mode(0, 0); + else + si5351c_set_int_mode(0, 1); b=0; c=1; } diff --git a/firmware/common/si5351c.c b/firmware/common/si5351c.c index 6cc0d253..e661fbc0 100644 --- a/firmware/common/si5351c.c +++ b/firmware/common/si5351c.c @@ -249,3 +249,21 @@ void si5351c_configure_clock_control() uint8_t data[] = { 3, 0xC8 }; si5351c_write(data, sizeof(data)); } + + + void si5351c_set_int_mode(const uint_fast8_t ms_number, const uint_fast8_t on){ + uint8_t data[] = {16, 0}; + + if(ms_number < 8){ + data[0] = 16 + ms_number; + data[1] = si5351c_read_single(data[0]); + + if(on) + data[1] |= SI5351C_CLK_INT_MODE; + else + data[1] &= ~(SI5351C_CLK_INT_MODE); + + si5351c_write(data, 2); + } + + } diff --git a/firmware/common/si5351c.h b/firmware/common/si5351c.h index 12f1dc3a..a2867438 100644 --- a/firmware/common/si5351c.h +++ b/firmware/common/si5351c.h @@ -67,6 +67,7 @@ void si5351c_configure_multisynth(const uint_fast8_t ms_number, const uint_fast8_t r_div); void si5351c_configure_clock_control(); void si5351c_enable_clock_outputs(); +void si5351c_set_int_mode(const uint_fast8_t ms_number, const uint_fast8_t on); void si5351c_write_single(uint8_t reg, uint8_t val); uint8_t si5351c_read_single(uint8_t reg);