RF1100SE微功率无线数传模块,采用Chipcon公司的高性能CC1100无线通信芯片,最大传输数率达500kbps,并可软件修改波特率,开阔地传输距离达到300米,具有无线唤醒等功能, 灵敏度达到-110dBm,可靠性高,可广泛应用于各种场合的短距离无线通信领域。
性能及特点:
(1) 工作电压:1.8V~3.6V,推荐接近3.6V,但是不超过3.6V(推荐3.3V)
(2) 315、433、868、915MHz的ISM 和SRD频段
(3) 最高工作速率500Kbps,支持2-FSK、GFSK和MSK调制方式
(4) 可软件修改波特率参数,更好地满足客户在不同条件下的使用要求
高波特率:更快的数据传输速率
低波特率:更强的抗干扰性和穿透能力,更远的传输距离
(5) 高灵敏度(1.2kbps下-110dBm,1%数据包误码率)
(6) 内置硬件CRC 检错和点对多点通信地址控制
(7) 较低的电流消耗(RX中,15.6mA,2.4kbps,433MHz)
(8) 可编程控制的输出功率,对所有的支持频率可达+10dBm
(9) 无线唤醒功能,支持低功率电磁波激活功能 ,无线唤醒低功耗睡眠状态的设备
(10) 支持传输前自动清理信道访问(CCA),即载波侦听系统
(11) 快速频率变动合成器带来的合适的频率跳跃系统
(12) 模块可软件设地址,软件编程非常方便
(13) 标准DIP间距接口,便于嵌入式应用
(14) 单独的64字节RX和TX数据FIFO
(15) 传输距离:开阔地传输距离可达300米(视具体环境和通信波特率设定情况等而定)
(16) 模块尺寸:29mm *16mm(上述尺寸不含天线)
主要应用领域
极低功率UHF无线收发器,315/433/868/915MHz的ISM/SRD波段系统,AMR-自动仪表读数,电子消费产品,远程遥控控制,低功率遥感勘测,住宅和建筑自动控制,无线警报和安全系统,工业监测和控制,无线传感器网络,无线唤醒功能,低功耗手持终端产品等
RF1100SE微功率无线数传模块开发指南
说明:
(1) VCC脚接电压范围为 1.9V-3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。推荐电压3.3V左右。
(2) 除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。当然对3V左右的单片机更加适用了。
(3) 硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以了。
(4) 9脚,10脚为接地脚,需要和母板的逻辑地连接起来
(5) 排针间距为100mil,标准DIP插针,如果需要其他封装接口,比如密脚插针,或者其他形式的接口,可以联系我们定做。
(6) 与51系列单片机P0口连接时候,需要加10K的上拉电阻,与其余口连接不需要。
(7) 其他系列的单片机,如果是5V的,请参考该系列单片机IO口输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块! 如果是3.3V的,可以直接和RF1100模块的IO口线连接。
模块结构和引脚说明
RF1100模块使用TI-Chipcon公司的CC1101芯片开发而成。
RF1100 单片无线收发器工作在433/868/915MHZ 的ISM 频段由一个完全集成的频率调制器一个带解调器的接收器一个功率放大器一个晶体震荡器和一个调节器组成。工作特点是自动产生前导码 和 CRC 可以很容易通过SPI 接口进行编程配置,电流消耗低。
引脚编号 | 引脚名 | 引脚类型 | 描述 |
1,2 | VCC | 电源输入 | 1.9V-3.6V之间 |
3 | SI | 数字输入 | 连续配置接口,数据输入 |
4 | SCLK | 数字输入 | 连续配置接口,时钟输入 |
5 | SO(GD01) | 数字输出 | 连续配置接口,数据输出 当CSn为高时为可选的一般输出脚 |
6 | GDO2 | 数字输出 | 一般用途的数字输出脚: 测试信号FIFO状态信号时钟输出,从XOSC向下分割连续输入TX数据 |
7 | CSn | 数字输入 | 连续配置接口,芯片选择 |
8 | GDO0 | 一般用途的数字输出脚: 测试信号FIFO状态信号时钟输出,从XOSC向下分割连续输入TX数据,也用作原型/产品测试的模拟测试I/O | |
9,10 | GND | 地(模拟) | 模拟接地 |
配置RF1100模块
所有配置字都是通过SPI接口送给CC1100。SIP接口的工作方式可通过SPI指令进行设置。
SPI 时序
SPI 读/写操作
SPI接口定时要求
参数 | 描述 | 最小值 | 最大值 |
FSCLK | SCLK频率 | 0 | 10MHz |
tsp,pd | CSn低到SCLK的正边缘,功率降低模式下 | TBDus | - |
tsp | CSn低到SCLK的正边缘,活动模式下 | TBDns | - |
tch | 时钟高 | 50ns | - |
tcl | 时钟低 | 50ns | - |
trise | 时钟上升时间 | - | TBDns |
tfall | 时钟上升时间 | - | TBDns |
tsd | 向SCLK的正边缘建立数据 | TBDns | - |
thd | 在SCLK的正边缘之后保持数据 | TBDns | - |
tns | SCLK到CSn高时的负边缘 | TBDns | - |
状态字节概述
比特 | 名称 | 描述 | ||
7 | CHIP_RDYn | 保持高,直到功率和晶体已稳定。当使用SPI接口时应始终为低。 | ||
6:4 | STATE[2:0] | 表明当前主状态模式 | ||
值 | 状态 | 描述 | ||
000 | 空闲 | 空闲状态 | ||
001 | RX | 接收模式 | ||
010 | TX | 发送模式 | ||
011 | FSTXON | 快速TX准备 | ||
100 | 校准 | 频率合成器校准正运行 | ||
101 | 迁移 | PLL正迁移 | ||
110 | RXFIFO_OVERFLOW | RX FIFO已经溢出,读出任何有用数据,然后用SFRX冲洗FIFO | ||
111 | TXFIFO_OVERFLOW | TX FIFO已经下溢,同SFTX应答 | ||
3:0 | FIFO_BYTES_AVAILABLE[3:0] | TX FIFO中的自由比特数。若FIFO_BYTES_AVAILABLE=15,它表明有15或更多个比特是可用/自由的。 |
命令滤波
地址 | 滤波名 | 描述 |
0x30 | SRES | 重启芯片 |
0x31 | SFSTXON | 开启和校准频率合成器(若MCSM0.FSAUTOCAL=1) |
0x32 | SXOFF | 关闭晶体振荡器 |
0x33 | SCAL | 校准频率合成器并关断(开启快速启动)。在不设置手动校准模式(MCSM0.FS_AUTOCAL=0)的情况下,SCAL能从空闲模式滤波。 |
0x34 | SRX | 启用RX。若上一状态为空闲且MCSM0.FS_AUTOCAL=1则首先运行校准。 |
0x35 | STX | 空闲状态:启用TX。若MCSM0.FS_AUTOCAL=1首先运行校准。若在RX状态且CCA启用:若信道为空则进入TX |
0x36 | SIDLE | 离开RX/TX,关断频率合成器并离开电磁波激活模式若可用 |
0x37 | SAFC | 运行22.1节列出的频率合成器的AFC调节 |
0x38 | SWOR | 运行27.5节描述的自动RX选举序列(电磁波激活) |
0x39 | SPWD | 当CSn为高时进入功率降低模式。 |
0x3A | SFRX | 冲洗RX FIFO缓冲 |
0x3B | SFTX | 冲洗TX FIFO缓冲 |
0x3C | SWORRST | 重新设置真实时间时钟 |
0x3D | SNOP | 无操作。可能用来为更简单的软件将滤波命令变为2字节。 |
配置寄存器概述
地址 | 寄存器 | 描述 | 保存在休眠状态中 |
0x00 | IOCFG2 | GDO2输出脚配置 | Yes |
0x01 | IOCFG1 | GDO1输出脚配置 | Yes |
0x02 | IOCFG0 | GDO0输出脚配置 | Yes |
0x03 | FIFOTHR | RX FIFO和TX FIFO门限 | Yes |
0x04 | SYNC1 | 同步词汇,高字节 | Yes |
0x05 | SYNC0 | 同步词汇,低字节 | Yes |
0x06 | PKTLEN | 数据包长度 | Yes |
0x07 | PKTCTRL1 | 数据包自动控制 | Yes |
0x08 | PKTCTRL0 | 数据包自动控制 | Yes |
0x09 | ADDR | 设备地址 | Yes |
0x0A | CHANNR | 信道数 | Yes |
0x0B | FSCTRL1 | 频率合成器控制 | Yes |
0x0C | FSCTRL0 | 频率控制词汇,高字节 | Yes |
0x0D | FREQ2 | 频率控制词汇,中间字节 | Yes |
0x0E | FREQ1 | 频率控制词汇,低字节 | Yes |
0x0F | FREQ0 | 调制器配置 | Yes |
0x10 | MDMCFG4 | 调制器配置 | Yes |
0x11 | MDMCFG3 | 调制器配置 | Yes |
0x12 | MDMCFG2 | 调制器配置 | Yes |
0x13 | MDMCFG1 | 调制器配置 | Yes |
0x14 | MDMCFG0 | 调制器背离设置 | Yes |
0x15 | DEVIATN | 主通信控制状态机配置 | Yes |
0x16 | MCSM2 | 主通信控制状态机配置 | Yes |
0x17 | MCSM1 | 主通信控制状态机配置 | Yes |
0x18 | MCSM0 | 频率偏移补偿配置 | Yes |
0x19 | FOCCFG | 位同步配置 | Yes |
0x1A | BSCFG | AGC控制 | Yes |
0x1B | AGCTRL2 | AGC控制 | Yes |
0x1C | AGCTRL1 | AGC控制 | Yes |
0x1D | AGCTRL0 | 高字节时间0暂停 | Yes |
0x1E | WOREVT1 | 低字节时间0暂停 | Yes |
0x1F | WOREVT0 | 电磁波激活控制 | Yes |
0x20 | WORCTRL | 前末端RX配置 | Yes |
0x21 | FREND1 | 前末端TX配置 | Yes |
0x22 | FREND0 | 频率合成器校准 | Yes |
0x23 | FSCAL3 | 频率合成器校准 | Yes |
0x24 | FSCAL2 | 频率合成器校准 | Yes |
0x25 | FSCAL1 | 频率合成器校准 | Yes |
0x26 | FSCAL0 | RC振荡器配置 | Yes |
0x27 | RCCTRL1 | RC振荡器配置 | Yes |
0x28 | RCCTRL0 | 频率合成器校准控制 | Yes |
0x29 | FSTEST | 产品测试 | No |
0x2A | PTEST | AGC测试 | No |
0x2B | AGCTEST | 不同的测试设置 | No |
0x2C | TEST2 | 不同的测试设置 | No |
0x2D | TEST1 | 不同的测试设置 | No |
0x2E | TEST0 | No |
状态寄存器概述
地址 | 寄存器 | 描述 |
0x30 (0xF0) | PARTNUM | CC2550的组成部分数目 |
0x31 (0xF1) | VERSION | 当前版本数 |
0x32 (0xF2) | FREQEST | 频率偏移估计 |
0x33 (0xF3) | LQI | 连接质量的解调器估计 |
0x34 (0xF4) | RSSI | 接收信号强度指示 |
0x35 (0xF5) | MARCSTATE | 控制状态机状态 |
0x36 (0xF6) | WORTIME1 | WOR计时器高字节 |
0x37 (0xF7) | WORTIME0 | WOR计时器低字节 |
0x38 (0xF8) | PKTSTATUS | 当前GDOx状态和数据包状态 |
0x39 (0xF9) | VCOVCDAC | PLL校准模块的当前设定 |
0x3A (0xFA) | TXBYTES | TX FIFO中的下溢和比特数 |
0x3B (0xFB) | RXBYTES | RX FIFO中的下溢和比特数 |
RF1100编程指南
使用RF1100模块无需掌握任何专业无线或高频方面的理论,读者只需要具备一定的C语言程序基础即可。本文档没有涉及到的问题,读者可以参考CC1100官方手册。
范例程序中的部分相关代码段(完整代码请查看Demo程序):
// CC2500/CC1100 STROBE, CONTROL AND STATUS REGSITER
#define CCxxx0_IOCFG2 0x00 // GDO2 output pin configuration
#define CCxxx0_IOCFG1 0x01 // GDO1 output pin configuration
#define CCxxx0_IOCFG0 0x02 // GDO0 output pin configuration
#define CCxxx0_FIFOTHR 0x03 // RX FIFO and TX FIFO thresholds
#define CCxxx0_SYNC1 0x04 // Sync word, high INT8U
#define CCxxx0_SYNC0 0x05 // Sync word, low INT8U
#define CCxxx0_PKTLEN 0x06 // Packet length
#define CCxxx0_PKTCTRL1 0x07 // Packet automation control
#define CCxxx0_PKTCTRL0 0x08 // Packet automation control
#define CCxxx0_ADDR 0x09 // Device address
#define CCxxx0_CHANNR 0x0A // Channel number
#define CCxxx0_FSCTRL1 0x0B // Frequency synthesizer control
#define CCxxx0_FSCTRL0 0x0C // Frequency synthesizer control
#define CCxxx0_FREQ2 0x0D // Frequency control word, high INT8U
#define CCxxx0_FREQ1 0x0E // Frequency control word, middle INT8U
#define CCxxx0_FREQ0 0x0F // Frequency control word, low INT8U
#define CCxxx0_MDMCFG4 0x10 // Modem configuration
#define CCxxx0_MDMCFG3 0x11 // Modem configuration
#define CCxxx0_MDMCFG2 0x12 // Modem configuration
#define CCxxx0_MDMCFG1 0x13 // Modem configuration
#define CCxxx0_MDMCFG0 0x14 // Modem configuration
#define CCxxx0_DEVIATN 0x15 // Modem deviation setting
#define CCxxx0_MCSM2 0x16 // Main Radio Control State Machine configuration
#define CCxxx0_MCSM1 0x17 // Main Radio Control State Machine configuration
#define CCxxx0_MCSM0 0x18 // Main Radio Control State Machine configuration
#define CCxxx0_FOCCFG 0x19 // Frequency Offset Compensation configuration
#define CCxxx0_BSCFG 0x1A // Bit Synchronization configuration
#define CCxxx0_AGCCTRL2 0x1B // AGC control
#define CCxxx0_AGCCTRL1 0x1C // AGC control
#define CCxxx0_AGCCTRL0 0x1D // AGC control
#define CCxxx0_WOREVT1 0x1E // High INT8U Event 0 timeout
#define CCxxx0_WOREVT0 0x1F // Low INT8U Event 0 timeout
#define CCxxx0_WORCTRL 0x20 // Wake On Radio control
#define CCxxx0_FREND1 0x21 // Front end RX configuration
#define CCxxx0_FREND0 0x22 // Front end TX configuration
#define CCxxx0_FSCAL3 0x23//Frequency synthesizer calibration
#define CCxxx0_FSCAL2 0x24 // Frequency synthesizer calibration
#define CCxxx0_FSCAL1 0x25 // Frequency synthesizer calibration
#define CCxxx0_FSCAL0 0x26 // Frequency synthesizer calibration
#define CCxxx0_RCCTRL1 0x27 // RC oscillator configuration
#define CCxxx0_RCCTRL0 0x28 // RC oscillator configuration
#define CCxxx0_FSTEST 0x29 // Frequency synthesizer calibration control
#define CCxxx0_PTEST 0x2A // Production test
#define CCxxx0_AGCTEST 0x2B // AGC test
#define CCxxx0_TEST2 0x2C // Various test settings
#define CCxxx0_TEST1 0x2D // Various test settings
#define CCxxx0_TEST0 0x2E // Various test settings
// Strobe commands
#define CCxxx0_SRES 0x30 // Reset chip.
#define CCxxx0_SFSTXON 0x31 // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
// If in RX/TX: Go to a wait state where only the synthesizer is
// running (for quick RX / TX turnaround).
#define CCxxx0_SXOFF 0x32 // Turn off crystal oscillator.
#define CCxxx0_SCAL 0x33 // Calibrate frequency synthesizer and turn it off
// (enables quick start).
#define CCxxx0_SRX 0x34 // Enable RX. Perform calibration first if coming from IDLE and
// MCSM0.FS_AUTOCAL=1.
#define CCxxx0_STX 0x35 // In IDLE state: Enable TX. Perform calibration first if
// MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:
// Only go to TX if channel is clear.
#define CCxxx0_SIDLE 0x36 // Exit RX / TX, turn off frequency synthesizer and exit
// Wake-On-Radio mode if applicable.
#define CCxxx0_SAFC 0x37 // Perform AFC adjustment of the frequency synthesizer
#define CCxxx0_SWOR 0x38 // Start automatic RX polling sequence (Wake-on-Radio)
#define CCxxx0_SPWD 0x39 // Enter power down mode when CSn goes high.
#define CCxxx0_SFRX 0x3A // Flush the RX FIFO buffer.
#define CCxxx0_SFTX 0x3B // Flush the TX FIFO buffer.
#define CCxxx0_SWORRST 0x3C // Reset real time clock.
#define CCxxx0_SNOP 0x3D // No operation. May be used to pad strobe commands to two
// INT8Us for simpler software.
#define CCxxx0_PARTNUM 0x30
#define CCxxx0_VERSION 0x31
#define CCxxx0_FREQEST 0x32
#define CCxxx0_LQI 0x33
#define CCxxx0_RSSI 0x34
#define CCxxx0_MARCSTATE 0x35
#define CCxxx0_WORTIME1 0x36
#define CCxxx0_WORTIME0 0x37
#define CCxxx0_PKTSTATUS 0x38
#define CCxxx0_VCO_VC_DAC 0x39
#define CCxxx0_TXBYTES 0x3A
#define CCxxx0_RXBYTES 0x3B
#define CCxxx0_PATABLE 0x3E
#define CCxxx0_TXFIFO 0x3F
#define CCxxx0_RXFIFO 0x3F
// RF_SETTINGS is a data structure which contains all relevant CCxxx0 registers
typedef struct S_RF_SETTINGS{
INT8U FSCTRL2; //
INT8U FSCTRL1; // Frequency synthesizer control.
INT8U FSCTRL0; // Frequency synthesizer control.
INT8U FREQ2; // Frequency control word, high INT8U.
INT8U FREQ1; // Frequency control word, middle INT8U.
INT8U FREQ0; // Frequency control word, low INT8U.
INT8U MDMCFG4; // Modem configuration.
INT8U MDMCFG3; // Modem configuration.
INT8U MDMCFG2; // Modem configuration.
INT8U MDMCFG1; // Modem configuration.
INT8U MDMCFG0; // Modem configuration.
INT8U CHANNR; // Channel number.
INT8U DEVIATN; // Modem deviation setting (when FSK modulation is enabled).
INT8U FREND1; // Front end RX configuration.
INT8U FREND0; // Front end RX configuration.
INT8U MCSM0; // Main Radio Control State Machine configuration.
INT8U FOCCFG; // Frequency Offset Compensation Configuration.
INT8U BSCFG; // Bit synchronization Configuration.
INT8U AGCCTRL2; // AGC control.
INT8U AGCCTRL1; // AGC control.
INT8U AGCCTRL0; // AGC control.
INT8U FSCAL3; // Frequency synthesizer calibration.
INT8U FSCAL2; // Frequency synthesizer calibration.
INT8U FSCAL1; // Frequency synthesizer calibration.
INT8U FSCAL0; // Frequency synthesizer calibration.
INT8U FSTEST; // Frequency synthesizer calibration control
INT8U TEST2; // Various test settings.
INT8U TEST1; // Various test settings.
INT8U TEST0; // Various test settings.
INT8U IOCFG2; // GDO2 output pin configuration
INT8U IOCFG0; // GDO0 output pin configuration
INT8U PKTCTRL1; // Packet automation control.
INT8U PKTCTRL0; // Packet automation control.
INT8U ADDR; // Device address.
INT8U PKTLEN; // Packet length.
} RF_SETTINGS;
[通过SPI接口向RF1100配置寄存器读写配置信息] :
RF1100通过SPI接口与单片机通讯,因此必须首先了解SPI接口。
[SPI概念] SPI外围串行接口由四条线构成:
MOSI主机输出从机输入 (主机写操作)
MISO主机输入从机输出 (主机读操作)
SCK 串行时钟信号,由主机控制
CSN 片选信号,低电平有效
//<SPI读写操作 代码>
INT8U SpiTxRxByte(INT8U dat)
{
INT8U i,temp;
temp = 0;
SCK = 0;
for(i=0; i<8; i++)
{
if(dat & 0x80)
{
MOSI = 1;
}
else MOSI = 0;
dat <<= 1;
SCK = 1;
_nop_();
_nop_();
temp <<= 1;
if(MISO)temp++;
SCK = 0;
_nop_();
_nop_();
}
return temp;
}
需要注意的是:数据的传输时,高位在前,低位在后。
//<主机通过SPI接口向CC1100配置寄存器读写入信息>
INT8U halSpiReadReg(INT8U addr)
{
INT8U temp, value;
temp = addr|READ_SINGLE;//读寄存器命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
value = SpiTxRxByte(0);
CSN = 1;
return value;
}
void halSpiWriteReg(INT8U addr, INT8U value)
{
CSN = 0;
while (MISO);
SpiTxRxByte(addr); //写地址
SpiTxRxByte(value); //写入配置
CSN = 1;
}
// 配置RF1100
void halRfWriteRfSettings(void)
{
halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL2); // Write register settings
halSpiWriteReg(CCxxx0_FSCTRL1, rfSettings.FSCTRL1);
halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL0);
halSpiWriteReg(CCxxx0_FREQ2, rfSettings.FREQ2);
halSpiWriteReg(CCxxx0_FREQ1, rfSettings.FREQ1);
halSpiWriteReg(CCxxx0_FREQ0, rfSettings.FREQ0);
halSpiWriteReg(CCxxx0_MDMCFG4, rfSettings.MDMCFG4);
halSpiWriteReg(CCxxx0_MDMCFG3, rfSettings.MDMCFG3);
halSpiWriteReg(CCxxx0_MDMCFG2, rfSettings.MDMCFG2);
halSpiWriteReg(CCxxx0_MDMCFG1, rfSettings.MDMCFG1);
halSpiWriteReg(CCxxx0_MDMCFG0, rfSettings.MDMCFG0);
halSpiWriteReg(CCxxx0_CHANNR, rfSettings.CHANNR);
halSpiWriteReg(CCxxx0_DEVIATN, rfSettings.DEVIATN);
halSpiWriteReg(CCxxx0_FREND1, rfSettings.FREND1);
halSpiWriteReg(CCxxx0_FREND0, rfSettings.FREND0);
halSpiWriteReg(CCxxx0_MCSM0 , rfSettings.MCSM0 );
halSpiWriteReg(CCxxx0_FOCCFG, rfSettings.FOCCFG);
halSpiWriteReg(CCxxx0_BSCFG, rfSettings.BSCFG);
halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);
halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);
halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);
halSpiWriteReg(CCxxx0_FSCAL3, rfSettings.FSCAL3);
halSpiWriteReg(CCxxx0_FSCAL2, rfSettings.FSCAL2);
halSpiWriteReg(CCxxx0_FSCAL1, rfSettings.FSCAL1);
halSpiWriteReg(CCxxx0_FSCAL0, rfSettings.FSCAL0);
halSpiWriteReg(CCxxx0_FSTEST, rfSettings.FSTEST);
halSpiWriteReg(CCxxx0_TEST2, rfSettings.TEST2);
halSpiWriteReg(CCxxx0_TEST1, rfSettings.TEST1);
halSpiWriteReg(CCxxx0_TEST0, rfSettings.TEST0);
halSpiWriteReg(CCxxx0_IOCFG2, rfSettings.IOCFG2);
halSpiWriteReg(CCxxx0_IOCFG0, rfSettings.IOCFG0);
halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);
halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);
halSpiWriteReg(CCxxx0_ADDR, rfSettings.ADDR);
halSpiWriteReg(CCxxx0_PKTLEN, rfSettings.PKTLEN);
}
其中,rfSettings需要定义并按照需要初始化适当的值。比如配置如下:
// RF output power = 0 dBm
// RX filterbandwidth = 540.000000 kHz
// Deviation = 0.000000
// Datarate = 250.000000 kbps
// Modulation = (7) MSK
// Manchester enable = (0) Manchester disabled
// RF Frequency = 433.000000 MHz
// Channel spacing = 199.951172 kHz
// Channel number = 0
// Optimization = Sensitivity
// Sync mode = (3) 30/32 sync word bits detected
// Format of RX/TX data = (0) Normal mode, use FIFOs for RX and TX
// CRC operation = (1) CRC calculation in TX and CRC check in RX enabled
// Forward Error Correction = (0) FEC disabled
// Length configuration = (1) Variable length packets, packet length configured by the first received byte after sync word.
// Packetlength = 255
// Preamble count = (2) 4 bytes
// Append status = 1
// Address check = (11) No address check
// FIFO autoflush = 0
// Device address = 0
// GDO0 signal selection = ( 6)
// GDO2 signal selection = (11) Serial Clock
const RF_SETTINGS rfSettings = {
0x00,
0x0B, // FSCTRL1 Frequency synthesizer control.
0x00, // FSCTRL0 Frequency synthesizer control.
0x10, // FREQ2 Frequency control word, high byte.
0xA7, // FREQ1 Frequency control word, middle byte.
0x62, // FREQ0 Frequency control word, low byte.
0x2D, // MDMCFG4 Modem configuration.
0x3B, // MDMCFG3 Modem configuration.
0x73, // MDMCFG2 Modem configuration.
0x22, // MDMCFG1 Modem configuration.
0xF8, // MDMCFG0 Modem configuration.
0x00, // CHANNR Channel number.
0x00, // DEVIATN Modem deviation setting (when FSK modulation is enabled).
0xB6, // FREND1 Front end RX configuration.
0x10, // FREND0 Front end RX configuration.
0x18, // MCSM0 Main Radio Control State Machine configuration.
0x1D, // FOCCFG Frequency Offset Compensation Configuration.
0x1C, // BSCFG Bit synchronization Configuration.
0xC7, // AGCCTRL2 AGC control.
0x00, // AGCCTRL1 AGC control.
0xB2, // AGCCTRL0 AGC control.
0xEA, // FSCAL3 Frequency synthesizer calibration.
0x0A, // FSCAL2 Frequency synthesizer calibration.
0x00, // FSCAL1 Frequency synthesizer calibration.
0x11, // FSCAL0 Frequency synthesizer calibration.
0x59, // FSTEST Frequency synthesizer calibration.
0x88, // TEST2 Various test settings.
0x31, // TEST1 Various test settings.
0x0B, // TEST0 Various test settings.
0x0B, // IOCFG2 GDO2 output pin configuration.
0x06, // IOCFG0D GDO0 output pin configuration.
0x04, // PKTCTRL1 Packet automation control.
0x05, // PKTCTRL0 Packet automation control.
0x00, // ADDR Device address.
0x0c // PKTLEN Packet length.
};
//使用CC1100发送数据
void halRfSendPacket(INT8U *txBuffer, INT8U size)
{
halSpiWriteReg(CCxxx0_TXFIFO, size);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据
halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据
// Wait for GDO0 to be set -> sync transmitted
while (!GDO0);
// Wait for GDO0 to be cleared -> end of packet
while (GDO0);
halSpiStrobe(CCxxx0_SFTX);
}
//使用CC1100接收数据
INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
{
INT8U status[2];
INT8U packetLength;
halSpiStrobe(CCxxx0_SRX); //进入接收状态
while (!GDO1);
while (GDO1);
if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
{
packetLength = halSpiReadReg(CCxxx0_RXFIFO);
if (packetLength <= *length) {
halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength);
*length = packetLength; //把接收数据长度的修改为当前数据的长度
// Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2); //读出CRC校验位
halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
return (status[1] & CRC_OK); //如果校验成功返回接收成功
}
else
{
*length = packetLength;
halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
return 0;
}
}
else
return 0;
}