CC1120芯片发射失锁 及发数据超时 导致通信严重不正常的问题描述 源代码及原理图已经附上
使用的CC1120工作频点范围为410M-480M,
接收电路及发射功放电路分离式,未使用T/RX SW芯片管脚,此管脚外部上拉。
频率切换方式为将芯片复位,更改寄存器基本配置中频率设置寄存器,然后将芯片寄存器全部初始化,
遇到的问题如下:
1.若芯片工作在410M-420M之间或460M-480M之间时,使用频谱仪观察发的射频信号,信号处于失锁状态,在510M频率附近失锁震荡,且频谱仪观察范围很宽。
2.发送模式采用FIFO模式,波特率为9600,2GFSK,帧格式为PRE + SYN + RAW DATA,一包RAW DATA为96bytes,理论发射时间为87ms;设置发射超时为200ms,会出现发数据超时的现象(无GDO发射完成的反馈)。
3.一旦遇到发超时后,更改任何频点,cc1120仍然工作异常,发送数据始终超时,
4.若遇到问题3描述的情况,将cc1120在455M频点下断电——上电初始化,芯片又可以恢复正常工作。虽然每次频率切换时均对芯片进行了复位,但只有将芯片断电重启才能够恢复正常。
请问如何更改寄存器配置或者硬件连接方式解决此问题?很急很关键!
具体CC120相关连接原理图连接如下(如果图片不清晰 附加中有PDF格式):
CC1120芯片初始化及频点设置、数据发送程序如下
typedef struct
{
U16 addr;
U8 data;
}cc112x_reg;
const cc112x_reg cc112x_reg_4800[]=
{
{IOCFG3, 0xB0},
{IOCFG2, 0x06},
{IOCFG1, 0xB0},
{IOCFG0, 0x06},
{SYNC3, 0xD3},
{SYNC2, 0x91},
{SYNC1, 0xD3},
{SYNC0, 0x91},
{SYNC_CFG1, 0x0B},
{DEVIATION_M, 0x06},
{MODCFG_DEV_E, 0x0B},
{DCFILT_CFG, 0x1C},
{PREAMBLE_CFG1, 0x18},
{FREQ_IF_CFG, 0x40},
{IQIC, 0xC6},
{CHAN_BW, 0x08},
{MDMCFG0, 0x05},
{SYMBOL_RATE2, 0x73},
{SYMBOL_RATE1, 0xA9},
{SYMBOL_RATE0, 0x2A},
{AGC_REF, 0x20},
{AGC_CS_THR, 0x19},
{AGC_CFG1, 0xA9},
{AGC_CFG0, 0xCF},
{FIFO_CFG, 0x00},
{SETTLING_CFG, 0x0B},
{FS_CFG, 0x14},
// {WOR_CFG0, 0x20},
// {WOR_EVENT0_LSB, 0xBA},
{PKT_CFG2, 0x04},
{PKT_CFG1, 0x00},
{PKT_CFG0, 0x00},
{PA_CFG2, 0x70},
{PA_CFG1, 0x56},
{PA_CFG0, 0x7C},
{PKT_LEN, 0xFF},
{IF_MIX_CFG, 0x00},
{FREQOFF_CFG, 0x22},
{FREQ2, 0x70},
{FREQ1, 0x80},
{FREQ0, 0x00},
{FS_DIG1, 0x00},
{FS_DIG0, 0x5F},
{FS_CAL1, 0x40},
{FS_CAL0, 0x0E},
{FS_divTWO, 0x03},
{FS_DSM0, 0x33},
{FS_DVC0, 0x17},
{FS_PFD, 0x50},
{FS_PRE, 0x6E},
{FS_REG_div_CML, 0x14},
{FS_SPARE, 0xAC},
{FS_VCO0, 0xB4},
{XOSC5, 0x0E},
{XOSC3, 0x03},
{XOSC1, 0x03},
};
#define RF_WAIT_RES 1
/*******************************************************************************
* 名称 : RF_CC112x_SetSingleCmd
* 描述 : 单命令发送
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_SetSingleCmd(U8 cmd)
{
//U8 ucTemp;
RF_CS_LOW();
// ucTemp = RF_MISO_VAL();
#if RF_WAIT_RES
while(RF_MISO_VAL() == 1);
#endif
RF_SPI_SendByte(cmd);
RF_CS_HIGH();
}
/*******************************************************************************
* 名称 : RF_CC112x_SetBurstCmd
* 描述 : 向指定地址发送多条命令
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_SetBurstCmd(U16 addr, U8 *pcmd, U16 cmdlen)
{
U16 i;
U8 ucAddr;
ucAddr = (U8)(addr & 0x3F);
RF_CS_LOW();
#if RF_WAIT_RES
while(RF_MISO_VAL() == 1);
#endif
RF_SPI_SendByte(0x40 | ucAddr);
for (i = 0; i < cmdlen; i++)
{
RF_SPI_SendByte(*pcmd++);
}
RF_CS_HIGH();
}
/*******************************************************************************
* 名称 : RF_CC112x_ReadBurstCmd
* 描述 : 从指定地址读取多条命令
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_ReadBurstCmd(U16 addr, U8 *pcmd, U16 cmdlen)
{
U16 i;
U8 ucAddr;
ucAddr = (U8)(addr & 0x3F);
RF_CS_LOW();
#if RF_WAIT_RES
while(RF_MISO_VAL() == 1);
#endif
RF_SPI_SendByte(0xC0 | ucAddr);
for (i = 0; i < cmdlen; i++)
{
*pcmd++ = RF_SPI_SendByte(0);
}
RF_CS_HIGH();
}
/*******************************************************************************
* 名称 : RF_CC112x_SetExtBurstCmd
* 描述 : 向扩展地址发送多条命令
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_SetExtBurstCmd(U16 addr, U8 *pcmd, U16 cmdlen)
{
U16 i;
U8 ucAddr;
ucAddr = (U8)(addr & 0xFF);
RF_CS_LOW();
#if RF_WAIT_RES
while(RF_MISO_VAL() == 1);
#endif
RF_SPI_SendByte(0x40 | 0x2F);
RF_SPI_SendByte(ucAddr);
for (i = 0; i < cmdlen; i++)
{
RF_SPI_SendByte(*pcmd++);
}
RF_CS_HIGH();
}
/*******************************************************************************
* 名称 : RF_CC112x_ReadExtBurstCmd
* 描述 : 从扩展地址读取多条命令
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_ReadExtBurstCmd(U16 addr, U8 *pcmd, U16 cmdlen)
{
U16 i;
U8 ucAddr;
ucAddr = (U8)(addr & 0xFF);
RF_CS_LOW();
#if RF_WAIT_RES
while(RF_MISO_VAL() == 1);
#endif
RF_SPI_SendByte(0xC0 | 0x2F);
RF_SPI_SendByte(ucAddr);
for (i = 0; i < cmdlen; i++)
{
*pcmd++ = RF_SPI_SendByte(0);
}
RF_CS_HIGH();
}
/*******************************************************************************
* 名称 : RF_CC112x_SetCmd
* 描述 : 向指定地址发送命令
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_SetCmd(U16 addr, U8 cmd)
{
U8 ucAddr;
//U8 ucTemp;
ucAddr = (U8)(addr & 0xFF);
RF_CS_LOW();
//ucTemp = RF_MISO_VAL();
#if RF_WAIT_RES
while(RF_MISO_VAL() == 1);
#endif
RF_SPI_SendByte(ucAddr);
RF_SPI_SendByte(cmd);
RF_CS_HIGH();
}
/*******************************************************************************
* 名称 : RF_CC112x_ReadCmd
* 描述 : 从指定地址读取多条命令
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_ReadCmd(U16 addr, U8 *pcmd)
{
U8 ucAddr;
ucAddr = (U8)(addr & 0xFF);
RF_CS_LOW();
#if RF_WAIT_RES
while(RF_MISO_VAL() == 1);
#endif
RF_SPI_SendByte(0x80 | ucAddr);
*pcmd = RF_SPI_SendByte(0);
RF_CS_HIGH();
}
/*******************************************************************************
* 名称 : RF_CC112x_SetExtCmd
* 描述 : 向扩展地址发送命令
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_SetExtCmd(U16 addr, U8 cmd)
{
U8 ucAddr;
ucAddr = (U8)(addr & 0xFF);
RF_CS_LOW();
#if RF_WAIT_RES
while(RF_MISO_VAL() == 1);
#endif
RF_SPI_SendByte(0x2F);
RF_SPI_SendByte(ucAddr);
RF_SPI_SendByte(cmd);
RF_CS_HIGH();
}
/*******************************************************************************
* 名称 : RF_CC112x_ReadExtCmd
* 描述 : 从扩展地址读取命令
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_ReadExtCmd(U16 addr, U8 *pcmd)
{
U8 ucAddr;
ucAddr = (U8)(addr & 0xFF);
RF_CS_LOW();
#if RF_WAIT_RES
while(RF_MISO_VAL() == 1);
#endif
RF_SPI_SendByte(0x80 | 0x2F);
RF_SPI_SendByte(ucAddr);
*pcmd = RF_SPI_SendByte(0);
RF_CS_HIGH();
}
/*******************************************************************************
* 名称 : RF_CC112x_Reset
* 描述 : CC112x 复位
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Reset(void)
{
RF_CC112x_SetSingleCmd(SRES);
//RF_RST_LOW();
//Delay_ms(1);
//RF_RST_HIGH();
Delay_ms(5);
}
/*******************************************************************************
* 名称 : RF_CC112x_Fifo_Byte
* 描述 : FIFO中填入1byte
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Fifo_Byte(U8 byte)
{
RF_CC112x_SetCmd(TXFIFO, byte);
}
/*******************************************************************************
* 名称 : RF_SetTx
* 描述 : 设置为发射状态
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_SetTx(void)
{
RF_GDO0_Int_Disable();
RF_RX_POWER_DISABLE;
RF_TX_POWER_ENABLE;
RF_PA_SetVal(guiPA_Val);
RF_PA_CTL_ENABLE;
/* Change state to TX, initiating */
RF_CC112x_SetSingleCmd(SFRX);
// RF_CC112x_SetSingleCmd(SFTX);
RF_CC112x_SetSingleCmd(STX);
}
/*******************************************************************************
* 名称 : RF_SetRx
* 描述 : 设置为接收状态
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_SetRx(void)
{
RF_TX_POWER_DISABLE;
RF_PA_CTL_DISABLE;
RF_PA_SetVal(0);
RF_RX_POWER_ENABLE;
/* Strobe RX to initiate the recieve chain */
RF_CC112x_SetSingleCmd(SFRX);
RF_CC112x_SetSingleCmd(SFTX);
RF_CC112x_SetSingleCmd(SRX);
RF_GDO0_Int_Enable();
}
/*******************************************************************************
* 名称 : RF_SetIDLE
* 描述 : 设置为空闲
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_SetIDLE(void)
{
RF_GDO0_Int_Disable();
RF_RX_POWER_DISABLE;
RF_TX_POWER_DISABLE;;
RF_PA_SetVal(0);
RF_PA_CTL_DISABLE;
/* Flush the FIFO's */
RF_CC112x_SetSingleCmd(SFRX);
RF_CC112x_SetSingleCmd(SFTX);
/* Force transciever idle state */
RF_CC112x_SetSingleCmd(SIDLE);
}
/*******************************************************************************
* 名称 : RF_CC112x_Rcv_On
* 描述 : 设置cc112x进入接收状态
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Rcv_On(void)
{
RF_SetRx();
}
/*******************************************************************************
* 名称 : RF_CC112x_Set_PacketLen
* 描述 : 设置接收或者发送长度
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Set_PacketLen(U8 ucLen)
{
U8 regs_uint8;
/* disable FIFO mode*/
regs_uint8 = 0x46;
RF_CC112x_SetCmd(MDMCFG1, regs_uint8);
/* disable FIFO mode*/
regs_uint8 = 0x05;
RF_CC112x_SetCmd(MDMCFG0, regs_uint8);
/* configure set_rf_packet_length */
regs_uint8 = ucLen;
RF_CC112x_SetCmd(PKT_LEN, regs_uint8);
/* configure set_rf_packet_lengthe */
regs_uint8 = 0x04;
RF_CC112x_SetCmd(PKT_CFG2, regs_uint8);
regs_uint8 = 0x00;
RF_CC112x_SetCmd(PKT_CFG0, regs_uint8);
}
/*******************************************************************************
* 名称 : RF_CC112x_Wait_TxEnd
* 描述 : 数据接收
* 输入 : ucTimeOut:超时时间 0:无超时
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Wait_TxEnd(U8 ucTimeOut)
{
U16 i;
U8 reg_status;
U8 ucGDO_Val;
/* check that we are still in RX mode before entering wait for RX end */
RF_CC112x_ReadExtCmd(MARCSTATE, ®_status);
/* filter out only the status section of the register values */
reg_status = (reg_status & 0x1F);
// OSTimeDlyHMSM(0, 0, 0, 10);
gucLastGDO_Sta = 0;
/* check for not idle mode */
if(!(reg_status == MARCSTATE_IDLE))
{
if (ucTimeOut == 0)
{
while (1)
{
OSTimeDlyHMSM(0, 0, 0, 5);
ucGDO_Val = RF_GDO0_VALUE();
if ((gucLastGDO_Sta == 1) && (ucGDO_Val == 0))
{
//OSTimeDlyHMSM(0, 0, 0, 10);
break;
}
gucLastGDO_Sta = ucGDO_Val;
}
}
else
{
for (i = 0; i < ucTimeOut; i++)
{
OSTimeDlyHMSM(0, 0, 0, 5);
ucGDO_Val = RF_GDO0_VALUE();
if ((gucLastGDO_Sta == 1) && (ucGDO_Val == 0))
{
//OSTimeDlyHMSM(0, 0, 0, 10);
break;
}
gucLastGDO_Sta = ucGDO_Val;
}
}
}
}
/*******************************************************************************
* 名称 : RF_CC112x_Reg_Init
* 描述 : CC112x寄存器初始化
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Reg_PreInit(void)
{
U16 size;
size = sizeof(cc112x_reg_4800);
memcpy(cc112x_reg_buf, cc112x_reg_4800, size);
}
/*******************************************************************************
* 名称 : RF_CC112x_Reg_Init
* 描述 : CC112x寄存器初始化
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Reg_Init(void)
{
U16 i;
U16 uiLen;
U8 ucTemp;
U16 size;
size = sizeof(cc112x_reg_4800);
uiLen = size/sizeof(cc112x_reg);
for (i = 0; i < uiLen; i++)
{
if (cc112x_reg_buf[i].addr < 0x2F)
{
RF_CC112x_SetCmd(cc112x_reg_buf[i].addr, cc112x_reg_buf[i].data);
}
else
{
RF_CC112x_SetExtCmd(cc112x_reg_buf[i].addr, cc112x_reg_buf[i].data);
}
}
RF_CC112x_ReadCmd(IOCFG3, &ucTemp);
RF_CC112x_Set_PacketLen(RF_PACKET_LEN);
}
/*******************************************************************************
* 名称 : RF_Init
* 描述 : 射频模块相关驱动初始化
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_Init(void)
{
//接口初始化
RF_Port_inita();
//模块复位
RF_CC112x_Reset();
RF_CC112x_Reg_PreInit();
//寄存器初始化
RF_CC112x_Reg_Init();
//外部中断初始化
RF_GDO0_inita();
//设置空闲状态
RF_SetIDLE();
Delay_ms(2);
//设置接收状态
RF_SetRx();
}
/*******************************************************************************
* 名称 : RF_CC112x_Cal_Freq
* 描述 : 计算频率
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
U32 RF_CC112x_Cal_Freq(U32 freq)
{
U32 freq_regs_uint32;
double f_vco;
f_vco = (double)freq * 256;
f_vco = f_vco / 15625;
freq_regs_uint32 = (uint32) (f_vco + 0.5);
return freq_regs_uint32;
}
/*******************************************************************************
* 名称 : RF_CC112x_Set_Freq
* 描述 : 设置频率
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Set_Freq(U32 freq_regs_uint32)
{
// U8 freq_regs[3];
// U8 temp_regs[3];
// U32 freq_regs_uint32;
//U32 f_vco;
// double f_vco;
//设置IDLE状态
RF_SetIDLE();
// OSTimeDlyHMSM(0, 0, 0, 5);
/* return the frequency word */
cc112x_reg_buf[38].data = ((uint8*)&freq_regs_uint32)[0];
cc112x_reg_buf[37].data = ((uint8*)&freq_regs_uint32)[1];
cc112x_reg_buf[36].data = ((uint8*)&freq_regs_uint32)[2];
RF_CC112x_Reset();
RF_CC112x_Reg_Init();
/* write the frequency word to the transciever */
//RF_CC112x_SetExtBurstCmd(FREQ2, freq_regs, 3);
//RF_CC112x_ReadExtCmd(FREQ2, &temp_regs[2]);
//RF_CC112x_ReadExtCmd(FREQ1, &temp_regs[1]);
//RF_CC112x_ReadExtCmd(FREQ0, &temp_regs[0]);
//RF_CC112x_ReadExtBurstCmd(FREQ2,temp_regs, 3);
// OSTimeDlyHMSM(0, 0, 0, 5);
//设置接收状态
// RF_SetRx();
// RF_CC112x_SetSingleCmd(SRX);
// OSTimeDlyHMSM(0, 0, 0, 5);
// Delay_ms(2);
/* Force transciever idle state */
// RF_CC112x_SetSingleCmd(SIDLE);
// /* write the frequency word to the transciever */
// RF_CC112x_SetExtBurstCmd(FREQ2, freq_regs, 3);
//
// OSTimeDlyHMSM(0, 0, 0, 5);
Delay_ms(2);
//设置接收状态
RF_SetRx();
// OSTimeDlyHMSM(0, 0, 0, 5);
}
/*******************************************************************************
* 名称 : RF_CC112x_Tran_Data
* 描述 : 发射调制数据
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Tran_Data(U8 *pData, U16 uiLen)
{
//关闭外部中断
// RF_SetIDLE();
//Delay_ms(2);
// OSTimeDlyHMSM(0, 0, 0, 5);
// RF_CC112x_Set_PacketLen(uiLen);
/* Write packet to TX FIFO */
RF_CC112x_SetBurstCmd(TXFIFO, pData, uiLen);
// OSTimeDlyHMSM(0, 0, 0, 5);
// Delay_ms(2);
//设置发射状态
RF_SetTx();
//等待发射结束
RF_CC112x_Wait_TxEnd(RF_TX_TIMEOUT);
//设置接收状态
RF_SetRx();
}
/*******************************************************************************
* 名称 : RF_CC112x_Rcv_Data
* 描述 : 数据接收
* 输入 : pData:待接收数据
* 输出 : 无
* 返回 : 数据长度
*******************************************************************************/
U16 RF_CC112x_Rcv_Data(U8 *pData)
{
U8 pktLen;
/* Read number of bytes in RX FIFO */
RF_CC112x_ReadExtCmd(NUM_RXBYTES, &pktLen);
pktLen = pktLen & 0x7F;
/* make sure the packet size is appropriate, that is 1 -> buffer_size */
if ((pktLen != 0) && (pktLen <= RF_PACKET_LEN))
{
/* retrieve the FIFO content */
RF_CC112x_ReadBurstCmd(RXFIFO, pData, pktLen);
//RF_SetRx();
/* Strobe RX to initiate the recieve chain */
RF_CC112x_SetSingleCmd(SFRX);
RF_CC112x_SetSingleCmd(SFTX);
RF_CC112x_SetSingleCmd(SRX);
//RF_GDO0_Int_Enable();
}
else
{
/* if the length returned by the transciever does not make sense, flush it */
pktLen = 0; // Return 0 indicating a failure
RF_CC112x_SetSingleCmd(SFRX); // Flush RXFIFO
}
/* return status information, CRC OK or NOT OK */
return (pktLen);
}
/*******************************************************************************
* 名称 : RF_CC112x_Tran_Carrier
* 描述 : 设置进入载波发射状态
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Tran_Carrier(void)
{
U8 regs_uint8;
RF_SetIDLE();
//Delay_ms(2);
// OSTimeDlyHMSM(0, 0, 0, 5);
/* disable FIFO mode*/
regs_uint8 = 0x06;
RF_CC112x_SetCmd(MDMCFG1, regs_uint8);
/* configure continuous mode*/
RF_CC112x_ReadCmd(PA_CFG2, ®s_uint8);
regs_uint8 = regs_uint8 | 0x40;
RF_CC112x_SetCmd(PA_CFG2, regs_uint8);
/* configure set_tx_modulated_test_mode */
regs_uint8 = 0x06;
RF_CC112x_SetCmd(PKT_CFG2, regs_uint8);
regs_uint8 = 0x40;
RF_CC112x_SetCmd(PKT_CFG0, regs_uint8);
/* disable the modulator */
regs_uint8 = 0x01;
RF_CC112x_SetExtCmd(CFM_DATA_CFG, regs_uint8);
RF_CC112x_Fifo_Byte(0xFF);
RF_SetTx();
}
/*******************************************************************************
* 名称 : RF_CC112x_Tran_noMCU
* 描述 : 设置进入发射cc112x内部调制数据
* 输入 : 无
* 输出 : 无
* 返回 : 无
*******************************************************************************/
void RF_CC112x_Tran_noMCU(void)
{
U8 regs_uint8;
RF_SetIDLE();
//Delay_ms(2);
// OSTimeDlyHMSM(0, 0, 0, 5);
/* disable FIFO mode*/
regs_uint8 = 0x46;
RF_CC112x_SetCmd(MDMCFG1, regs_uint8);
/* disable FIFO mode*/
regs_uint8 = 0x05;
RF_CC112x_SetCmd(MDMCFG0, regs_uint8);
/* configure set_tx_modulated_test_mode */
regs_uint8 = 0x06;
RF_CC112x_SetCmd(PKT_CFG2, regs_uint8);
regs_uint8 = 0x40;
RF_CC112x_SetCmd(PKT_CFG0, regs_uint8);
/* enable the modulator */
regs_uint8 = 0x00;
RF_CC112x_SetExtCmd(CFM_DATA_CFG, regs_uint8);
/* load a random byte into the FIFO, this causes the modulator to start */
RF_CC112x_SetCmd(TXFIFO, regs_uint8);
RF_CC112x_Fifo_Byte(0xFF);
RF_SetTx();
}
看上去应该是频率校准的问题。在CC1120的勘误表,说了:
Suggested Workaround For the CC1120, CC1121, CC1125, and CC1175 devices with the PARTVERSION register equal to 0x21, two manual calibrations must be performed as shown in the flow diagram Figure 1-1. The software implementation is shown in Figure 1-2. For CC1120, CC1121, CC1125, and CC1175 with the PARTVERSION register equal to 0x23, the VCO calibration issue is corrected. These devices can be calibrated using one manual calibration option (using SCAL), and the three automatic calibration options that are controlled by the SETTLING_CFG.FS_AUTOCAL setting, which is explained in the CC112x/CC1175 User’s Guide (SWRU295). Applications using the workaround calibration procedure required for PARTVERSION 0x21 can safely continue to use the workaround procedure with PARTVERSION 0x23 or higher.
你可以看看是不是这个问题,还有T/RX SW芯片管脚 如果不按参考设计连接,悬空对接收是会有些问题的。