wait for lock on Si5351C

This commit is contained in:
Jan Käberich 2022-11-17 12:05:52 +01:00
parent aeaf9340d3
commit a4b1978098
4 changed files with 20 additions and 4 deletions

View File

@ -175,6 +175,17 @@ bool Si5351C::Locked(PLL pll) {
} }
} }
bool Si5351C::WaitForLock(PLL pll, uint32_t timeout) {
uint32_t start = HAL_GetTick();
while(HAL_GetTick() - start <= timeout) {
if(Locked(pll)) {
return true;
}
}
LOG_WARN("Failed to lock");
return false;
}
bool Si5351C::WritePLLConfig(PLLConfig config, PLL pll) { bool Si5351C::WritePLLConfig(PLLConfig config, PLL pll) {
uint8_t PllData[8]; uint8_t PllData[8];
// See register map in https://www.silabs.com/documents/public/application-notes/AN619.pdf (page 11) // See register map in https://www.silabs.com/documents/public/application-notes/AN619.pdf (page 11)
@ -372,4 +383,3 @@ bool Si5351C::ReadRawCLKConfig(uint8_t clknum, uint8_t *config) {
auto reg = (Reg) ((int) Reg::MS0_CONFIG + 8 * clknum); auto reg = (Reg) ((int) Reg::MS0_CONFIG + 8 * clknum);
return ReadRegisterRange(reg, config, 8); return ReadRegisterRange(reg, config, 8);
} }

View File

@ -39,6 +39,7 @@ public:
bool Enable(uint8_t clknum); bool Enable(uint8_t clknum);
bool Disable(uint8_t clknum); bool Disable(uint8_t clknum);
bool Locked(PLL pll); bool Locked(PLL pll);
bool WaitForLock(PLL pll, uint32_t timeout);
bool ResetPLL(PLL pll); bool ResetPLL(PLL pll);
bool ExtCLKAvailable(); bool ExtCLKAvailable();

View File

@ -133,7 +133,9 @@ bool HW::Init() {
// PLL reset appears to realign phases of clock signals // PLL reset appears to realign phases of clock signals
Si5351.ResetPLL(Si5351C::PLL::B); Si5351.ResetPLL(Si5351C::PLL::B);
LOG_DEBUG("Si5351 locked"); if(Si5351.WaitForLock(Si5351C::PLL::B, 10)) {
LOG_DEBUG("Si5351 locked");
}
// FPGA clock is now present, can initialize // FPGA clock is now present, can initialize
if (!FPGA::Init(HaltedCallback)) { if (!FPGA::Init(HaltedCallback)) {

View File

@ -135,6 +135,7 @@ bool VNA::Setup(Protocol::SweepSettings s) {
Si5351.SetCLK(SiChannel::Port2LO2, last_LO2, Si5351C::PLL::B, Si5351C::DriveStrength::mA2); Si5351.SetCLK(SiChannel::Port2LO2, last_LO2, Si5351C::PLL::B, Si5351C::DriveStrength::mA2);
Si5351.SetCLK(SiChannel::RefLO2, last_LO2, Si5351C::PLL::B, Si5351C::DriveStrength::mA2); Si5351.SetCLK(SiChannel::RefLO2, last_LO2, Si5351C::PLL::B, Si5351C::DriveStrength::mA2);
Si5351.ResetPLL(Si5351C::PLL::B); Si5351.ResetPLL(Si5351C::PLL::B);
Si5351.WaitForLock(Si5351C::PLL::B, 10);
IFTableIndexCnt = 0; IFTableIndexCnt = 0;
@ -269,6 +270,7 @@ bool VNA::Setup(Protocol::SweepSettings s) {
// revert clk configuration to previous value (might have been changed in sweep calculation) // revert clk configuration to previous value (might have been changed in sweep calculation)
Si5351.SetCLK(SiChannel::RefLO2, HW::getIF1() - HW::getIF2(), Si5351C::PLL::B, Si5351C::DriveStrength::mA2); Si5351.SetCLK(SiChannel::RefLO2, HW::getIF1() - HW::getIF2(), Si5351C::PLL::B, Si5351C::DriveStrength::mA2);
Si5351.ResetPLL(Si5351C::PLL::B); Si5351.ResetPLL(Si5351C::PLL::B);
Si5351.WaitForLock(Si5351C::PLL::B, 10);
// Enable mixers/amplifier/PLLs // Enable mixers/amplifier/PLLs
FPGA::SetWindow(FPGA::Window::Kaiser); FPGA::SetWindow(FPGA::Window::Kaiser);
FPGA::Enable(FPGA::Periphery::Port1Mixer); FPGA::Enable(FPGA::Periphery::Port1Mixer);
@ -381,8 +383,9 @@ void VNA::SweepHalted() {
Si5351.WriteRawCLKConfig(SiChannel::RefLO2, IFTable[IFTableIndexCnt].clkconfig); Si5351.WriteRawCLKConfig(SiChannel::RefLO2, IFTable[IFTableIndexCnt].clkconfig);
Si5351.ResetPLL(Si5351C::PLL::B); Si5351.ResetPLL(Si5351C::PLL::B);
IFTableIndexCnt++; IFTableIndexCnt++;
Si5351.WaitForLock(Si5351C::PLL::B, 10);
// PLL reset causes the 2.LO to turn off briefly and then ramp on back, needs delay before next point // PLL reset causes the 2.LO to turn off briefly and then ramp on back, needs delay before next point
Delay::us(1300); Delay::us(1500);
} }
uint64_t frequency = getPointFrequency(pointCnt); uint64_t frequency = getPointFrequency(pointCnt);
int16_t power = settings.cdbm_excitation_start int16_t power = settings.cdbm_excitation_start
@ -408,7 +411,7 @@ void VNA::SweepHalted() {
if(lowbandDisabled && freqSuccess) { if(lowbandDisabled && freqSuccess) {
// frequency is valid, can enable lowband source now // frequency is valid, can enable lowband source now
Si5351.Enable(SiChannel::LowbandSource); Si5351.Enable(SiChannel::LowbandSource);
Delay::us(1300); Delay::ms(10);
lowbandDisabled = false; lowbandDisabled = false;
} }