diff --git a/si4432.c b/si4432.c index 0bd80a4..4a7ff90 100644 --- a/si4432.c +++ b/si4432.c @@ -185,101 +185,93 @@ void SI4432_Receive(void) } } - // User asks for an RBW of WISH, go through table finding the last triple // for which WISH is greater than the first entry, use those values, // Return the first entry of the following triple for the RBW actually achieved -static const short RBW_choices[] = -{ // Each quadrupple is: ndec, fils, WISH*10, corr*10 - 5,1,26,-5, - 5,2,28,-5, - 5,3,31,0, - 5,4,32,0, - 5,5,37,0, - 5,6,42,0, - 5,7,45,5, - 4,1,49,5, - 4,2,54,-5, - 4,3,59,-5, - 4,4,61,-5, - 4,5,72,0, - 4,6,82,0, - 4,7,88,-5, - 3,1,95,0, - 3,2,106,0, - 3,3,115,0, - 3,4,121,-5, - 3,5,142,0, - 3,6,162,0, - 3,7,175,0, - 2,1,189,0, - 2,2,210,-5, - 2,3,227,0, - 2,4,240,-5, - 2,5,282,0, - 2,6,322,0, - 2,7,347,0, - 1,1,377,0, - 1,2,417,-5, - 1,3,452,0, - 1,4,479,-5, - 1,5,562,0, - 1,6,641,0, - 1,7,692,0, - 0,1,752,-5, - 0,2,832,-5, - 0,3,900,0, - 0,4,953,-5, - 0,5,1121,0, - 0,6,1279,0, - 0,7,1379,0, - 1,4,1428,15, - 1,5,1678,20, - 1,9,1811,-55, - 0,15,1915,-105, - 0,1,2251,15, - 0,2,2488,20, - 0,3,2693,20, - 0,4,2849,15, - 0,8,3355,-15, - 0,9,3618,-55, - 0,10,4202,-15, - 0,11,4684,-15, - 0,12,5188,-20, - 0,13,5770,-15, - 0,14,6207,-10, +#define IF_BW(dwn3, ndec, filset) (((dwn3)<<7)|((ndec)<<4)|(filset)) +typedef struct { + uint8_t reg; // IF_BW(dwn3, ndec, filset) + int8_t RSSI_correction_x_10; // Correction * 10 + uint16_t RBWx10; // RBW * 10 in kHz +}RBW_t; // sizeof(RBW_t) = 4 bytes + +static RBW_t RBW_choices[] = { +// BW register corr freq + {IF_BW(0,5, 1), -5, 26}, // RBW 2.6 kHz + {IF_BW(0,5, 2), -5, 28}, + {IF_BW(0,5, 3), 0, 31}, + {IF_BW(0,5, 4), 0, 32}, + {IF_BW(0,5, 5), 0, 37}, + {IF_BW(0,5, 6), 0, 42}, + {IF_BW(0,5, 7), 5, 45}, + {IF_BW(0,4, 1), 5, 49}, + {IF_BW(0,4, 2), -5, 54}, + {IF_BW(0,4, 3), -5, 59}, + {IF_BW(0,4, 4), -5, 61}, + {IF_BW(0,4, 5), 0, 72}, + {IF_BW(0,4, 6), 0, 82}, + {IF_BW(0,4, 7), -5, 88}, + {IF_BW(0,3, 1), 0, 95}, + {IF_BW(0,3, 2), 0, 106}, + {IF_BW(0,3, 3), 0, 115}, + {IF_BW(0,3, 4), -5, 121}, + {IF_BW(0,3, 5), 0, 142}, + {IF_BW(0,3, 6), 0, 162}, + {IF_BW(0,3, 7), 0, 175}, + {IF_BW(0,2, 1), 0, 189}, + {IF_BW(0,2, 2), -5, 210}, + {IF_BW(0,2, 3), 0, 227}, + {IF_BW(0,2, 4), -5, 240}, + {IF_BW(0,2, 5), 0, 282}, + {IF_BW(0,2, 6), 0, 322}, + {IF_BW(0,2, 7), 0, 347}, + {IF_BW(0,1, 1), 0, 377}, + {IF_BW(0,1, 2), -5, 417}, + {IF_BW(0,1, 3), 0, 452}, + {IF_BW(0,1, 4), -5, 479}, + {IF_BW(0,1, 5), 0, 562}, + {IF_BW(0,1, 6), 0, 641}, + {IF_BW(0,1, 7), 0, 692}, + {IF_BW(0,0, 1), -5, 752}, + {IF_BW(0,0, 2), -5, 832}, + {IF_BW(0,0, 3), 0, 900}, + {IF_BW(0,0, 4), -5, 953}, + {IF_BW(0,0, 5), 0, 1121}, + {IF_BW(0,0, 6), 0, 1279}, + {IF_BW(0,0, 7), 0, 1379}, + {IF_BW(1,1, 4), 15, 1428}, + {IF_BW(1,1, 5), 20, 1678}, + {IF_BW(1,1, 9), -55, 1811}, + {IF_BW(1,0,15), -105, 1915}, + {IF_BW(1,0, 1), 15, 2251}, + {IF_BW(1,0, 2), 20, 2488}, + {IF_BW(1,0, 3), 20, 2693}, + {IF_BW(1,0, 4), 15, 2849}, + {IF_BW(1,0, 8), -15, 3355}, + {IF_BW(1,0, 9), -55, 3618}, + {IF_BW(1,0,10), -15, 4202}, + {IF_BW(1,0,11), -15, 4684}, + {IF_BW(1,0,12), -20, 5188}, + {IF_BW(1,0,13), -15, 5770}, + {IF_BW(1,0,14), -10, 6207} }; static float SI4432_RSSI_correction = -120.0; -float SI4432_SET_RBW(float w) { - uint8_t dwn3=0; - int32_t WISH = (uint32_t)(w * 10.0); - uint8_t ndec, fils, i; - if (WISH > 6207) WISH=6207; // Final value in RBW_choices[] - if (WISH > 1379) dwn3 = 1 ; - for (i=3; i= (int)(sizeof RBW_choices) / 2 ) - return 0; - return(RBW_choices[i*4-1]); +float SI4432_SET_RBW(float w) { + uint16_t WISH = (uint16_t)(w * 10.0); + int i; + for (i=0; i < (int)(sizeof(RBW_choices)/sizeof(RBW_t)) - 1; i++) + if (WISH <= RBW_choices[i].RBWx10) + break; + return SI4432_force_RBW(i); } int setting_frequency_10mhz = 10000000;