cc1101无线模块如何配置距离远

MSP430+CC1101(48)
先说说cc1101是通过SPI方式与MCU相连,可以通过MCU自带的硬件SPI,3线模式,或者MCU模拟SPI来驱动。
关于滤波指令和寄存器配置:
其实这里也TFT配置差不多,玩过TFT的都有同感,TFT可以通过RW引脚控制是读还是写,如果是写寄存器,先写寄存器的地址,然后写数据,数据就到了相应的寄存器里面了;读就是RW引脚设置为读对应的电平,先写寄存器的地址,该寄存器里面的数据就可以读出来了。明白了这些其实理解CC1101就可以很容易理解了。
那么对应CC1101的理解:
寄存器的配置:
CC1101寄存器地址是0~0x3F,也就是BIT0~BIT5
CC1101读写控制是BIT7,BIT7为1时,为读对应的寄存器,BIT7为0时,为写相应的寄存器。
那么还剩下一个BIT6,BIT6是突发访问控制为,BIT6为1为突发访问,BIT6为0为单字节访问。(突发访问下面说)
这样我们就可以很容易理解了,比如配置PKTCTRL0寄存器,其地址0x08,我们突发访问写的话写先数据0x48,再连续写数据,这里明白了突发访问后就很容易知道了,如果单字节读这个寄存器,先写数据0x88,读一下就可以了。
命令滤波:
命令滤波这里和TFT的写0x22是一样的,它就自动跳转到寄存器的出口,cc1101这里也是,只要写一下对应的寄存器的地址,不用写数据,它就内部自动执行相应的指令,比如重启芯片,设置为发送模式,共有14个滤波指令,地址从0x30~0x3D。
关于滤波指令的状态寄存器其实是可读不可写的,
也就是0x30~0x3D的地址加上0xC0,(BIT7 和IBT6为1,前面说过了),比如写数据0xF4,就可以读到相应RSSI状态寄存器里面的值。
数据包格式:
先看一个官方PDF上截得一个图
可以看出数据包由前导码,同步字节,可选的数据包长度,可选的目标地址,真正数据区,2字节的CRC校验码。其更加详细内容可以看前面写的CC430上的无线通信两篇文章。
CC1101的几个状态:
几个状态分别是,IDLE,TX,RX,FSTXON,校准,迁移,RXFIFO_OVERFLOW,TXFIFO_OVERFLOW,有读的状态字的BIT6~BIT4决定
知道了那么多基本的,那么初步认识就容易了,我下面再把笔记贴上去,大家可以看看。
1当CSN引脚变低,MCU必须等待SO引脚电平变低,表明内部稳定,除非radio处于Sleep或者XOFF状态,或者CSN变低后SO会立即变低的。
2只有使radio处于XOSC空闲,并且数字中心的能量开启,其他模块处于功率降低状态,这时候频率和信道配置才能被更新。
3状态字的最后4个字节表示FIFO的可用字节,其最大值是15,此时表示15或者更多字节是可以使用的。
4每当一个字节通过SI引脚写入到寄存器时,状态字节将被送到SO引脚
5寄存器的连续字节访问,就是内部计数器会自动设置起始地址,每增加一个字节,地址会自动加1,无论是读还是写,必须通过CSN拉高终止。
6关于命令滤波其实是radio的单字节指令,通过指令对寄存器的选址,内部的功能做出相应的启动或者关闭,这里和TFT的液晶的寄存器出口指令一样,只需要写一个0x22,不像前面的对寄存器先写地址后写数据。
7关于FIFO的访问,首先知道这个是64字节,可以通过单字节访问或者突发访问(也就是连续访问),他们的地址是0x3F,其实这些是这样操作的。
FIFO分为TX FIFO和RX FIFO两个单独的64数据区,当我们给的地址BIT7不同时,也就是读写控制位是1还是0,BIT7是0时访问的是TX FIFO,BIT7是1时RX FIFO被访问。BIT6是突发访问控制位,当BIT6为1时,选择的是突发访问,BIT6为0是单字节访问。这样就可以得到
0x3F:单字节访问TX FIFO
0xBF:单字节访问RX FIFO
0x7F:突发访问TX FIFO
0xFF:突发访问RX FIFO
8当radio进入休眠状态时,两个FIFO都被刷新为空。
9PATABLE的访问,用来设置发射功率的。地址是0x3E,里面有8个字节的表,接受地址SPI要等待8个字节。读写还是通过读写位控制,突发访问还是单字节访问还是通过突发位控制。这内部有个计数器,当计数到7时会自动下次为0。当设置CSn为高时,内部的计数器会变为0。
10一般所有的滤波命令会立即执行,但是SPWD(休眠滤波命令)不会立即执行,它会延迟到CSn为高时执行。
11接收模式下的数据包滤波,CC1101支持包括地址滤波和最大长度滤波两种滤波方式。
地址滤波:设置PKTCTRL1.ADR_CHK大于0开启数据包地址滤波,radio将数据包中的目标地址字节的值同自己ADDR寄存器值和广播地址(0x00,0xFF)进行比较,如果匹配则数据包被写到RX FIFO,否则数据包被丢失。
最大长度滤波:在可变数据包长度模式下,PKTLEN.PACKET_LENGTH寄存器的值用来设置最大允许数据包长度,当接收字节值比这个值大,则数据包被丢弃。
注:当设置PKTCTTL1.ADRCHK=10时广播地址为0x00,当设置PKTCTTL1.ADRCHK=11时,广播地址为0x00和0xFF。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:71125次
积分:1360
积分:1360
排名:千里之外
原创:74篇
转载:111篇
(1)(4)(4)(5)(24)(17)(37)(2)(4)(3)(1)(2)(1)(3)(2)(6)(5)(3)(2)(4)(4)(2)(56)推荐这篇日记的豆列
······如何动态地调整CC1101的发送功率? - 硬件, 射频和私有技术 - 无线连接 - 德州仪器在线技术支持社区
如何动态地调整CC1101的发送功率?
发表于4年前
<input type="hidden" id="hGroupID" value="24"
&span style=&font-size:&>根据TI软件查询,TX power在5dbm时的PA_TABLE值为0x86、在7dbm时的PA_TABLE值为0xCD、在10dbm时的PA_TABLE值为0xC5、在12dbm时的PA_TABLE值为0xC0,但PA_TABLE寄存器组共有8个,如果我在程序中希望先用5dbm发送一包数据,再逐次增大发送功率,采用7dbm、10dbm、12dbm各发送一次,应该如何调整呢?&/span>&/p>
&p>&span style=&font-size:&>对应功率的设置代码,看到过以下的二种类型的,正确的应该是如何的呢?&/span>&/p>
&p>&span style=&font-size:&>类型一:&/span>&/p>
&p>&span style=&font-size:&>char PaTable[] = {0xC0};&br>char PaTableLen = 1;&br>TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, PaTable, PaTableLen);&/span>&/p>
&p>&span style=&font-size:&>类型二:&/span>&/p>
&p>&span style=&font-size:&>char PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};&br>TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, PaTabel, 8);&/span>&/p>&div style=&clear:&>&/div>" />
如何动态地调整CC1101的发送功率?
此问题尚无答案
All Replies
根据TI软件查询,TX power在5dbm时的PA_TABLE值为0x86、在7dbm时的PA_TABLE值为0xCD、在10dbm时的PA_TABLE值为0xC5、在12dbm时的PA_TABLE值为0xC0,但PA_TABLE寄存器组共有8个,如果我在程序中希望先用5dbm发送一包数据,再逐次增大发送功率,采用7dbm、10dbm、12dbm各发送一次,应该如何调整呢?
对应功率的设置代码,看到过以下的二种类型的,正确的应该是如何的呢?
char PaTable[] = {0xC0};char PaTableLen = 1;TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, PaTable, PaTableLen);
char PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, PaTabel, 8);
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
举人1330分
PA_TABLE不是这么用的,它用于ASK模式下每个比特是否选择ramping的方式,
如果你需要对一个数据封包做不同功率发射只需要设置FREND0.PA_POWER=0,在每个封包发射之前把PATABLE[0]设置成你想发射的功率就可以了,
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
那么,以下二种模式是否都可以呢?
char PaTable[8] = {0x0E,0x1C,0x26,0x2B,0x60,0x86,0xCB,0xC2};TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, PaTable, 8);&& //设置发送功率表TI_CC_SPIWriteReg(TI_CCxxx0_FREND0,&& 0x10);&&& //设置发送功率为表中的第0值、即-20dbm//在后面需要调整为+7dbm时,执行这条语句就行了TI_CC_SPIWriteReg(TI_CCxxx0_FREND0,&& 0x16);&&& //设置FREND0.PA_POWER=6
char PaTable[] = {0xCB};TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, PaTable, 1);&& //设置发送功率表TI_CC_SPIWriteReg(TI_CCxxx0_FREND0,&& 0x10);&&& //设置FREND0.PA_POWER=0//在后面需要调整为+7dbm时,执行这条语句PaTable[] = {0xC2};&&& //修改发送功率为+10dbm
另外,能否详细解释一下 PA ramping 的意思呢?
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
举人1330分
可以这样配置:
char PaTable[8] = {0x0E,0x1C,0x26,0x2B,0x60,0x86,0xCB,0xC2};
TI_CC_SPIWriteReg(TI_CCxxx0_FREND0,&& 0x10);TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, PaTable,1);&& //设置发送功率
//在后面需要调整为+7dbm时,执行这条语句就行了TI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, PaTable+6,1);&& //设置发送功率
PA ramping用于ASK调幅模式,当调制高电平或者低电平时幅度不是直接跳变而是渐变的。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
可否这样呢?
//在后面需要调整为+7dbm时,执行这条语句:TI_CC_SPIWriteReg(TI_CCxxx0_PATABLE, PaTable[+6]);&& //设置发送功率
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
举人1330分
不行,这样设置是无效的。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
那么,这种方式是否为最简单、且切换时间最短的?
char PaTable[] = {0x86};&& //设置功率表为+5dbmTI_CC_SPIWriteBurstReg(TI_CCxxx0_PATABLE, PaTable, 1);&& //设置发送功率表TI_CC_SPIWriteReg(TI_CCxxx0_FREND0,&& 0x10);&&& //设置FREND0.PA_POWER=0//在后面需要调整为+7dbm时,执行这条语句就行了?PaTable[0] = {0xCB};&&& //设置功率表为+7dbm
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
举人1330分
不行,如果只执行
PaTable[0] = {0xCB};&&& //设置功率表为+7dbm
只是改变MCU变量值,没有改变的寄存器值
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
海尔集成半导体推出了个芯片型号HW3000,用量巨大,距离有2.5公里双向,与si4463差不多,比si4432 si4438远,比A7108 和A7139好很多,如果是10kpbs,比sx1278 远。LoRa没办法快速率,可了解,推荐!HW3000超低双向无线fsk模块完美替代、、A7139、A7108、si4432、si4438、si4463&
You have posted to a forum that requires a moderator to approve posts before they are publicly available.查看: 4742|回复: 5
cc1101无线模块的程序及使用介绍
& && &&&cc1101作为cc1100的升级版完全兼容也cc1100。
& && &&&虽然有着超高的性价比但却不为大多数初学者所用究其主要原因是程序比较烦杂。
& && &&&cc1101看似恐怖其实只是个纸老虎罢了,如果你真的了解了他其实他还是蛮可爱的。下面就为初学者做简单的介绍(如果你是大神就飞过)
& && &&&全面的代码是对cc1101寄存器进行配置(可以不用管,开发是直接粘贴复制即可,如果你喜欢寻根究底的话可以查看1101的手册,不过有点多100多页对自己的耐心是个挑战希望你可以坚持),读者可以直接把本文拖到最下面我给大家介绍(有点长往下到最下面就ok)。
/***************************************************************************************************************************/
#include &reg52.h&
#include &intrins.h&
#define&&INT8U&&unsigned char
#define&&INT16U&&unsigned int
#define&&WRITE_BURST& && &0x40& && &//连续写入
#define&&READ_SINGLE& && &0x80& && &//读
#define&&READ_BURST& && & 0xC0& && &//连续读
#define&&BYTES_IN_RXFIFO& &&&0x7F& && &&&//接收缓冲区的有效字节数
#define&&CRC_OK& && && && &&&0x80& && & //CRC校验通过位标志
//*****************************************************************************************
sbit&&GDO0 =P1^3;
sbit&&GDO2 =P3^2;
sbit MISO =P1^6;
sbit MOSI =P1^5;
sbit SCK&&=P1^7;
sbit CSN&&=P1^4;
//*****************************************************************************************
INT8U num=0;
//*****************************************************************************************
//*****************************************************************************************
INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};
//*****************************************************************************************
INT8U seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};& && && &//0~~9段码
//*****************************************************************************************
void SpiInit(void);
void CpuInit(void);
void RESET_CC1100(void);
void POWER_UP_RESET_CC1100(void);
void halSpiWriteReg(INT8U addr, INT8U value);
void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count);
void halSpiStrobe(INT8U strobe);
INT8U halSpiReadReg(INT8U addr);
void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count);
INT8U halSpiReadStatus(INT8U addr);
void halRfWriteRfSettings(void);
void halRfSendPacket(INT8U *txBuffer, INT8U size);
INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length);
void UART_init();
//*****************************************************************************************
// 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;
/////////////////////////////////////////////////////////////////
const RF_SETTINGS rfSettings =
& & 0x08,& &// 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.
& & 0x5B,& &// MDMCFG4& &Modem configuration.
& & 0xF8,& &// MDMCFG3& &Modem configuration.
& & 0x03,& &// MDMCFG2& &Modem configuration.
& & 0x22,& &// MDMCFG1& &Modem configuration.
& & 0xF8,& &// MDMCFG0& &Modem configuration.
& & 0x00,& &// CHANNR& & Channel number.
& & 0x47,& &// 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.
& & 0x2A,& &// FSCAL2& & Frequency synthesizer calibration.
& & 0x00,& &// FSCAL1& & Frequency synthesizer calibration.
& & 0x11,& &// FSCAL0& & Frequency synthesizer calibration.
& & 0x59,& &// FSTEST& & Frequency synthesizer calibration.
& & 0x81,& &// TEST2& &&&Various test settings.
& & 0x35,& &// TEST1& &&&Various test settings.
& & 0x09,& &// TEST0& &&&Various test settings.
& & 0x0B,& &// IOCFG2& & GDO2 output pin configuration.
& & 0x06,& &// IOCFG0D& &GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.
& & 0x04,& &// PKTCTRL1&&Packet automation control.
& & 0x05,& &// PKTCTRL0&&Packet automation control.
& & 0x00,& &// ADDR& && &Device address.
& & 0x0c& & // PKTLEN& & Packet length.
//*****************************************************************************************
//函数名:delay(unsigned int s)
//输入:时间
//输出:无
//功能描述:普通廷时,内部用
//*****************************************************************************************&&
static void delay(unsigned int s)
for(i=0; i&s; i++);
for(i=0; i&s; i++);
void halWait(INT16U timeout) {
& && &&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
&&_nop_();
& & } while (--timeout);
void SpiInit(void)
/*****************************************************************************************
//函数名:CpuInit()
//输入:无
//输出:无
//功能描述:SPI初始化程序
/*****************************************************************************************/
void CpuInit(void)
SpiInit();
delay(5000);
//*****************************************************************************************
//函数名:SpisendByte(INT8U dat)
//输入:发送的数据
//输出:无
//功能描述:SPI发送一个字节
//*****************************************************************************************
INT8U SpiTxRxByte(INT8U dat)
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_();
//*****************************************************************************************
//函数名:void RESET_CC1100(void)
//输入:无
//输出:无
//功能描述:复位CC1100
//*****************************************************************************************
void RESET_CC1100(void)
while (MISO);
& & SpiTxRxByte(CCxxx0_SRES);& &//写入复位命令
while (MISO);
& & CSN = 1;
//*****************************************************************************************
//函数名:void POWER_UP_RESET_CC1100(void)
//输入:无
//输出:无
//功能描述:上电复位CC1100
//*****************************************************************************************
void POWER_UP_RESET_CC1100(void)
halWait(1);
halWait(1);
halWait(41);
RESET_CC1100();& &&&//复位CC1100
//*****************************************************************************************
//函数名:void halSpiWriteReg(INT8U addr, INT8U value)
//输入:地址和配置字
//输出:无
//功能描述:SPI写寄存器
//*****************************************************************************************
void halSpiWriteReg(INT8U addr, INT8U value)
& & CSN = 0;
& & while (MISO);
& & SpiTxRxByte(addr);&&//写地址
& & SpiTxRxByte(value);&&//写入配置
& & CSN = 1;
//*****************************************************************************************
//函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
//输入:地址,写入缓冲区,写入个数
//输出:无
//功能描述:SPI连续写配置寄存器
//*****************************************************************************************
void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
& & INT8U i,
temp = addr | WRITE_BURST;
& & CSN = 0;
& & while (MISO);
& & SpiTxRxByte(temp);
& & for (i = 0; i & i++)
& && &&&SpiTxRxByte(buffer[i]);
& & CSN = 1;
//*****************************************************************************************
//函数名:void halSpiStrobe(INT8U strobe)
//输入:命令
//输出:无
//功能描述:SPI写命令
//*****************************************************************************************
void halSpiStrobe(INT8U strobe)
& & CSN = 0;
& & while (MISO);
& & SpiTxRxByte(strobe);&&//写入命令
& & CSN = 1;
//*****************************************************************************************
//函数名:INT8U halSpiReadReg(INT8U addr)
//输入:地址
//输出:该寄存器的配置字
//功能描述:SPI读寄存器
//*****************************************************************************************
INT8U halSpiReadReg(INT8U addr)
INT8U temp,
& & temp = addr|READ_SINGLE;//读寄存器命令
while (MISO);
SpiTxRxByte(temp);
value = SpiTxRxByte(0);
//*****************************************************************************************
//函数名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
//输入:地址,读出数据后暂存的缓冲区,读出配置个数
//输出:无
//功能描述:SPI连续写配置寄存器
//*****************************************************************************************
void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
& & INT8U i,
temp = addr | READ_BURST;&&//写入要读的配置寄存器地址和读命令
& & CSN = 0;
& & while (MISO);
SpiTxRxByte(temp);&&
& & for (i = 0; i & i++)
& && &&&buffer[i] = SpiTxRxByte(0);
& & CSN = 1;
//*****************************************************************************************
//函数名:INT8U halSpiReadReg(INT8U addr)
//输入:地址
//输出:该状态寄存器当前值
//功能描述:SPI读状态寄存器
//*****************************************************************************************
INT8U halSpiReadStatus(INT8U addr)
& & INT8U value,
temp = addr | READ_BURST;&&//写入要读的状态寄存器的地址同时写入读命令
& & CSN = 0;
& & while (MISO);
& & SpiTxRxByte(temp);
value = SpiTxRxByte(0);
//*****************************************************************************************
//函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
//输入:无
//输出:无
//功能描述:配置CC1100的寄存器
//*****************************************************************************************
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);
//*****************************************************************************************
//函数名:void halRfSendPacket(INT8U *txBuffer, INT8U size)
//输入:发送的缓冲区,发送数据个数
//输出:无
//功能描述: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);
void setRxMode(void)
& & halSpiStrobe(CCxxx0_SRX);&&//进入接收状态
// Bit masks corresponding to STATE[2:0] in the status byte returned on MISO
#define CCxx00_STATE_BM& && && && && &&&0x70
#define CCxx00_FIFO_BYTES_AVAILABLE_BM&&0x0F
#define CCxx00_STATE_TX_BM& && && && &&&0x20
#define CCxx00_STATE_TX_UNDERFLOW_BM& & 0x70
#define CCxx00_STATE_RX_BM& && && && &&&0x10
#define CCxx00_STATE_RX_OVERFLOW_BM& &&&0x60
#define CCxx00_STATE_IDLE_BM& && && && &0x00
static INT8U RfGetRxStatus(void)
INT8U temp, spiRxStatus1,spiRxStatus2;
INT8U i=4;// 循环测试次数
& & temp = CCxxx0_SNOP|READ_SINGLE;//读寄存器命令
while (MISO);
SpiTxRxByte(temp);
spiRxStatus1 = SpiTxRxByte(0);
&&SpiTxRxByte(temp);
&&spiRxStatus2 = SpiTxRxByte(0);
&&if(spiRxStatus1 == spiRxStatus2)
& &if( (spiRxStatus1 & CCxx00_STATE_BM) == CCxx00_STATE_RX_OVERFLOW_BM)
& && && && && &halSpiStrobe(CCxxx0_SFRX);
& && &return 0;
& && &return 1;
& &spiRxStatus1=spiRxStatus2;
while(i--);
& & return 0;
INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
& & INT8U status[2];
& & INT8U packetL
INT8U i=(*length)*4;&&// 具体多少要根据datarate和length来决定
& & halSpiStrobe(CCxxx0_SRX);&&//进入接收状态
//delay(5);
& & //while (!GDO1);
& & //while (GDO1);
while (GDO0)
&&delay(2);
& &&&return 0;& &&&
& & if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
& && &&&packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
& && &&&if (packetLength &= *length)& &//如果所要的有效数据长度小于等于接收到的数据包的长度
& && && && &halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
& && && && &*length = packetL& & //把接收数据长度的修改为当前数据的长度
& && && && &// 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);& &//如果校验成功返回接收成功
& && && && &*length = packetL
& && && && &halSpiStrobe(CCxxx0_SFRX);&&//清洗接收缓冲区
& && && && &return 0;
&&return 0;
void main(void)
INT8U i,leng =4;
INT8U tf =0;
INT8U TxBuf[4]={0};&&// 8字节, 如果需要更长的数据包,请正确设置
INT8U RxBuf[4]={0};
CpuInit();
POWER_UP_RESET_CC1100();
halRfWriteRfSettings();
halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
delay(6000);& && && && && & //到此总散是初始化完毕了,下面进入正题
& &&&while(1)
/*****************************************************************************************************************
& && && && && && && && && && && && && && && && && && && && && & 接受程序
*****************************************************************************************************************
halRfSendPacket(TxBuf, leng)& && && && && && &&&//发数据的时候只要调用这个函数就可以了,TxBuf是个数组要发什么就把什么写进去,后面是发送的
& && && && && && && && && && && && && && && && && && && && && && &&&//位数
/*****************************************************************************************************************
& && && && && && && && && && && && && && && && && && && && && & 发送程序
*****************************************************************************************************************/
if(halRfReceivePacket(rxBuf, leng))//每次执行一次if语句的话他都会检测函数的返还值是否为非零,非零则执行if语句
{& && && && && && && && && && && && && && && && && && && && && &&&//&&rxBuf数组接受发来的数据leng设置接受的位数& && && && && && && &
他是不是很可爱哦。。。。。。。
 好东西,学习一下,谢谢!
 谢谢分享了。。。。
怎么不得呢???
我也是按这样做了,但是不得呢???
海尔集成半导体推出了个芯片型号HW3000,用量巨大,距离有2.5公里双向,与si4463差不多,比si4432 si4438远,比A7108 和A7139好很多,如果是10kpbs,比sx1278 远。LoRa没办法快速率,可了解,推荐!HW3000超低双向无线fsk模块完美替代CC1101、CC1120、A7139、A7108、si4432、si4438、si4463
Powered by

我要回帖

更多关于 世界上最远的距离 的文章

 

随机推荐