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<CC2420_PSDU[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[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:注意工作模式切換時間
|