我在进行CC1020校准时碰到一些问题,希望能得到大家的帮助:
1、 WriteToCC1020Register(CC1020_CALIBRATE,0xB4);开始校准,然后读取该寄存器的值ReadFromCC1020Register(CC1020_CALIBRATE);,读回来的值为34h,有时候也为B4h。是不是我写寄存器的bit[7]不成功?
2、 在校准开始之后,经过大于100us的延时,不停的读状态寄存器ReadFromCC1020Register(CC1020_STATUS),读到的值一般为86或84,反正一般读不到bit[4]=1的情况,即使有,也只是某一时刻bit[4]=1,之后又变回bit[4]=0。
3、 就算不停地一直在校准,也不会读到(ReadFromCC1020Register(CC1020_STATUS)&0x80)==0x80)然后(ReadFromCC1020Register(CC1020_STATUS)&0x10) == 0x10)的值,即不停地校准,也不能通过。
4、 如果不进行校准,会有什么影响?
5、 DCLK管脚一直为高电平,这是不是也是因为校准没有通过?如何使DCLK产生发送数据的时钟?
我的寄存器配置步骤都是按照swra067文档的例程来编写的,具体如下:
const char DefaultConfig433[32] =
{
0x0F, // 0x01, INTERFACE
0xFF, // 0x02, RESET
0x8F, // 0x03, SEQUENCING
0x3A, // 0x04, FREQ_2A
0x14, // 0x05, FREQ_1A
0x99, // 0x06, FREQ_0A
0x3A, // 0x07, CLOCK_A
0x3A, // 0x08, FREQ_2B
0x1F, // 0x09, FREQ_1B
0x45, // 0x0A, FREQ_0B
0x3A, // 0x0B, CLOCK_B
0x44, // 0x0C, VCO
0x51, // 0x0D, MODEM
0x9B, // 0x0E, DEVIATION
0xC6, // 0x0F, AFC_CONTROL
0x2F, // 0x10, FILTER
0x61, // 0x11, VGA1
0x55, // 0x12, VGA2
0x2F, // 0x13, VGA3
0x2D, // 0x14, VGA4
0x20, // 0x15, LOCK
0x78, // 0x16, FRONTEND
0x47, // 0x17, ANALOG, RX=47/TX=47
0x14, // 0x18, BUFF_SWING
0x22, // 0x19, BUFF_CURRENT
0xAE, // 0x1A, PLL_BW
0x34, // 0x1B, CALIBRATE
0xF0, // 0x1C, PA_POWER
0x00, // 0x1D, MATCH
0x00, // 0x1E, PHASE_COMP
0x00, // 0x1F, GAIN_COMP
0x00 // 0x20, POWERDOWN
};
校准函数:
char CalibrateCC1020(char PA_POWER)
{
volatile int TimeOutCounter;
volatile int nCalAttempt;
// Turn off PA to avoid spurs during calibration in TX mode
WriteToCC1020Register(CC1020_PA_POWER,0x00);
// Calibrate, and re-calibrate if necessary:
for (nCalAttempt = CAL_ATTEMPT_MAX; (nCalAttempt>0); nCalAttempt–) {
// Start calibration
WriteToCC1020Register(CC1020_CALIBRATE,0xB4);
// Monitor actual calibration start (ref. Errata Note 04 – CC1020)
for(TimeOutCounter=CAL_TIMEOUT;((ReadFromCC1020Register(CC1020_STATUS)&0x80)==0x80)&&(TimeOutCounter>0); TimeOutCounter–);
// Monitor calibration complete
for(TimeOutCounter=CAL_TIMEOUT;((ReadFromCC1020Register(CC1020_STATUS)&0x80)==0x00)&&(TimeOutCounter>0); TimeOutCounter–);
// Monitor lock
for(TimeOutCounter=LOCK_TIMEOUT;((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x00)&&(TimeOutCounter>0); TimeOutCounter–);
// Abort further recalibration attempts if successful LOCK
if((ReadFromCC1020Register(CC1020_STATUS)&0x10) == 0x10) {
break;
}
}
// Restore PA setting
WriteToCC1020Register(CC1020_PA_POWER, PA_POWER);
// Return state of LOCK_CONTINUOUS bit
return ((ReadFromCC1020Register(CC1020_STATUS)&0x10)==0x10);
}
主函数:
int main(void)
{
ResetCC1020();
SetupCC1020All();
WakeUpCC1020ToTX(TXANALOG);
if (!CalibrateCC1020(PA_POWER))
writestr ("TX Calibration failed");
非常希望能得到各位的帮助,谢谢!!
Nutcracker:
为啥还在用CC1020? 建议切到 CC1101 或 CC1120 上面来。
qin haiqiang:
回复 Nutcracker:
谢谢您的的答复,CC1020和CC1110最终都要用,现在先做CC1020。这几天调试,CC1020校准还是没有通过,DCLK一直没有时钟出来,恳请各位帮帮忙,谢谢!!