文档章节

CC1101 使用过程中遇到的问题汇总如下: (未完待续)

Jr小王子
 Jr小王子
发布于 2014/04/21 11:48
字数 1766
阅读 6888
收藏 1

CC1101 使用过程中遇到的问题汇总如下:                       (未完待续)


PS:TI的东西真心垃圾,就是相关的配套pdf和辅助调试软件很完整,

         这个非常重要,不然。。。   

         好多问题已经忘记。。。  慢慢回忆中


1. 

此问题隐藏多年,隐蔽性极大,巨难查找,如果你不是上了点年纪且用过以前51内核的问题芯片的工程师,你很难知道原因。

经常在客户那里RF死掉了,拿回来测试又是好的,问题往往被忽略。   电容放电完(0V),再重新上电又是正常的。

产生过程: 

 CC1101 无线模块+PA 的发射功率比较大,在外部加上1000uf的大电容以缓冲功耗带来的电平波动,但同时大电容在放电结束时间缓慢(特别是放电曲线的后半段)。当RF的电平进入特定的死区电平(可能 0.3-0.7),此时重新上电RF会死机且无法通过初始化(初始化程序没有配置全部的寄存器,有部分使用默认值)来重新唤起工作。


原因:

没有配置默认值的寄存器在上述过程中会发生改变,而上电的程序又没有全部配置所有的寄存器,被改变的寄存器没有得到修正。


解决方法: 

<1> 短接RF模块 VCC 、 GND 充分将电容进行放电。

<2> 在上电初始化代码中配置所有的寄存器,完全初始化。 


代码例示:

其他以前的配置

。。。。。。。


//-----------------------------以下值是复位值也必须赋值,不然模块上下电会出现不通讯 

{TI_CCxxx0_IOCFG1, 0x2e},       //新增配置   
{TI_CCxxx0_FIFOTHR, 0x47}, 
{TI_CCxxx0_MCSM2, 0x07}, 
{TI_CCxxx0_WOREVT1, 0x87}, 
{TI_CCxxx0_WOREVT0, 0X6B}, 
{TI_CCxxx0_WORCTRL, 0xFB}, 
{TI_CCxxx0_RCCTRL1, 0x41}, 
{TI_CCxxx0_RCCTRL0, 0x00}, 
{TI_CCxxx0_PTEST, 0x7F}, 

{TI_CCxxx0_AGCTEST, 0x3F}, 



2.

在SPI的速度很高的时候,SPI连接的IO口上加有上拉电阻的话可能会影响SPI的通讯。


原因:加了上拉电阻,上升沿的爬坡速度是有个斜率,下降沿也是。爬升的速度不够快,下降的速度不够快都会影响SPI的通讯。


解决方法:

<1>  调整上拉电阻,以提高爬坡和下降的速度。



3.

在CC1101交互通信中,能显示表地址,但不能抄读回电能或其他数据。


(1)  原因: CC1101模块在交互通信距离很短时(1m以内),当sender发射功率很大 15 dBm以上,receive接收处于饱和状态,造成接收不成功。

类似于sender喊得很大声,超过recevie听力接受程度,造成暂时性耳聋。(炸弹爆炸,后人暂时失聪)


(2)  原因: CC1101模块在进入sleep后,重新恢复IDLE,功率配置表会丢失,只保留配置表的第一个发送功率。详情参考CC1101 用户手册


(3)  原因: 万高的51内核的单片机Flash扩展后,code区地址复用。具体详见万高 9401A  data sheet  user‘s guide



(1)  解决方法:

<1>  recevie返回数据的时候,发送功率使用弱发送(发射功率3dBm、5dBm或者10dBm)和强发送(17dBm或者更大)交替搭配切换发送的方式。  


代码例示

void RFProcess(void)

{

    uint8 Length; //RF 帧长度

   

    if (!RX_FIG) //判断接收标志

        return;

       

    RX_FIG = 0;

   

    Disable_ExtInt(); //关闭 接收 IRQ中断

    memset(RX_buff, 0, sizeof(RX_buff));

    memset(TX_buff, 0, sizeof(TX_buff));

    RFWaitSendFlag = 0;

    SpiWriteStrobe(SIDLE); //手动切换待机

    Length = SpiReadStatus(RXBYTES) & NUM_RXBYTES;

    if (RF_frame_length == Length)

    {

         SpiReadBurstReg(RXFIFO, RX_buff, RF_frame_length); //读取buff data

         if (RX_buff[CRC_POSITION] & RF_CRC_OK)

         {

              RF_OneHourcnt = ONEDAYTIME; //接收到完整一帧赋初值

             //DisplayCOM(); 显示通信符 三相表无此功能

              RFReceiveMessage();

         }

         

         if (RFWaitSendFlag)

         {

              RFWaitSendFlag = 0;

              RFSendData();

              PublicDelayMs(8); //为了延时发送

              RFSendData();

              PublicDelayMs(3);

#ifdef RF_MASH

              SpiWriteReg(FREND0,0x12);//弱发送      

              RFSendData();

              PublicDelayMs(3);

              SpiWriteReg(FREND0,0x17);//强发送

#endif

         }

    }

    enable_RF_RX(); // 重启接收

    RFExtInt_Init(); // 重启RF 接收中断

   

}



(2)  解决方法:

<1> CC1101恢复IDLE模式后,重新 初始化 功率配置表。

<2> CC1101配置sleep 模式后,再次 初始化 功率配置表。


代码例示:

(2) ---- <1>

void CC1101_Sleep(void)

{

     Disable_ExtInt(); //关闭 接收 IRQ中断

     EXTI_ClrIntFlag(EXTI_CH13);

     SpiWriteStrobe(SIDLE);

     SpiWriteStrobe(SPWD);

     SetUpCC1101PATABLE();  //init 功率配置表

     RX_FIG = 0; //此句防止 写SPWD之前 RX_FIG标志被置位


<2> ----- <2>       

void enable_RF_RX(void)

{

    SpiWriteStrobe(SIDLE);

    SetUpCC1101PATABLE();  //init 功率配置表  

    SpiWriteStrobe(SFRX); // 清cc1100接收buffer

    SpiWriteStrobe(SRX); // 置为接收状态

    EXTI_ClrIntFlag(EXTI_CH13);

    RFExtInt_Init(); // 重启RF 接收中断

}


(3) 解决方法:

为解决前原代码:

const uint8 PA_TABLE[8]= {0x00,0x12,0x0e,0x34,0x60,0xc5,0xc1,0xc0}; //ybz !!! const


void SetCC1101TxPower(uint8 value)

{

    SpiWriteReg(FREND0,value); //选择最大功率,

}


修改后代码

const uint8 PA_TABLE[8]= {0x00,0x12,0x0e,0x34,0x60,0xc5,0xc1,0xc0}; //ybz !!! const


void SetUpCC1101PATABLE(void)

{

     uint8 *temp = 0;

     MemCpy(temp,PA_TABLE, sizeof(PA_TABLE));

     SpiWriteBurstReg(PATABLE, temp, 8); //设置功率表 ybz!!! (uint8 *)PA_TABLEPA_TABLE

}



4.

电表在低压时RF进入sleep模式,维持低压,RF定期初始化之后,RF模式从 sleep 改变为 RX。


原因: 通常GDO2的电平起落变化时是用于指示 TX、RX 数据帧   完成,以此来触发一个IRQ,并通过IRQ服务程序中置起的RF_RX_fig标志来进入RX数据帧处理程序。  CC1101 上电初始化的时候 GDO2会有一个电平起落的变化  ___|ˉˉˉˉˉˉˉ|____ (跟GDO2 IO 配置功能有关系,这个GDO2的电平变化如果没有经过处理,会触发IRQ中断,被误认为是GDO2 RX、TX  IRQ,进而进入RX数据帧处理程序,影响正常的程序逻辑。 

       SPI_byte(SRES);     //reset chip   注意!!!  这个语句会造成 GDO2 有一个_|—|_ 电平变化


解决方法:

<1>  在进行RF初始化之前,先关闭RF IRQ中断,初始化完成后在开启RF  IRQ中断。


代码例示:

void RF_init_config(void)

{

    Vol_low = 1; //上电 、 低功耗 初始化

    RF_OneHourcnt = ONEDAYTIME; //定时 init RF 变量复位

    RX_FIG = 0;

    memset(ReadMeterSerialNumber,0,8);

   

    Disable_ExtInt(); //关闭 RF IRQ中断

   

    RF_IO_Init();

    RFReset();

    RFSet(); //RF reg config

   

    //set TX power

    SetUpCC1101PATABLE(); //设置功率表

    SetCC1101TxPower(TXPOWERELEVEL7); //选择最大功率

   

    CC1101_Sleep(); //

}


void RFProcess(void)

{

    uint8 Length; //RF 帧长度

   

    if (!RX_FIG) //判断接收标志

        return;

       

    RX_FIG = 0;

   

    Disable_ExtInt(); //关闭 接收 IRQ中断

    memset(RX_buff, 0, sizeof(RX_buff));

    memset(TX_buff, 0, sizeof(TX_buff));

    RFWaitSendFlag = 0;

    SpiWriteStrobe(SIDLE); //手动切换待机

    Length = SpiReadStatus(RXBYTES) & NUM_RXBYTES;

    if (RF_frame_length == Length)

    {

         SpiReadBurstReg(RXFIFO, RX_buff, RF_frame_length); //读取buff data

         if (RX_buff[CRC_POSITION] & RF_CRC_OK)

         {

              RF_OneHourcnt = ONEDAYTIME; //接收到完整一帧赋初值

             //DisplayCOM(); 显示通信符 三相表无此功能

              RFReceiveMessage();

         }

         

         if (RFWaitSendFlag)

         {

              RFWaitSendFlag = 0;

              RFSendData();

              PublicDelayMs(8); //为了延时发送

              RFSendData();

              PublicDelayMs(3);

#ifdef RF_MASH

              SpiWriteReg(FREND0,0x12);//弱发送

              RFSendData();

              PublicDelayMs(3);

              SpiWriteReg(FREND0,0x17);//强发送

#endif

         }

    }

    enable_RF_RX(); // 重启接收

    RFExtInt_Init(); // 重启RF 接收中断

}

5.
 CC1101外加PA时,在操控PA控制引脚时需注意电平关系,避免HH电平关系(利尔达带PA的CC1101模块禁止次电平关系),

 此外PA控制引脚需要预留电平爬升时间,一般IO直接控制需要至少200us(保守2ms),如果上拉方式控制需示波器实际测量

 爬升时间(利尔达PA模块爬升时间约为5ms),此爬升时间与模块内部的电解电容和上拉电阻的阻值有关系。

PA_EN;
delayUs(200);      //IO直接控制
//delayMs(5);     //上拉方式
SpiWriteStrobe(STX);

© 著作权归作者所有

Jr小王子
粉丝 11
博文 119
码字总数 18368
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

Jr小王子
Jr小王子 博主

引用来自“PengMei”的评论

没有接触过的领域,从百度百科上摘下的一段,才知道是通信方面的。。。21
CC11011是一款低于1GHz设计旨在用于极低功耗RF应用。其主要针对工业、科研和医疗(ISM)以及短距离无线通信设备(SRD)。CC1101可提供对数据包处理、数据缓冲、突发传输、接收信号强度指示(RSSI)、空闲信道评估(CCA)、链路质量指示以及无线唤醒(WOR)的广泛硬件支持。CC1101在代码、封装和外引脚方面均与CC1100兼容,可用于全球最为常用的开放式低于1GHz频率的RF设计
一般跟硬件相关的都是CSDN,pudn之类的网站,这里少。
PengMei
PengMei
没有接触过的领域,从百度百科上摘下的一段,才知道是通信方面的。。。21
CC11011是一款低于1GHz设计旨在用于极低功耗RF应用。其主要针对工业、科研和医疗(ISM)以及短距离无线通信设备(SRD)。CC1101可提供对数据包处理、数据缓冲、突发传输、接收信号强度指示(RSSI)、空闲信道评估(CCA)、链路质量指示以及无线唤醒(WOR)的广泛硬件支持。CC1101在代码、封装和外引脚方面均与CC1100兼容,可用于全球最为常用的开放式低于1GHz频率的RF设计
Arduino 与无线模块 CC1101

总结一下无线模块调试的体会。Arduino上已经有人做了这个模块的库了,但是自己根据手册写的也有一定的参考意义。 无线模块是我认为比较难调试的模块之一,因为是双方互动的一种模块,通信失败...

quanwei9958
2015/07/09
1K
3
python3 爬去公司内部的ppt资料

在写爬虫的过程中遇到如下错误: 解决方法: 封装好的db操作 问题出现了,发现在http中敲入下载地址,类似于 但是python代码中用这个地址返回的不是pptx文件,而是html文件. 要知道具体返回的...

youngbit007
2017/11/29
0
0
【UE4学习】20_常见问题汇总1

本文链接:http://blog.csdn.net/SzuITMan/article/details/78612813 常见问题汇总 Texture Streaming pool over 1444 MB 解决方法 VR使用Play World Camera Shake节点相机抖动失效 解决方法......

szu_it_man
2017/11/23
0
0
Hive 问题汇总

1 Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT… 当启动的时候报错: 1 2 3 1 2 3 这个问题是由于的元数据存储配置不当引起的,可以这样...

Zero零_度
2016/07/07
156
0
android studio 3.0 入坑需知

1、使用butterknife7.0.1报错解决 错误: 解决方案: 在自己项目目录下的build.gradle中进行修改 2、AAPT2 编译报错 AAPT2 error 错误: 解决方案: 在gradle.properties中关闭APPT2 编译 3、...

胡东月
2017/11/08
16
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA 编写redisUtils工具类,防止高并发获取缓存出现并发问题

import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.core.BoundHashOperations;import org.springframework.data.redis.core.BoundValueOperations;import org.......

huangkejie
47分钟前
5
0
JMM内存模型(一)&volatile关键字的可见性

在说这个之前,我想先说一下计算机的内存模型: CPU在执行的时候,肯定要有数据,而数据在内存中放着呢,这里的内存就是计算机的物理内存,刚开始还好,但是随着技术的发展,CPU处理的速度越...

走向人生巅峰的大路
今天
97
0
你对AJAX认知有多少(2)?

接着昨日内容,我们几天继续探讨ajax的相关知识点 提到ajax下面几个问题又是必须要了解的啦~~~ 8、在浏览器端如何得到服务器端响应的XML数据。 通过XMLHttpRequest对象的responseXMl属性 9、 ...

理性思考
今天
5
0
正则表达式基础(一)

1.转义 转义的作用: 当某个字符在表达式中具有特殊含义,例如字符串引号中出现了引号,为了可以使用这些字符本身,而不是使用其在表达式中的特殊含义,则需要通过转义符“\”来构建该字符转...

清自以敬
今天
4
0
idea中@Data标签getset不起作用

背景:换电脑以后在idea中有@data注解都不生效 解决办法:idea装个插件 https://blog.csdn.net/seapeak007/article/details/72911529...

栾小糖
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部