3057|7

1025

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【我与TI的结缘】+ TI伴我成长 [复制链接]

  本帖最后由 wudianjun2001 于 2014-12-30 14:10 编辑

    时光匆匆,岁月如梭,365个日子转眼即逝!新的一年又将到来,回首往昔,思绪万千。工作近10年来,学习、工作中接触过TI的芯片的机会不少,从最早的430到后来的CC2540,CC2530,然后是最近用到的CC1101,TI一直是比不可少的。
    这么多年TI也在不断的发张壮大,芯片系列型号也在不断的增多扩大,功能也越来越强大,从8位,16位到32位,能满足大部分场合的使用,越来越多的工程师也加入到TI的行列中来。
    过去的东西就不多说了,就说说最近用到CC1101的项目吧。这个项目属于无线温控器产品。我们的温控器主要是家庭使用,用于家庭供暖的控制。
      温控器用来采集房间温度,和设置的温度进行比较,然后控制制暖设备的开关或调节。一般的温控器本来带有控制开关直接控制供暖设备的打开或关闭,或者通过模拟量输出去调节供暖设备。而无线温控器的采集和设置端和控制端是分开的,一般分负责温度的采集和设置等处理,然后无线发送数据到控制端进行供暖的控制。
      CC1101就负责无线部分的通讯,433MHZ的频段传输距离比较远,穿透能力强,编程代码简单,通过简单的SPI接口就可以使用了,TI官方提供的配置软件SmartRF Studio 7功能也很强大,通过这个软件可以详细的了解和配置无线部分的参数,加快开发的进度。

      下面说说关于这个项目的内容,只说无线温控器的采集和设置端,CC1101只是其中的无线收发部分。采集和设置端我们成为无线温控器,控制端我们称为中心控制器。
       这套系统包括数个房间无线温控器和一个中心控制器。一般家庭有多个房间,每个房间放一个无线温控器(其中有温度采集模块),该温控器可以设置房间要达到的温度,当温度到达要控制的低温或高温时通过433无线和中心控制器通讯,通知中心控制器打开或关闭对应房间的供暖阀门(可以是水热或其他方式)。可以通过远程登陆中心服务器查看对应房间的温度(这时中心控制器主动问各个房间要温度数据),强制打开或对应任意房间的供暖。
      房间的无线温控器,可以设置不同时段的多个温度值,行业上要7天编程功能(即周一到周日),每天最多6个时间段。实现一周内七天,每天多个时间段不同的温度的控制。
      下面给出房间无线温控器的样品图片,这个是无线和有线两用的,无线的话焊接上无线模块就可以使用了。

最新回复

CC1101这个芯片比较老了,不过也是比较经典的一款  详情 回复 发表于 2015-1-19 10:41
点赞 关注
 

回复
举报

1025

帖子

1

TA的资源

一粒金砂(高级)

沙发
 
本帖最后由 wudianjun2001 于 2014-12-31 11:00 编辑

沙发自己占,以留增加内容
贴出这个项目CC1101部分的程序
/****************************************************************************
CC1101.h
2014-01-10
*****************************************************************************/

#ifndef __CC1101_H
#define __CC1101_H

#ifdef __cplusplus
extern "C" {
#endif

#include

//#include "main.h"


//*****************************************************************************************
// CC1100 STROBE, CONTROL AND STATUS REGSITER
#define CC1101_IOCFG2       0x00        // GDO2 output pin configuration
#define CC1101_IOCFG1       0x01        // GDO1 output pin configuration
#define CC1101_IOCFG0       0x02        // GDO0 output pin configuration
#define CC1101_FIFOTHR      0x03        // RX FIFO and TX FIFO thresholds
#define CC1101_SYNC1        0x04        // Sync word, high uint8_t
#define CC1101_SYNC0        0x05        // Sync word, low uint8_t
#define CC1101_PKTLEN       0x06        // Packet length
#define CC1101_PKTCTRL1     0x07        // Packet automation control
#define CC1101_PKTCTRL0     0x08        // Packet automation control
#define CC1101_ADDR         0x09        // Device address
#define CC1101_CHANNR       0x0A        // Channel number
#define CC1101_FSCTRL1      0x0B        // Frequency synthesizer control
#define CC1101_FSCTRL0      0x0C        // Frequency synthesizer control
#define CC1101_FREQ2        0x0D        // Frequency control word, high uint8_t
#define CC1101_FREQ1        0x0E        // Frequency control word, middle uint8_t
#define CC1101_FREQ0        0x0F        // Frequency control word, low uint8_t
#define CC1101_MDMCFG4      0x10        // Modem configuration
#define CC1101_MDMCFG3      0x11        // Modem configuration
#define CC1101_MDMCFG2      0x12        // Modem configuration
#define CC1101_MDMCFG1      0x13        // Modem configuration
#define CC1101_MDMCFG0      0x14        // Modem configuration
#define CC1101_DEVIATN      0x15        // Modem deviation setting
#define CC1101_MCSM2        0x16        // Main Radio Control State Machine configuration
#define CC1101_MCSM1        0x17        // Main Radio Control State Machine configuration
#define CC1101_MCSM0        0x18        // Main Radio Control State Machine configuration
#define CC1101_FOCCFG       0x19        // Frequency Offset Compensation configuration
#define CC1101_BSCFG        0x1A        // Bit Synchronization configuration
#define CC1101_AGCCTRL2     0x1B        // AGC control
#define CC1101_AGCCTRL1     0x1C        // AGC control
#define CC1101_AGCCTRL0     0x1D        // AGC control
#define CC1101_WOREVT1      0x1E        // High uint8_t Event 0 timeout
#define CC1101_WOREVT0      0x1F        // Low uint8_t Event 0 timeout
#define CC1101_WORCTRL      0x20        // Wake On Radio control
#define CC1101_FREND1       0x21        // Front end RX configuration
#define CC1101_FREND0       0x22        // Front end TX configuration
#define CC1101_FSCAL3       0x23        // Frequency synthesizer calibration
#define CC1101_FSCAL2       0x24        // Frequency synthesizer calibration
#define CC1101_FSCAL1       0x25        // Frequency synthesizer calibration
#define CC1101_FSCAL0       0x26        // Frequency synthesizer calibration
#define CC1101_RCCTRL1      0x27        // RC oscillator configuration
#define CC1101_RCCTRL0      0x28        // RC oscillator configuration
#define CC1101_FSTEST       0x29        // Frequency synthesizer calibration control
#define CC1101_PTEST        0x2A        // Production test
#define CC1101_AGCTEST      0x2B        // AGC test
#define CC1101_TEST2        0x2C        // Various test settings
#define CC1101_TEST1        0x2D        // Various test settings
#define CC1101_TEST0        0x2E        // Various test settings

// Strobe commands
#define CC1101_SRES         0x30        // Reset chip.
#define CC1101_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 CC1101_SXOFF        0x32        // Turn off crystal oscillator.
#define CC1101_SCAL         0x33        // Calibrate frequency synthesizer and turn it off
                                        // (enables quick start).
#define CC1101_SRX          0x34        // Enable RX. Perform calibration first if coming from IDLE and
                                        // MCSM0.FS_AUTOCAL=1.
#define CC1101_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 CC1101_SIDLE        0x36        // Exit RX / TX, turn off frequency synthesizer and exit
                                        // Wake-On-Radio mode if applicable.
#define CC1101_SAFC         0x37        // Perform AFC adjustment of the frequency synthesizer
#define CC1101_SWOR         0x38        // Start automatic RX polling sequence (Wake-on-Radio)
#define CC1101_SPWD         0x39        // Enter power down mode when CSn goes high.
#define CC1101_SFRX         0x3A        // Flush the RX FIFO buffer.
#define CC1101_SFTX         0x3B        // Flush the TX FIFO buffer.
#define CC1101_SWORRST      0x3C        // Reset real time clock.
#define CC1101_SNOP         0x3D        // No operation. May be used to pad strobe commands to two
                                        // uint8_ts for simpler software.
#define CC1101_PARTNUM      0x30
#define CC1101_VERSION      0x31
#define CC1101_FREQEST      0x32
#define CC1101_LQI          0x33
#define CC1101_RSSI         0x34
#define CC1101_MARCSTATE    0x35
#define CC1101_WORTIME1     0x36
#define CC1101_WORTIME0     0x37
#define CC1101_PKTSTATUS    0x38
#define CC1101_VCO_VC_DAC   0x39
#define CC1101_TXBYTES      0x3A
#define CC1101_RXBYTES      0x3B

#define CC1101_PATABLE      0x3E
#define CC1101_TXFIFO       0x3F
#define CC1101_RXFIFO       0x3F
//*****************************************************************************************

#define WRITE_BURST             0x40                                                //连续写入多个寄存器
#define READ_SINGLE             0x80                                                //读单个寄存器
#define READ_BURST              0xC0                                                //连续读多个寄存器
#define BYTES_IN_RXFIFO     0x7F                                                  //接收缓冲区的有效字节数
#define CRC_OK              0x80                                                 //CRC校验通过位标志


// RF_SETTINGS is a data structure which contains all relevant CC1101 registers
typedef struct S_RF_SETTINGS
{
        uint8_t FSCTRL2;                //自已加的
    uint8_t FSCTRL1;   // Frequency synthesizer control.
    uint8_t FSCTRL0;   // Frequency synthesizer control.
    uint8_t FREQ2;     // Frequency control word, high uint8_t.
    uint8_t FREQ1;     // Frequency control word, middle uint8_t.
    uint8_t FREQ0;     // Frequency control word, low uint8_t.
    uint8_t MDMCFG4;   // Modem configuration.
    uint8_t MDMCFG3;   // Modem configuration.
    uint8_t MDMCFG2;   // Modem configuration.
    uint8_t MDMCFG1;   // Modem configuration.
    uint8_t MDMCFG0;   // Modem configuration.
    uint8_t CHANNR;    // Channel number.
    uint8_t DEVIATN;   // Modem deviation setting (when FSK modulation is enabled).
    uint8_t FREND1;    // Front end RX configuration.
    uint8_t FREND0;    // Front end RX configuration.
    uint8_t MCSM0;     // Main Radio Control State Machine configuration.
    uint8_t FOCCFG;    // Frequency Offset Compensation Configuration.
    uint8_t BSCFG;     // Bit synchronization Configuration.
    uint8_t AGCCTRL2;  // AGC control.
        uint8_t AGCCTRL1;  // AGC control.
    uint8_t AGCCTRL0;  // AGC control.
    uint8_t FSCAL3;    // Frequency synthesizer calibration.
    uint8_t FSCAL2;    // Frequency synthesizer calibration.
        uint8_t FSCAL1;    // Frequency synthesizer calibration.
    uint8_t FSCAL0;    // Frequency synthesizer calibration.
    uint8_t FSTEST;    // Frequency synthesizer calibration control
    uint8_t TEST2;     // Various test settings.
    uint8_t TEST1;     // Various test settings.
    uint8_t TEST0;     // Various test settings.
    uint8_t IOCFG2;    // GDO2 output pin configuration
    uint8_t IOCFG0;    // GDO0 output pin configuration
    uint8_t PKTCTRL1;  // Packet automation control.
    uint8_t PKTCTRL0;  // Packet automation control.
    uint8_t ADDR;      // Device address.
    uint8_t PKTLEN;    // Packet length.
} RF_SETTINGS;

const RF_SETTINGS rfSettings =
{
        0x00,
    0x08,   // FSCTRL1   Frequency synthesizer control.中频计算
    0x00,   // FSCTRL0   Frequency synthesizer control.频率补偿

    0x10,   // FREQ2     Frequency control word, high byte.        这3个寄存器决定了基本频率=432.999817
    0xA7,   // FREQ1     Frequency control word, middle byte.
    0x62,   // FREQ0     Frequency control word, low byte.

    0xF6,   // MDMCFG4   Modem configuration.        这2个寄存器决定了数据速率=2.00224,接收滤波BW=58.035714
    0x43,   // MDMCFG3   Modem configuration.
    0x13,   // MDMCFG2   Modem configuration.        不采用曼彻斯特编码,30/32位同步词汇检测
    0x22,   // MDMCFG1   Modem configuration.        这2个寄存器决定了通道间隔频率=199.951172
    0xF8,   // MDMCFG0   Modem configuration.

    0x00,   // CHANNR    Channel number.        通道号设置为0,可得出最后的载波频率为=432.999817
    0x15,   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).        调制解调器偏差设置=5.157471
    0x56,   // FREND1    Front end RX configuration.前端 RX 配置
    0x10,   // FREND0    Front end RX configuration.前端 TX 配置   
    0x18,   // MCSM0     Main Radio Control State Machine configuration.手动校准频率
    0x16,   // FOCCFG    Frequency Offset Compensation Configuration.频率偏移补偿配置
    0x6C,   // 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. 开启CRC错误自动刷新功能,且FIFO后包含两个字节的状态State
    0x05,   // PKTCTRL0  Packet automation control.开启数据白化,开启CRC检验,可变数据包长度
    0x00,   // ADDR      Device address.        器件地址
    0x0c    // PKTLEN    Packet length.可变数据包长度,最大允许数据包长度为12字节
};


//*********************************************变量定义***************************************************
//***************更多功率参数设置可详细参考DATACC1100英文文档中第48-49页的参数表******************
//uint8_t PaTabel[8] = {0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04};  //-30dBm   功率最小
//uint8_t PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};  //0dBm
//uint8_t PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};   //10dBm     功率最大

//10, 7, 5, 0, -5, -10, -15, -20, dbm output power, 0x12 == -30dbm
uint8_t PaTabel[] = { 0xc0, 0xC8, 0x84, 0x60, 0x68, 0x34, 0x1D, 0x0E};

// Sync word qualifier mode = 30/32 sync word bits detected
// CRC autoflush = false
// Channel spacing = 199.951172
// Data format = Normal mode
// Data rate = 2.00224
// RX filter BW = 58.035714
// PA ramping = false
// Preamble count = 4
// Whitening = false
// Address config = No address check
// Carrier frequency = 432.999817
// Device address = 0
// TX power = 10
// Manchester enable = false
// CRC enable = true
// Deviation = 5.157471
// Packet length mode = Variable packet length mode. Packet length configured by the first byte after sync word
// Packet length = 255
// Modulation format = GFSK
// Base frequency = 432.999817
// Modulated = true
// Channel number = 0
// PA table #define PA_TABLE {0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}

static const uint8_t CC1101InitData[25][2]=
{
  {CC1101_IOCFG0,      0x06},        //
  {CC1101_FIFOTHR,     0x47},        //
  {CC1101_PKTCTRL0,    0x05},        //
  {CC1101_CHANNR,      0x00},        //通道号设置为0,可得出最后的载波频率为=432.999817
  {CC1101_FSCTRL1,     0x06},
  {CC1101_FREQ2,       0x10},        //这3个寄存器决定了基本频率=432.999817
  {CC1101_FREQ1,       0xA7},
  {CC1101_FREQ0,       0x62},
  {CC1101_MDMCFG4,     0xF6},        //这2个寄存器决定了数据速率=2.00224,接收滤波BW=58.035714
  {CC1101_MDMCFG3,     0x43},
  {CC1101_MDMCFG2,     0x13},        //不采用曼彻斯特编码,30/32位同步词汇检测
  {CC1101_MDMCFG1,     0x22},        //这2个寄存器决定了通道间隔频率=199.951172
  {CC1101_MDMCFG0,     0xF8},
  {CC1101_DEVIATN,     0x15},        //调制解调器偏差设置=5.157471
  {CC1101_MCSM1,       0x3B},        //
  {CC1101_MCSM0,       0x18},        //手动校准频率
  {CC1101_FOCCFG,      0x16},        //频率偏移补偿配置
  {CC1101_WORCTRL,     0xFB},        //
  {CC1101_FSCAL3,      0xE9},        //这4个寄存器,频率合成器校准
  {CC1101_FSCAL2,      0x2A},
  {CC1101_FSCAL1,      0x00},
  {CC1101_FSCAL0,      0x1F},
  {CC1101_TEST2,       0x81},       
  {CC1101_TEST1,       0x35},
  {CC1101_TEST0,       0x09},
};

#ifdef __cplusplus
}
#endif

#endif






/********************************************************************************************************
* 函数名称:CC1101_Read_Reg
* 函数功能:读单个寄存器的值。
* 入口参数:addr:                要读的寄存器的地址
* 出口参数:ret:                读出的寄存器的内容值
* 修改时间:2014-01-16
********************************************************************************************************/
uint8_t CC1101_Read_Reg (uint8_t addr)
{
    uint8_t ret = 0;

    CSN_LOW();
    while (GET_MISO());
    SPI_Deal_Byte(addr | READ_SINGLE);
    ret = SPI_Deal_Byte (0xFF);
    CSN_HIGHT();

    return ret;
}


/********************************************************************************************************
* 函数名称:CC1101_Read_MultiReg
* 函数功能:连续读多个寄存器的值。
* 入口参数:addr:                要读的第一个寄存器的地址
                        buff:                读出的寄存器的内容的存放缓冲区首地址
                        size:                要读的寄存器的个数
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Read_MultiReg (uint8_t addr, uint8_t *buff, uint8_t size)
{
    uint8_t i, j;

    CSN_LOW();
    while (GET_MISO());
    SPI_Deal_Byte (addr | READ_BURST);                                        //先发送要读的第一个寄存器地址
    for (i = 0; i < size; i ++)
    {
        for (j = 0; j < 20; j ++);                                                //延时
        * (buff + i) = SPI_Deal_Byte (0xFF);                        //读数据,返回值有效
    }
    CSN_HIGHT();
}


/********************************************************************************************************
* 函数名称:CC1101_Read_Status
* 函数功能:读状态寄存器的值。虽然是读单个寄存器,但是发送字节的高两位必须为1。
* 入口参数:addr:                要读的寄存器的地址
* 出口参数:ret:                读出的寄存器的内容值
* 修改时间:2014-01-16
********************************************************************************************************/
uint8_t CC1101_Read_Status (uint8_t addr)
{
    uint8_t ret = 0;

    CSN_LOW();
    while (GET_MISO());
    SPI_Deal_Byte (addr | READ_BURST);
    ret = SPI_Deal_Byte (0xFF);
    CSN_HIGHT();

    return ret;
}


/********************************************************************************************************
* 函数名称:CC1101_Set_TRMode
* 函数功能:设置器件为接收或发送模式。
* 入口参数:mode:                要设置的模式,接收或发送模式。
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Set_TRMode (TRMODE mode)
{
    if (mode == TX_MODE)
    {
        CC1101_Write_Reg(CC1101_IOCFG0,0x46);                        //当同步字符被接收到时,输出反相,
        CC1101_Write_Cmd (CC1101_STX);                                        //空闲状态:启用TX。
    }
    else if (mode == RX_MODE)
    {
        CC1101_Write_Reg(CC1101_IOCFG0,0x46);
        CC1101_Write_Cmd (CC1101_SRX);                                        //启用 RX
    }
}


/********************************************************************************************************
* 函数名称:CC1101_Write_Reg
* 函数功能:写单个寄存器的值。
* 入口参数:addr:                要写的寄存器的地址
                        ret:                要写的寄存器的内容值
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Write_Reg (uint8_t addr, uint8_t value)
{
    CSN_LOW();
    while (GET_MISO());
    SPI_Deal_Byte (addr);
    SPI_Deal_Byte (value);
    CSN_HIGHT();
}


/********************************************************************************************************
* 函数名称:CC1101_Write_MultiReg
* 函数功能:连续写多个寄存器的值。
* 入口参数:addr:                要写的第一个寄存器的地址
                        buff:                要写的数据存放的缓冲区首地址
                        size:                要写的寄存器的个数
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Write_MultiReg (uint8_t addr, uint8_t *buff, uint8_t size)
{
    uint8_t i;

    CSN_LOW();
    while (GET_MISO());
    SPI_Deal_Byte (addr | WRITE_BURST);
    for (i = 0; i < size; i ++)
    {
        SPI_Deal_Byte (*(buff + i));
    }
    CSN_HIGHT();
}


/********************************************************************************************************
* 函数名称:CC1101_Write_Cmd
* 函数功能:对模块写命令。
* 入口参数:command:        要写的命令。
        0x30 SRES                 重启芯片
        0x31 SFSTXON         开启和校准频率合成器(若 MCSM0.FS AUTOCAL=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字节。
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Write_Cmd (uint8_t command)
{
    CSN_LOW();
    while (GET_MISO());
    SPI_Deal_Byte (command);
    while (GET_MISO());
    CSN_HIGHT();
}


/********************************************************************************************************
* 函数名称:CC1101_Reset
* 函数功能:对芯片进行复位处理。
* 入口参数:无
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Reset (void)
{
    uint8_t x;

    CSN_HIGHT();
    CSN_LOW();
    CSN_HIGHT();
    for (x = 0; x < 100; x ++);                                                        //延时
    CC1101_Write_Cmd (CC1101_SRES);                                                //0x30 SRES 重启芯片
}


/********************************************************************************************************
* 函数名称:CC1101_Set_Idle
* 函数功能:设置芯片为空闲模式。
* 入口参数:无
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Set_Idle (void)
{
    CC1101_Write_Cmd(CC1101_SIDLE);                                                //0x36 SIDLE 离开RX/TX,关断频率合成器并离开电磁波激活模式若可用
}


/********************************************************************************************************
* 函数名称:CC1101_Clr_TXBuff
* 函数功能:清除发送缓冲区。
* 入口参数:无
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Clr_TXBuff (void)
{
    CC1101_Set_Idle();                                                                        //必须在空闲模式
    CC1101_Write_Cmd (CC1101_SFTX);                                                //0x3B SFTX 冲洗TX FIFO缓冲
}


/********************************************************************************************************
* 函数名称:CC1101_Clr_RXBuff
* 函数功能:清除接收缓冲区。
* 入口参数:无
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Clr_RXBuff (void)
{
    CC1101_Set_Idle();                                                                        //必须在空闲模式
    CC1101_Write_Cmd (CC1101_SFRX);                                                //0x3A SFRX 冲洗RX FIFO缓冲
}


/********************************************************************************************************
* 函数名称:CC1101_Send_Packet
* 函数功能:发送一包数据。
* 入口参数:txbuffer:        要发送的数据缓冲区首地址
                        size:                要发送的数据个数
                        mode:                要发送的模式,广播模式或地址检测模式
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Send_Packet (uint8_t *txbuffer, uint8_t size, TX_DATA_MODE mode)
{
    uint8_t address = 0;

    CSN_LOW();                                                                                  //拉低,使得模块退出低功耗模式
        CC1101_Set_Idle ();                                                                        //进入空闲模式
                               
    if (mode == BROADCAST)                                                     //广播模式
    {
            address = 0;
    }
    else if (mode == ADDRESS_CHECK)                                            //地址检测模式,要发送自己的地址
    {
            address = CC1101_Read_Reg (CC1101_ADDR);
    }

    CC1101_Clr_TXBuff();

    if ( (CC1101_Read_Reg (CC1101_PKTCTRL1) & ~0x03) != 0)//要地址检查的话发送数据包要加个地址字节
    {
        CC1101_Write_Reg (CC1101_TXFIFO, size + 1);
        CC1101_Write_Reg (CC1101_TXFIFO, address);
    }
    else                                                                                                //不要地址检查的话直接发送长度
    {
        CC1101_Write_Reg (CC1101_TXFIFO, size);
    }

    CC1101_Write_MultiReg (CC1101_TXFIFO, txbuffer, size);//写数据到发送缓冲区
    CC1101_Set_TRMode (TX_MODE);                                                //设置发送模式
    while (GET_GDO0() != 0);                                                        //常态为高电平,发送时为低电平
    while (GET_GDO0() == 0);

    CC1101_Clr_TXBuff();                                                                //清空发送缓冲区

    CC1101_Write_Cmd(CC1101_SPWD);                                        // 进入断电模式
    CSN_HIGHT();                                                                        // CS 拉高
}



/********************************************************************************************************
* 函数名称:CC1101_Get_RXCnt
* 函数功能:获取接收字节的个数。
* 入口参数:无
* 出口参数:                        接收到的字节长度
* 修改时间:2014-01-16
********************************************************************************************************/
uint8_t CC1101_Get_RXCnt (void)
{
    return  (CC1101_Read_Status (CC1101_RXBYTES) & BYTES_IN_RXFIFO);
}


/********************************************************************************************************
* 函数名称:CC1101_Set_Address
* 函数功能:设置地址和验证地址模式。
* 入口参数:address:        要设置的本机地址
                        AddressMode:要设置的地址模式,地址检查模式
                                0 (00)        无地址检查
                                1 (01)        地址检查,无广播
                                2 (10)        地址检查,0(0x00)广播
                                3 (11)        地址检查,0(0x00)和 255(0xFF)广播
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Set_Address (uint8_t address, ADDR_MODE AddressMode)
{
    uint8_t btmp = CC1101_Read_Reg (CC1101_PKTCTRL1) & ~0x03;

    CC1101_Write_Reg(CC1101_ADDR, address);                                                //写地址
    if      (AddressMode == BROAD_ALL)     {}
    else if (AddressMode == BROAD_NO )     { btmp |= 0x01; }
    else if (AddressMode == BROAD_0  )     { btmp |= 0x02; }
    else if (AddressMode == BROAD_0AND255) { btmp |= 0x03; }   
}


/********************************************************************************************************
* 函数名称:CC1101_Set_SYNC
* 函数功能:设置同步字符。
* 入口参数:sync:                要设置的同步字符
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Set_SYNC (uint16_t sync)
{
    CC1101_Write_Reg(CC1101_SYNC1, 0xFF & (sync >> 8));
    CC1101_Write_Reg(CC1101_SYNC0, 0xFF & sync);
}


/********************************************************************************************************
* 函数名称:CC1101_Recv_Packet
* 函数功能:接收数据包。
* 入口参数:rxBuffer:        为接收数据包缓冲区的首地址
* 出口参数:                        非0为接收的字节数,0为无数据
* 修改时间:2014-01-16
********************************************************************************************************/
uint8_t CC1101_Recv_Packet (uint8_t *rxBuffer)
{
    uint8_t status[2];
    uint8_t pktLen;
    uint16_t x;

    if (CC1101_Get_RXCnt() != 0)                                                //接收到的字节长度不为0
    {
        pktLen = CC1101_Read_Reg(CC1101_RXFIFO);        //读取数据包长度
        if ((CC1101_Read_Reg (CC1101_PKTCTRL1) & ~0x03) != 0)//要地址检查的话
        {
            x = CC1101_Read_Reg(CC1101_RXFIFO);
        }
        if (pktLen == 0)                                                           //接收数据包的长度
        {
                return 0;
        }
        else                        
        {
                pktLen --;
        }
        CC1101_Read_MultiReg(CC1101_RXFIFO, rxBuffer, pktLen);//读取数据包
        CC1101_Read_MultiReg(CC1101_RXFIFO, status, 2); //读取状态字节,读出CRC校验位

        CC1101_Clr_RXBuff();                                                        //清除接收缓冲区

        if (status[1] & CRC_OK)                                                 //判断校验是否正确
        {   
                return pktLen;
        }
        else                     
        {   
                return 0;
        }
    }
    else   
    {  
            return 0;
    }                                                                       //没接收到数据
}


/********************************************************************************************************
* 函数名称:CC1101_Init
* 函数功能:芯片初始化。
* 入口参数:无
* 出口参数:无
* 修改时间:2014-01-16
********************************************************************************************************/
void CC1101_Init (void)
{
    volatile uint8_t i, j;

    CC1101_Reset();   

    for (i = 0; i < 22; i++)
    {
        CC1101_Write_Reg (CC1101InitData[0], CC1101InitData[1]);
    }
    CC1101_Set_Address (0x05, BROAD_0AND255);
    CC1101_Set_SYNC (0x8799);
    CC1101_Write_Reg (CC1101_MDMCFG1, 0x72);                         //调制解调器配置

    CC1101_Write_MultiReg (CC1101_PATABLE, PaTabel, 8);

    i = CC1101_Read_Status (CC1101_PARTNUM);                        //测试,必须返回0x00
    i = CC1101_Read_Status (CC1101_VERSION);                        //测试,refer to the datasheet
}





 
 
 

回复

30

帖子

4

TA的资源

一粒金砂(中级)

板凳
 
我们现在用的也是TI的芯片,Omap平台的行业设备
 
 
 

回复

1025

帖子

1

TA的资源

一粒金砂(高级)

4
 
CC1101部分代码见2楼
 
 
 

回复

1025

帖子

1

TA的资源

一粒金砂(高级)

5
 
这个活动参加的人好像不多啊
 
 
 

回复

85

帖子

1

TA的资源

一粒金砂(中级)

6
 
不错哦,不过你的板子是不是应该做的更袖珍些,毕竟是属于智能家居,整个房间到处是这些不美观的东西,有点欠佳哦~

点评

这个板子是可以直接安装在86安装盒上的  详情 回复 发表于 2015-1-13 11:35
 
 
 

回复

1025

帖子

1

TA的资源

一粒金砂(高级)

7
 
易兮水 发表于 2015-1-13 11:28
不错哦,不过你的板子是不是应该做的更袖珍些,毕竟是属于智能家居,整个房间到处是这些不美观的东西,有点欠佳哦~
这个板子是可以直接安装在86安装盒上的



 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

8
 
CC1101这个芯片比较老了,不过也是比较经典的一款
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表