大家好、
在我的应用中、电池供电的应答器(从设备)应通过无线电与有线远程站(主设备)通信。 CC1201用作两侧的射频芯片。
为了能够以节能的方式工作、从器件应在发送每条消息后的大约500ms 内以监听模式运行、以便能够接收确认或命令。 主器件发送的前导码为30字节。
问题1.)
如何在从器件上设置监听模式、以便能够接收到每条消息?
当从发送模式更改为监听模式时、合成器(SCAL)和 RC 振荡器(WOR_CFG0.RC_MODE = 0x02)始终会进行校准。 合成器校准通常失败、因为未建立 marcstate "idle"。 相反、读取状态0x11 (RX_FIFO_ERROR)。
问题2.)
为什么校准不会运行而没有错误?
问题3.)
在某些情况下、主器件的回答是否太早?
寄存器设置(默认):
/* default register set */ CC1201_REG_ENTRY(PREAMBLE_CFG1 , 0x14), CC1201_REG_ENTRY(PREAMBLE_CFG0 , 0x8A), CC1201_REG_ENTRY(IQIC , 0xD8), CC1201_REG_ENTRY(CHAN_BW , 0x08), CC1201_REG_ENTRY(MDMCFG1 , 0x40), CC1201_REG_ENTRY(MDMCFG0 , 0x05), CC1201_REG_ENTRY(SYMBOL_RATE2 , 0xA4), CC1201_REG_ENTRY(SYMBOL_RATE1 , 0x7A), CC1201_REG_ENTRY(SYMBOL_RATE0 , 0xE1), CC1201_REG_ENTRY(AGC_REF , 0x2A), CC1201_REG_ENTRY(AGC_CS_THR , 0xF6), CC1201_REG_ENTRY(AGC_GAIN_ADJUST , 0x00), CC1201_REG_ENTRY(AGC_CFG3 , 0xB1), CC1201_REG_ENTRY(AGC_CFG2 , 0x20), CC1201_REG_ENTRY(AGC_CFG1 , 0x12), CC1201_REG_ENTRY(AGC_CFG0 , 0x80), CC1201_REG_ENTRY(FIFO_CFG , 0x00), CC1201_REG_ENTRY(DEV_ADDR , 0x00), CC1201_REG_ENTRY(SETTLING_CFG , 0x0B), CC1201_REG_ENTRY(FS_CFG , 0x12), CC1201_REG_ENTRY(WOR_CFG1 , 0x08), CC1201_REG_ENTRY(WOR_CFG0 , 0x21), CC1201_REG_ENTRY(WOR_EVENT0_MSB , 0x00), CC1201_REG_ENTRY(WOR_EVENT0_LSB , 0x00), CC1201_REG_ENTRY(RXDCM_TIME , 0x00), CC1201_REG_ENTRY(PKT_CFG2 , 0x00), CC1201_REG_ENTRY(PKT_CFG1 , 0x42), CC1201_REG_ENTRY(PKT_CFG0 , 0x20), CC1201_REG_ENTRY(RFEND_CFG1 , 0x0F), CC1201_REG_ENTRY(RFEND_CFG0 , 0x00),
在这里、我的当前代码:
void EnterSniffMode(void)
{
cc1201.timeoutCalib = false; // flag: calibration timeout
TimerStart(&TimeoutCalib, OnSignalTimeoutCalib, 10, TIMER_TYPE_ONESHOT, TIMER_CONTEXT_MAINLOOP);
cc1201.sniff_state = STATE_SNIFF_WAIT_CALIB_SYNTH;
/* set sniff-mode configuration */
SetRegisterValue(CC1201_REG_WOR_CFG0_RC_PD, 0);
SetRegisterValue(CC1201_REG_WOR_EVENT0_MSB_EVENT0_15_8, 0x00);
SetRegisterValue(CC1201_REG_WOR_EVENT0_LSB_EVENT0_7_0, 0x54);
SetRegisterValue(CC1201_REG_SETTLING_CFG_FS_AUTOCAL, 0);
SetRegisterValue(CC1201_REG_AGC_CS_THR_AGC_CS_TH, 8);
SetRegisterValue(CC1201_REG_AGC_CFG1_AGC_WIN_SIZE, 0);
SetRegisterValue(CC1201_REG_AGC_CFG1_AGC_SETTLE_WAIT, 0);
SetRegisterValue(CC1201_REG_RFEND_CFG0_TERM_ON_BAD_PACKET_EN, 1);
SetRegisterValue(CC1201_REG_RFEND_CFG0_ANT_DIV_RX_TERM_CFG, 1);
SetRegisterValue(CC1201_REG_FS_DIG1_FS_DIG1_RESERVED5_0, 7);
SetRegisterValue(CC1201_REG_FS_DSM1_FS_DSM1_RESERVED2_0, 2);
SetRegisterValue(CC1201_REG_FS_DVC1_FS_DVC1_RESERVED7_0, 0xF3);
SetRegisterValue(CC1201_REG_FS_DVC0_FS_DVC0_RESERVED4_0, 0x13);
SetRegisterValue(CC1201_REG_FS_VCO0_FS_VCO0_RESERVED7_0, 0xB8);
ChipConfigurate();
/* start calibration of synthesizer */
Cc1201Strobe(CC1201_STROBE_SCAL);
cc1201.sniff_state = STATE_SNIFF_WAIT_CALIB_SYNTH;
}
void ExecuteSniffMode(void)
{
switch (cc1201.sniff_state)
{
case STATE_SNIFF_WAIT_CALIB_SYNTH:
{
/* wait for calibration of synthesizer */
if (CheckMarcstate(CC1201_MARCSTATE_IDLE))
{
/* start calibration of rc osc (SWRA428A, page 6) */
uint8_t tmp = 0;
Cc1201Read(CC1201_REG_WOR_CFG0, &tmp, sizeof(tmp));
tmp &= ~(0x03 << Cc1201RegDescTab[CC1201_REG_WOR_CFG0_RC_MODE].pos); // RC_MODE = 0
tmp |= (0x02 << Cc1201RegDescTab[CC1201_REG_WOR_CFG0_RC_MODE].pos); // RC_MODE = 2
Cc1201Write(CC1201_REG_WOR_CFG0, &tmp, sizeof(tmp));
Cc1201Strobe(CC1201_STROBE_SIDLE);
tmp &= ~(0x03 << Cc1201RegDescTab[CC1201_REG_WOR_CFG0_RC_MODE].pos); // RC_MODE = 0
Cc1201Write(CC1201_REG_WOR_CFG0, &tmp, sizeof(tmp));
cc1201.sniff_state = STATE_SNIFF_WAIT_CALIB_RCOSC;
cc1201.timeoutCalib = 0;
TimerStart(&TimeoutCalib, OnSignalTimeoutCalib, 10, TIMER_TYPE_ONESHOT, TIMER_CONTEXT_MAINLOOP);
}
else if (cc1201.timeoutCalib)
{
/* ignore calibration */
/* **************************** */
/* this case enters very often! */
/* **************************** */
cc1201.timeoutCalib = 0;
TimerStart(&TimeoutCalib, OnSignalTimeoutCalib, 10, TIMER_TYPE_ONESHOT, TIMER_CONTEXT_MAINLOOP);
}
}
break;
case STATE_SNIFF_WAIT_CALIB_RCOSC:
{
/* wait for calibration of rc osc */
if (CheckMarcstate(CC1201_MARCSTATE_IDLE))
{
/* clear previous reception */
ClearEvent(CC1201_EVENT_RECEIVED);
/* start rx for sniff mode */
Cc1201Strobe(CC1201_STROBE_SWOR);
cc1201.sniff_state = STATE_SNIFF_WAIT_RX;
}
else if (cc1201.timeoutCalib)
{
/* ignore calibration */
Cc1201Strobe(CC1201_STROBE_SWOR);
cc1201.sniff_state = STATE_SNIFF_WAIT_RX;
}
}
break;
case STATE_SNIFF_WAIT_RX:
{
/* wait for reception */
if (Machine.EventMask & CC1201_EVENT_RECEIVED)
{
ClearEvent(CC1201_EVENT_RECEIVED);
HandleReception();
Cc1201Strobe(CC1201_STROBE_SCAL);
cc1201.sniff_state = STATE_SNIFF_WAIT_CALIB_SYNTH;
}
else if (cc1201.txqueue.busy)
{
// go to machine state STATE_SEND
}
}
}
}
有人可以帮帮我吗? 非常感谢

