各位TI的工程师们,你们好:
我的项目中CC1125不用于通信,只是作为一个本振使用,用于发射一个没有任何信号的载波频率,频率范围400M~480M,使用的是同步串行模式(Synchronous Serial Mode), 没有syns word(同步码)和preamble(前置码),也不发射数据,一直处于发射固定频率载波的状态下。
现在的问题是,由于项目中需要经常对CC1125进行频率改变,但发现CC1125的频率校准功能经常不成功,导致没有频率输出。
我的测试过程在TI的开发板和我们公司自己的电路板上都进行过。
1、开始时我把程序设置了CC1125从IDLE到TX自动校准功能,因此最早的频率改变程序是:
halSpiStrobe(CC1125_SIDLE); //空闲状态
halSpiWriteBurstReg(CC1125_FREQ2, freq, 3); //写频率
halSpiStrobe(CC1125_STX); //发射
多次改变输出频率,发现输出的频率以 成功—失败—成功—失败—成功—失败......的方式出现,也就是自动校准功能每间隔一次失败,并且无输出频率。
2、后来程序改成每次频率切换时都进行手动校准功能,频率改变程序为:
halSpiStrobe(CC1125_SIDLE); //空闲状态
halSpiWriteBurstReg(CC1125_FREQ2, freq, 3); //写频率
halSpiStrobe(CC1125_SCAL); //手动校准
do
{
halSpiReadReg(CC1125_MARCSTATE, &marcstate); //等待回到idle状态,校准完成
} while (marcstate != 0x41);
halSpiStrobe(CC1125_STX); //发射
依照上面的方式,虽然每次频率切换时校准都成功了,但是经测量,ti开发板的手动校准时间约等于1.9ms,而我们自己的电路板约等于2.5ms,跟CC1125数据手册里的0.4ms相差太大,无法满足我们的要求。
3、后来根据CC112x的errata note上的手动校准方法,以及用户指南10.3.2上的方法:
在每次系统启动时都预先对需要的频率进行过校准,并把校准值存起来,在改变频率时,写完频率寄存器值后,接着写入存起来的频率校准值,程序如下所示。
u8 marcstate;
halSpiStrobe(CC1125_SIDLE);
halSpiWriteBurstReg(CC1125_FREQ2, freq, 3);
halSpiWriteReg(CC1125_FS_VCO2, buff[0]); //写频率校准值
halSpiWriteReg(CC1125_FS_VCO4, buff[1]);
halSpiWriteReg(CC1125_FS_CHP, buff[2]);
do //等待芯片回到idle状态
{
halSpiReadReg(CC1125_MARCSTATE, &marcstate);
} while (marcstate != 0x41);
halSpiStrobe(CC1125_STX);
但写完频率校准值后,必须等待芯片回到idle状态(或者至少延时2.5ms),接着进行发射,才能发射载波成功。
如果不等待芯片回到idle状态,直接进行发射, 则情况跟第2种方法一样。
希望能够得到一些宝贵的建议。
谢谢了。