2548|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

了解CC2500无线模块的运用 [复制链接]

CC2500芯片,是TI(原Chipcon被TI收购)推出的一款超低功耗、低成本的无线收发模块,其载频范围在2.400GHz~2.483GHz内可调,可用来实现多信道通信。它支持多种调制方式,包括FSK、GFSK、OOK和MSK,数据传输速率最高可达500kb/s。CC2500还为信息包处理、数据缓冲、脉冲传送、空闲信道评估、连接品质指示和电磁唤醒等功能提供了额外的硬件支持。它有四种主要的状态:接收(RX)、发送(TX)、空闲(IDLE)和休眠(SLEEP)
基本特点(1) 2400-2483.5 MHz的ISM和SRD频段
(2) 最高工作速率500kbps,支持2-FSK、GFSK和MSK调制方式
(3) 高灵敏度(-101dBm在10Kbps 1%)
(4) 内置硬件CRC 检错和点对多点通信地址控制
(5) 较低的电流消耗(RX中,13.3mA)
(6) 可编程控制的输出功率,对所有的支持频率可达 1dBm
(7) 支持低功率电磁波激活功能
(8) 支持传输前自动清理信道访问(CCA),即载波侦听系统
(9) 快速频率变动合成器带来的合适的频率跳跃系统
(10) 模块可软件设地址,软件编程非常方便
(11) 标准DIP间距接口,便于嵌入式应用
(12) 单独的64字节RX和TX数据FIFO
WOR功能:为了节约电能,射频芯片通常采用休眠模式。芯片在休眠时势必会丢失信息,CC22500的WOR(Wakeup-on-Radio)功能能很好地避免这点。WOR功能保证芯片在深度睡眠时周期性地苏醒,探听周围是否有信号,这个过程不需要CPU的中断,如果有数据包成功接收,芯片可通过引脚输出中断通知MCU读取。
RSSI和LQI功能:RSSI反映接收信号强度,LQI反映信号的连接质量,两者都可以通过读取芯片的寄存器得到。LQI虽然能够判断连接质量,但会因调制方式的不同而不同。RSSI是判断两个节点距离的很好的参数。在从RSSI寄存器中读到数值后我们需要进行一系列转化,才能得到接收强度值。
   CCA功能:CCA(Clear Channel Assessment)能够指示当前信道是否处于空闲状态。其作用与CSMA相似。当芯片要转入发送模式时,会首先检查信道,只有当信道为空闲时,才进入发送模式,否则停留在原模式或由编程设定进入其他模式。

典型应用场合无线遥控,无线鼠标,无线键盘;
工业无线控制,自动化数据采集系统;
无线传感器,无线电子标签,遥控玩具;
水、气、热、电等居民计量表具无线自动抄表;


                                                                                               CC2420是Chipcon(已被TI收购)公司推出的首款符合2.4GHz IEEE802.15.4标准的射频收发器。该器件包括众多功能,是第一款适用于ZigBee产品的RF器件。它基于SmartRF 03技术,以0.18um CMOS工艺制成,只需极少外部元器件,工作在2400-2483.5MHZ 的ISM 频段由一个完全集成的频率调制器一个带解调器的接收器一个功率放大器一个晶体震荡器和一个调节器组成。可自动产生前导码,CRC 可以很容易通过SPI 接口进行编程配置,电流消耗低。性能稳定且功耗极低。CC2420的选择性和敏感性指数可确保短距离通信的有效性和可靠性。利用此芯片开发的无线通信设备支持数据传输率高达250kbps可以实现多点对多点的快速组网。
基本特点:(1) 工作在2400-2483.5 MHz的ISM和SRD频段.
-采用直接序列扩频方式.
-工作速率250kbps,码片速率2 MChip/s.
-使用 O-QPSK调制方式.
-高灵敏度(-95dBm).
-较低的电流消耗(RX :13.3 mA TX:17.4 mA).
-抗邻频道干扰能力强(39dB)
-内部集成有VCO、LNA、PA以及电源整流器.
-采用低电压供电(2.1~3.6V).
-输出功率编程可控.
(2) IEEE802.15.4-2003标准MAC层硬件支持.
-前导码与同步字段自动生成与检测.
-CRC-16自动生成与检测.
-空闲信道检测.
-能量检测、接收信号强度与链路质量指示.
-MAC层安全保护(CTR,CBC-MAC,CCM)支持.
(3) 采用4线SPI标准接口,便于MCU配置.
(4) 独立的128字节RX和128字节TX数据FIFO.
典型应用场合:无线传感器网络
住宅、建筑物(智能家居)控制
工业仪器仪表无线数据采集和控制
无线鼠标、无线键盘、无线类玩具等消费电子

无线门禁、物流跟踪、仓库巡检等RFID有源电子标签

程序参考设计用CC2420模块无需掌握任何专业无线或高频方面的理论,读者只需要具备一定的C语言程序基础即可。可参考CC2420官方手册或向我们寻求技术支持。
同时,为便于用户开发,我们提供系列配套评估套件,为产品开发保驾护航,使无线应用开发大大加速,并避免不必要的误区。以下为范例程序中的部分相关代码段。
CC2420寄存器读写配置CC2420通过SPI接口与单片机通讯,因此必须首先了解SPI接口。标配SPI外围串行接口由四条线构成:
      MOSI主机输出从机输入     (主机写操作)
      MISO主机输入从机输出     (主机读操作)
      SCK 串行时钟信号,由主机控制
      CSN 片选信号,低电平有效
SPI读操作代码uint8 SPI_Read(void)
{
    uint8 i,rxdata;
    rxdata = 0x00;
    for (i = 0;i < 8;i++)
    {
       rxdata = rxdata<<1;
       SCLK_ON();
       if (MISO_IN)
      {   
           rxdata |= 0x01;
       }
       else
       {
           rxdata &= ~0x01;
       }
       SCLK_OFF();   
     }
     return rxdata;
}
SPI写操作代码void SPI_Write(uint8 txdata)
{
    uint8 i;
    for (i = 0;i < 8;i++)
    {
       if (txdata&0x80)  
       {
           MOSI_ON();
       }
       else
       {
           MOSI_OFF();
       }
       SCLK_ON();
       txdata = txdata<<1;
       SCLK_OFF();   
    }
}
CC2420配置寄存器读操作uint16 CC2420_ReadReg(uint8  addr)
{
    uint16 value;
    CSN_OFF();                  
    SPI_Write(addr|REG_READ);      
    value = SPI_Word_Read();         
    CSN_ON();         
    return value;
}
CC2420配置寄存器写操作void  CC2420_WriteReg(uint8  addr, uint16 value)
{
    CSN_OFF();                                 
    SPI_Write(addr|REG_WRITE);      
    SPI_Word_Write(value);         
    CSN_ON();                 
}
CC2420 RAM 读操作uint8 CC2420_RAM_Read(uint8 addr,uint8 block)
{
    uint8 value;
    CSN_OFF();        
    SPI_Write(addr|RAM);
    SPI_Write((block<<6)|RAM_READ);
    value = SPI_Read();
    CSN_ON();  
    return value;
}
CC2420 RAM写操作void CC2420_RAM_Write(uint8  addr,uint8 block, uint8 value)
{
    CSN_OFF();        
    SPI_Write(addr|RAM);
    SPI_Write((block<<6)|RAM_WRITE);
    SPI_Write(value);
    CSN_ON();  
}
CC2420初始化void CC2420_Init(void)
{  
    RESET_OFF();
    delay_ms(10);
    RESET_ON();
    delay_ms(10);
    CC2420_Command(CMD_SXOSCON);
    delay_ms(10);
    CC2420_PSDU[ 1 ] =
(PAN_ID_COMPRESSION<<6)|(ACKNOWLEDGMENT_REQUEST<<5)|
(FRAME_PENDING<<4)|(SECURITY_ENABLE<<3)|(FRAME_TYPE_DATA<<0);
    CC2420_PSDU[ 2 ] =
(SOURCE_ADDRESSING_MODE<<6)|(FRAME_VERSION<<4)|
(DEST_ADDRESSING_MODE<<2);
    CC2420_PSDU[ 3 ] = SEQUENCE_NUMBER;
    CC2420_PSDU[ 4 ] =  CC2420_Destination_PANID[0];
    CC2420_PSDU[ 5 ] =  CC2420_Destination_PANID[1];
    CC2420_PSDU[ 6 ] =  CC2420_Destination_IEEEAddr[0];
    CC2420_PSDU[ 7 ] =  CC2420_Destination_IEEEAddr[1];
    CC2420_PSDU[ 8 ] =  CC2420_Destination_IEEEAddr[2];  
    CC2420_PSDU[ 9 ] =  CC2420_Destination_IEEEAddr[3];
    CC2420_PSDU[10] =  CC2420_Destination_IEEEAddr[4];
    CC2420_PSDU[11] =  CC2420_Destination_IEEEAddr[5];
    CC2420_PSDU[12] =  CC2420_Destination_IEEEAddr[6];
    CC2420_PSDU[13] =  CC2420_Destination_IEEEAddr[7];
    CC2420_PSDU[14] =  CC2420_Source_PANID[0];
    CC2420_PSDU[15] =  CC2420_Source_PANID[1];
    CC2420_RAM_Write(RAM_PANID, 2,  CC2420_Source_PANID[0]);
    CC2420_RAM_Write(RAM_PANID+1, 2, CC2420_Source_PANID[1]);
    CC2420_PSDU[16] =  CC2420_Source_IEEEAddr[0];
    CC2420_PSDU[17] =  CC2420_Source_IEEEAddr[1];
    CC2420_PSDU[18] =  CC2420_Source_IEEEAddr[2];
    CC2420_PSDU[19] =  CC2420_Source_IEEEAddr[3];
    CC2420_PSDU[20 ] = CC2420_Source_IEEEAddr[4];
    CC2420_PSDU[21] =  CC2420_Source_IEEEAddr[5];
    CC2420_PSDU[22] =  CC2420_Source_IEEEAddr[6];
    CC2420_PSDU[23] =  CC2420_Source_IEEEAddr[7];
    CC2420_RAM_Write(RAM_IEEEADR, 2, CC2420_Source_IEEEAddr[0]);
    CC2420_RAM_Write(RAM_IEEEADR+1, 2, CC2420_Source_IEEEAddr[1]);
    CC2420_RAM_Write(RAM_IEEEADR+2, 2, CC2420_Source_IEEEAddr[2]);
    CC2420_RAM_Write(RAM_IEEEADR+3, 2, CC2420_Source_IEEEAddr[3]);
    CC2420_RAM_Write(RAM_IEEEADR+4, 2, CC2420_Source_IEEEAddr[4]);
    CC2420_RAM_Write(RAM_IEEEADR+5, 2, CC2420_Source_IEEEAddr[5]);
    CC2420_RAM_Write(RAM_IEEEADR+6, 2, CC2420_Source_IEEEAddr[6]);
    CC2420_RAM_Write(RAM_IEEEADR+7, 2, CC2420_Source_IEEEAddr[7]);
CC2420_WriteReg(REG_MDMCTRL0, CCA_HYST|CCA_MODE|PREAMBLE_LENGTH|AUTOCRC|ADR_DECODE);
    CC2420_WriteReg(REG_SYNCWORD,SYNCWORD);
    CC2420_WriteReg(REG_SECCTRL0,0);
    CSN_OFF();                  
    SPI_Write(REG_RXFIFO|REG_READ);   
    SPI_Read();
    CSN_ON();     
    CC2420_Command(CMD_SFLUSHRX);
    CC2420_Command(CMD_SFLUSHTX);
    delay_ms(10);
}
CC2420 FIFO发送流程FIFO写数据操作void  CC2420_WriteTXFIFO(void)
{
    uint8 i;
    CC2420_Command(CMD_SFLUSHTX);
    CSN_OFF();                                 
    SPI_Write(REG_TXFIFO|REG_WRITE);      
    SPI_Write(CC2420_PSDU[0]);
    for(i=0;i
    {
       SPI_Write(CC2420_PSDU[1+i]);
    }      
    CSN_ON();   
}
FIFO数据发送操作void CC2420_TxPacket(void)
{
    CC2420_Command(CMD_SRFOFF);
    CC2420_Command(CMD_STXON);
    while(!SFD_IN);
    while(SFD_IN);
}
CC2420 FIFO接收流程接收模式设置void CC2420_SetRxMode(void)
{
    CC2420_Command(CMD_SRFOFF);
    CC2420_Command(CMD_SRXON);
}   
FIFO接收数据uint8 CC2420_RxPacket(void)
{
     if((!SFD_IN)&&(FIFO_IN))
    {
       return TRUE;
    }
      return FALSE;
}
收到数据后读取FIFO数据void CC2420_ReadRXFIFO(void)
{
    uint8 i;
    CSN_OFF();                  
    SPI_Write(REG_RXFIFO|REG_READ);      
    CC2420_PSDU[0] = SPI_Read();  
    for(i=0;i
    {
       CC2420_PSDU[1+i] = SPI_Read();
    }
    CSN_ON();         
    CC2420_Command(CMD_SFLUSHRX); }
无线应用注意事项(1) 无线模块的VCC电压范围为 1.8V-3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。推荐电压3.3V左右。
(2) 除电源VCC和接地端,其余脚都可以直接和普通的51单片机IO口直接相连,无需电平转换。当然对3V左右的单片机更加适用了。
(3) 硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI不需要单片机真正的串口介入,只需要普通的单片机IO口就可以了,当然用串口也可以了。模块按照接口提示和母板的逻辑地连接起来
(4) 标准DIP插针,如需要其他封装接口,或其他形式的接口,可联系我们定做。
(5) 任何单片机都可实现对无线模块的数据收发控制,并可根据我们提供的程序,然后结合自己擅长的单片机型号进行移植;
(6) 频道的间隔的说明:实际要想2个模块同时发射不相互干扰,两者频道间隔应该至少相差1MHZ,这在组网时必须注意,否则同频比干扰。
(7) 实际用户可能会应用其他自己熟悉的单片机做为主控芯片,所以,建议大家在移植时注意以下4点:
A:确保IO是输入输出方式,且必须设置成数字IO;
B:注意与使用的IO相关的寄存器设置,尤其是带外部中断、带AD功能的IO,相关寄存器一定要设置好;
C:调试时先写配置字,然后控制数据收发
D:注意工作模式切换时间

此帖出自RF/无线论坛
点赞 关注
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表