使用的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();
}
