Merge pull request #75 from Hoernchen/siclock

see commits
This commit is contained in:
Michael Ossmann
2013-06-07 20:34:28 -07:00
5 changed files with 79 additions and 48 deletions

View File

@ -49,6 +49,9 @@ bool set_fracrate(const float freq) {
if(a != div){ if(a != div){
uint32_t j=0,k=1,l=1,m=1; uint32_t j=0,k=1,l=1,m=1;
si5351c_set_int_mode(0, 0);
while (k <= 0xFFFF && m <= 0xFFFF){ while (k <= 0xFFFF && m <= 0xFFFF){
float n = (float)(j+l)/(k+m); float n = (float)(j+l)/(k+m);
if( x == n){ if( x == n){
@ -77,6 +80,10 @@ bool set_fracrate(const float freq) {
b=j; c=k; b=j; c=k;
} }
} else { } 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; b=0; c=1;
} }

View File

@ -249,3 +249,21 @@ void si5351c_configure_clock_control()
uint8_t data[] = { 3, 0xC8 }; uint8_t data[] = { 3, 0xC8 };
si5351c_write(data, sizeof(data)); 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);
}
}

View File

@ -67,6 +67,7 @@ void si5351c_configure_multisynth(const uint_fast8_t ms_number,
const uint_fast8_t r_div); const uint_fast8_t r_div);
void si5351c_configure_clock_control(); void si5351c_configure_clock_control();
void si5351c_enable_clock_outputs(); 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); void si5351c_write_single(uint8_t reg, uint8_t val);
uint8_t si5351c_read_single(uint8_t reg); uint8_t si5351c_read_single(uint8_t reg);

View File

@ -109,53 +109,60 @@ int dump_multisynth_config(hackrf_device* device, const uint_fast8_t ms_number)
uint32_t p1,p2,p3,r_div; uint32_t p1,p2,p3,r_div;
uint_fast8_t div_lut[] = {1,2,4,8,16,32,64,128}; uint_fast8_t div_lut[] = {1,2,4,8,16,32,64,128};
printf("MS%d:", ms_number); printf("MS%d:", ms_number);
if(ms_number <6){ if(ms_number <6){
reg_base = 42 + (ms_number * 8); reg_base = 42 + (ms_number * 8);
for(i=0; i<8; i++) { for(i=0; i<8; i++) {
uint_fast8_t reg_number = reg_base + i; uint_fast8_t reg_number = reg_base + i;
int result = hackrf_si5351c_read(device, reg_number, &parameters[i]); int result = hackrf_si5351c_read(device, reg_number, &parameters[i]);
if( result != HACKRF_SUCCESS ) { if( result != HACKRF_SUCCESS ) {
return result; return result;
} }
} }
p1 = p1 =
(parameters[2] & 0x03 << 16) (parameters[2] & 0x03 << 16)
| (parameters[3] << 8) | (parameters[3] << 8)
| parameters[4] | parameters[4]
; ;
p2 = p2 =
(parameters[5] & 0x0F << 16) (parameters[5] & 0x0F << 16)
| (parameters[6] << 8) | (parameters[6] << 8)
| parameters[7] | parameters[7]
; ;
p3 = p3 =
(parameters[5] & 0xF0 << 12) (parameters[5] & 0xF0 << 12)
| (parameters[0] << 8) | (parameters[0] << 8)
| parameters[1] | parameters[1]
; ;
r_div = r_div =
(parameters[2] >> 4) & 0x7 (parameters[2] >> 4) & 0x7
; ;
printf("\tp1 = %u\n", p1); printf("\tp1 = %u\n", p1);
printf("\tp2 = %u\n", p2); printf("\tp2 = %u\n", p2);
printf("\tp3 = %u\n", p3); printf("\tp3 = %u\n", p3);
} else { if(p3)
// MS6 and 7 are integer only printf("\tOutput (800Mhz PLL): %#.10f Mhz\n", (800 / (float)((p1*p3 + p2 + 512*p3)/(128*p3))) / div_lut[r_div] );
reg_base = 90; } else {
for(i=0; i<3; i++) { // MS6 and 7 are integer only
uint_fast8_t reg_number = reg_base + i; unsigned int parms;
int result = hackrf_si5351c_read(device, reg_number, &parameters[i]); reg_base = 90;
if( result != HACKRF_SUCCESS ) {
return result;
}
}
r_div = (ms_number == 6) ? parameters[2] & 0x7 : parameters[2] & 0x70 >> 4 ; for(i=0; i<3; i++) {
printf("\tp1_int = %u\n", (ms_number == 6) ? parameters[0] : parameters[1]); uint_fast8_t reg_number = reg_base + i;
} int result = hackrf_si5351c_read(device, reg_number, &parameters[i]);
if( result != HACKRF_SUCCESS ) {
return result;
}
}
r_div = (ms_number == 6) ? parameters[2] & 0x7 : parameters[2] & 0x70 >> 4 ;
parms = (ms_number == 6) ? parameters[0] : parameters[1];
printf("\tp1_int = %u\n", parms);
if(parms)
printf("\tOutput (800Mhz PLL): %#.10f Mhz\n", (800.0f / parms) / div_lut[r_div] );
}
printf("\toutput divider = %u\n", div_lut[r_div]); printf("\toutput divider = %u\n", div_lut[r_div]);
return HACKRF_SUCCESS; return HACKRF_SUCCESS;
@ -236,6 +243,6 @@ int main(int argc, char** argv) {
} }
hackrf_exit(); hackrf_exit();
return 0; return 0;
} }

View File

@ -770,8 +770,6 @@ typedef struct {
int ADDCALL hackrf_set_fracrate(hackrf_device* device, const float freq_mhz) int ADDCALL hackrf_set_fracrate(hackrf_device* device, const float freq_mhz)
{ {
uint32_t l_freq_mhz;
uint32_t l_freq_hz;
set_fracrate_params_t set_fracrate_params; set_fracrate_params_t set_fracrate_params;
uint8_t length; uint8_t length;
int result; int result;