希望能通过这几天的连续几篇文章,能让和我一样从零开始接受CC1101的朋友,少走弯路,加快进度!同时也记录自己开发的时候遇到的困难,或许以后也能用到!!
公司的项目总是急的如夏日里的雷阵雨,又快又狠!
这次是个无线抄表项目,用到的模块式TI的CC1101,在这里要再次感谢利尔达的FAE和AE们,要不是他们。哎~~
从拿到CC1101的中文手册,无论如何也不知道该如何下手,把文档从头到尾看了一遍,似乎看了些什么,但又觉得什么都没看,好吧,那就再看一遍!!!
还好,利尔达的DEMO板程序能够帮到我一点,还有一个牛逼的SmartRF Studio 7.强烈要求各位开发新手用这款软件。千万别对自己太抱有信心,你再牛逼,也牛逼不过他!!
先说说GDO0和GDO2,这两个东西是搞CC1101很重要的两个东西,它连着你的单片机的IO口。因此你完全可以利用中断来判断当前的模块处于一种什么样的情况,当然这个还跟你怎么去设置IFGDO0和IFGDO2这两个寄存器有关系了,详见CC1101中文手册64页。
不过我的发送没有用中断来做,因为查询够了。当然查询也看你怎么查了,我见到过的有两种,如下:
1.先判断GDO0/GDO2(看你怎么连了)是否变高电平,然后再判断是否变低电平,这么一个过程就是发送一帧数据的过程。
2.判断CC1101的状态寄存器,这个也要看你的设置了,如果你发送完之后是IDLE状态则等待0x01如果发送完之后是接收状态则等待0x0d;
说到发送数据,这里说明一下,CC1101发送数据的时候是先发送前导码和同步字的,然后在发送FIFO数据长度、地址(如果接收端开启了地址过滤)以及FIFO中的数据。
在这里要说明一点:当时我和同事一起做这个的时候发现当低速率的时候他发送的数据我总是接收不到。原因就是我发送完之后等待IDLE的时间太短,所以数据根本就没发完就超时了。
说到寄存器,那CC1101的功能那么多,寄存器自然就很多。其实真正我们需要手动去设置的寄存器却不是很多,大多数寄存器都是SmartRF来自动生成的,在这里说说几个比较重要的寄存器:
FIFOTHR:这个主要是设置发送和接受FIFO能够放的下多少发送和接受的数据,一般来说都只要设置成0x07就可以了,因为如果你数据比较长你可以分包发送或者分包接收即可。
PKTLEN:最大数据包长度设置。
PKTCTRL1:这个寄存器如果你需要地址过滤的话那就需要开启地址过滤,还有就是如果你想在你的数据FIFO最后两个字节放上RSSI的值和LQI值以及CRC_OK的话就需要做相应的设置。
PKTCTRL0:想开启数据白化和CRC校验的话就设置一下咯,当然还有比较重的就是是否是固定长度数据包或者是可变长度数据包,区别就是固定的话那前导码和同步字后就不需要加上FIFO数据长度了,反之则需要加上FIFO数据长度。否则CC1101怎么知道你要发多少数据呢?
MCSM1:这个太重要了,决定了你发送完或者接收完数据后下一个状态是什么。
MCSM0:选择自动校准还是手动校准,听说不校准的话速率低倒关系不大,速率高了可能跑偏了影响就大了。
CC1101的寄存器初始化,是在CC1101工作这前必须做的一件事情,最主要初始化的三个参数是频率,速率,功率。最好是以结构体的方式初始化,否则当你改动速率或者频率或者功率的时候,你还要改变其他几个相关的寄存器,这样做就比较麻烦,我当初的做法是:利用SmartRF,把我需要的频率431,433,435,我需要的速率1.2K,2.4K,4.8K,10K......等等全部配置一边,然后利用截图截下SmartRF的值,然后利用这么一个结构体:
typedef struct
{
u8 IOCFG2;
u8 IOCFG1;
u8 IOCFG0;
u8 FIFOTHR;
u8 SYNC1;
u8 SYNC0;
u8 PKTLEN;
u8 PKTCTRL1;
u8 PKTCTRL0;
u8 ADDR;
u8 CHANNR;
u8 FSCTRL1;
u8 FSCTRL0;
u8 FREQ2;
u8 FREQ1;
u8 FREQ0;
u8 MDMCFG4;
u8 MDMCFG3;
u8 MDMCFG2;
u8 MDMCFG1;
u8 MDMCFG0;
u8 DEVAITN;
u8 MCSM2;
u8 MCSM1;
u8 MCSM0;
u8 FOCCFG;
u8 BSCFG;
u8 AGCCTRL2;
u8 AGCCTRL1;
u8 AGCCTRL0;
u8 WOREVT1;
u8 WOREVT0;
u8 WORCTRL;
u8 FREND1;
u8 FREND0;
u8 FSCAL3;
u8 FSCAL2;
u8 FSCAL1;
u8 FSCAL0;
u8 RCCTRL1;
u8 RCCTRL0;
u8 FSTEST;
u8 PTEST;
u8 AGCTEST;
u8 TEST2;
u8 TEST1;
u8 TEST0;
}Struct_RF_Reg;
做初始化
#if RF_BAUD_RATE == 2400
Struct_RF_Reg My_RF_Config = {
0x0B, // IOCFG2
0x2E, // IOCFG1
0x01, // IOCFG0
0x07, // FIFOTHR
0xB3, // SYNC1
0x9C, // SYNC0
0x40, // PKTLEN
0x0C, // PKTCTRL1
0x45, // PKTCTRL0
0x00, // ADDR
0x00, // CHANNR
0x06, // FSCTRL1
0x00, // FSCTRL0
#if RF_FREQUENCY == 431
0x10, // FREQ2
0x93, // FREQ1
0xB1, // FREQ0
#elif RF_FREQUENCY == 433
0x10, // FREQ2
0xA7, // FREQ1
0x62, // FREQ0
#elif RF_FREQUENCY == 435
0X10,
0XBB,
0X13,
#endif
0xF6, // MDMCFG4
0x83, // MDMCFG3
0x13, // MDMCFG2
0x22, // MDMCFG1
0xF8, // MDMCFG0
0x15, // DEVIATN
0x07, // MCSM2
0x3C, // MCSM1
0x18, // MCSM0
0x16, // FOCCFG
0x6C, // BSCFG
0x03, // AGCCTRL2
0x40, // AGCCTRL1
0x91, // AGCCTRL0
0x87, // WOREVT1
0x6B, // WOREVT0
0xFB, // WORCTRL
0x56, // FREND1
0x10, // FREND0
0xE9, // FSCAL3
0x2A, // FSCAL2
0x00, // FSCAL1
0x1F, // FSCAL0
0x41, // RCCTRL1
0x00, // RCCTRL0
0x59, // FSTEST
0x7F, // PTEST
0x3F, // AGCTEST
0x81, // TEST2
0x35, // TEST1
0x09 // TEST0
};
当然我这里只例举了2.4k的速率,其他只要改变宏定义就可以了。
最后调用一个
TI_CC_SPIWriteBurstReg(TI_CCxxx0_IOCFG2, &(RFConfig -> IOCFG2), 47);
函数就把47个寄存器都写进去了,因为这47个寄存器地址都是递增的,所以写个Burst就搞定了,不需要一个一个写那么复杂。
楼主最近还看过