ZigBee应用操作教育资料.doc
《ZigBee应用操作教育资料.doc》由会员分享,可在线阅读,更多相关《ZigBee应用操作教育资料.doc(135页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、ZigBee 学习之学习之 1点灯点灯我用的编译环境是 IARfor51 7.30B,再介绍一下我的开发板的情况,ZigBee 模块用的是 CC2430.这块芯片是一款Soc 的芯片,集成了 8051 内核和 ZigBee 射频部分,只要很少的外部电路就可以搭建一个射频模块。因为其中的是8051 的内核,所有对于熟悉 8051 系列的同学们来说,基本的一些操作就很简单了,这里我们在温习一下,顺便对CC2430 芯片进行一下熟悉。嵌入式的一大特点是其底层的软件和硬件紧密相关,如果没有数字电路的知识,那么作起来是很困难的。我们先介绍一下基本的管脚分配情况:P0 的 2 和 3 接到了一个 232
2、电压转换芯片上,可以用来和 PC进行通信,LCD_RST,LCD_CS,接的是 LCD 的复位和片选端,这里我用到的 LCD 是兼容 PCD8544 的 NOkia5110 的LCD,为 SPI 总线 LCD,84X48 点阵。CC2430_MOSI,CC2430_CLK 都接到 LCD 上了。P1_0 接到一个调试 LED 上面,为高电平点亮。下面的第一个实验就很简单了,我们只要把 P1_0 配置为通用 IO,输出方式,然后从这里输出高电平,那么就可以点亮这个 LED 了。用到的寄存器为:P1 配置寄存器 P1SEL,P1 方向寄存器 P1DIR程序如下:#include#define DE
3、BUG_LED P1_0void delay(unsigned int n)/26 cycles delaywhile(-n)asm(“NOP“);void LEDInit()P1SEL /P1_0 defined General purpose I/OP1DIR |= 0X01; /P1_0 defined Outputmain()LEDInit();while(1)DEBUG_LED = 1; /Led lightdelay(50000);DEBUG_LED = 0;delay(50000);编译通过以后就用 TI 的官方工具 SmartRF Flash Programmer 将生成的 H
4、EX 文件,烧录到 CC2430 吧,激动的时刻,呵呵如果点亮了这个小小的 LED 那么恭喜你,你的硬件因该是没有问的了,一个小小的胜利后我们就有更多的勇气和信心前进咯!ZigBee 学习之学习之 2SPIvoid LCD_IOInit()P0SEL P0DIR |= 0X03;P1SEL P1DIR |= 0XF0;void LCD_WriteOneByte(uchar data)uchar i = 0;for(i=0;ivoid delay(uint n)/26 cycles delaywhile(-n)asm(“NOP“);void LEDInit()P1SEL /P1_0 define
5、d General purpose I/OP1DIR |= 0X01; /P1_0 defined OutputDEBUG_LED = 1; /LED light up/=/Initial P1-USART1-SPIvoid SPIInit_U1_P1(void)PERCFG |= 0X02; /USART1.alt.2,P1P1SEL |= 0XE0; /P1,ISP,P1_4(LCD_DnC) defined general IOP2SEL |= 0X40; /USART1 has priorityU1GCR |= 0x20; /MSB first,Negative clock polar
6、ity,Data is output on MOSI on the falling edge of CLKU1GCR |= 19; /MAX Baud rate(17),falling edgeU1BAUD = 0;UTX1IF = 0; /Clear interrupt/=/P1-USART1-SPI Send One Bytevoid SPI_SendOne_U1_P1(uchar data)U1DBUF = data;while(!UTX1IF);UTX1IF = 0;/=/P1-USART1-SPI Send Multily Bytevoid SPI_Send_U1_P1(uchar
7、*data,uint length)while(length)SPI_SendOne_U1_P1(*data);data+;length -= 1;/=/LCD Use SPI BUS,Set the first display piex./When after call this function can direct call SPI data output function/0packetLength = payloadLength + BASIC_RF_PACKET_OVERHEAD_SIZE;/pConfig 为基本配置数据结构/*typedef struct uint16 myAd
8、dr;uint16 panId;uint8 channel;uint8 ackRequest; basicRfCfg_t;*/pHdr-frameControlField = pConfig-ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK;fcf= pConfig-ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK;/分别得到 16 位数的低 8 位和高 8 位/#define HI_UINT16(a) (uint16)(a) 8) pHdr-fcf1 = HI_UINT16(fcf);/得
9、到数据序列pHdr-seqNumber= txState.txSeqNumber;pHdr-panId= pConfig-panId;pHdr-destAddr= destAddr;pHdr-srcAddr= pConfig-myAddr;#ifdef SECURITY_CCM/ Add security to FCF, length and security headerpHdr-fcf0 |= BASIC_RF_SEC_ENABLED_FCF_BM_L;pHdr-packetLength += PKT_LEN_MIC;pHdr-packetLength += BASIC_RF_AUX_HD
10、R_LENGTH;pHdr-securityControl= SECURITY_CONTROL;pHdr-frameCounter0= LO_UINT16(LO_UINT32(txState.frameCounter);pHdr-frameCounter1= HI_UINT16(LO_UINT32(txState.frameCounter);pHdr-frameCounter2= LO_UINT16(HI_UINT32(txState.frameCounter);pHdr-frameCounter3= HI_UINT16(HI_UINT32(txState.frameCounter);#end
11、if/ Make sure bytefields are network byte order/这里把大的字节放到了前面,但有不是完全按从大到小的顺序排列字节,不知道为什么?UINT16_HTON(pHdr-panId);UINT16_HTON(pHdr-destAddr);UINT16_HTON(pHdr-srcAddr);/1 字节长度,2 字节 FCF,1 字节序列,2 字节 PanID,2 字节目的地址,2 字节源地址=10return BASIC_RF_HDR_SIZE;/* fn basicRfBuildMpdu* brief Builds mpdu (MAC header + p
12、ayload) according to IEEE 802.15.4* frame format* param destAddr - Destination short address* pPayload - pointer to buffer with payload* payloadLength - length of payload buffer* return uint8 - length of mpdu*/构造 MPDUstatic uint8 basicRfBuildMpdu(uint16 destAddr, uint8* pPayload, uint8 payloadLength
13、)uint8 hdrLength, n;/txMpdu 是定义txMpduBASIC_RF_MAX_PAYLOAD_SIZE+BASIC_RF_PACKET_OVERHEAD_SIZE+1hdrLength = basicRfBuildHeader(txMpdu, destAddr, payloadLength);/将有效载荷数据放入 MPDU 单元中for(n=0;n0) *pData+= RFD;length-;*/读取 MPDU 的长度/ Read payload length.halRfReadRxBuf(/指定 MPDU 的长度字节的高位默认固定为 0,所以去掉高位,得到长度真实值p
14、Hdr-packetLength / Ignore MSB/ Is this an acknowledgment packet?/ Only ack packets may be 5 bytes in total.if (pHdr-packetLength = BASIC_RF_ACK_PACKET_SIZE) /如果只有 5 个字节长度,则此帧为应答帧/ Read the packethalRfReadRxBuf(/ Make sure byte fields are changed from network to host byte orderUINT16_NTOH(pHdr-panId)
15、;UINT16_NTOH(pHdr-destAddr);UINT16_NTOH(pHdr-srcAddr);#ifdef SECURITY_CCMUINT32_NTOH(pHdr-frameCounter);#endifrxi.ackRequest = !(pHdr-fcf0 /条过 RSSI 指到 CRC 校验/ Read the status word and check for CRC OKpStatusWord= rxMpdu + 4;/ Indicate the successful ACK reception if CRC and sequence number OKif (pSt
16、atusWord1 / No, it is data else / It is assumed that the radio rejects packets with invalid length./ Subtract the number of bytes in the frame overhead to get actual payload.rxi.length = pHdr-packetLength - BASIC_RF_PACKET_OVERHEAD_SIZE;#ifdef SECURITY_CCMrxi.length -= (BASIC_RF_AUX_HDR_LENGTH + BAS
17、IC_RF_LEN_MIC);authStatus = halRfReadRxBufSecure(#elsehalRfReadRxBuf(#endif/ Make sure byte fields are changed from network to host byte orderUINT16_NTOH(pHdr-panId);UINT16_NTOH(pHdr-destAddr);UINT16_NTOH(pHdr-srcAddr);#ifdef SECURITY_CCMUINT32_NTOH(pHdr-frameCounter);#endifrxi.ackRequest = !(pHdr-f
18、cf0 / Read the source addressrxi.srcAddr= pHdr-srcAddr;/ Read the packet payloadrxi.pPayload = rxMpdu + BASIC_RF_HDR_SIZE;/ Read the FCS to get the RSSI and CRCpStatusWord= rxi.pPayload+rxi.length;#ifdef SECURITY_CCMpStatusWord+= BASIC_RF_LEN_MIC;#endifrxi.rssi = pStatusWord0;/ Notify the applicatio
19、n about the received data packet if the CRC is OK/ Throw packet if the previous packet had the same sequence numberif( (pStatusWord1 #elseif ( (pHdr-fcf0 #endifrxi.seqNumber = pHdr-seqNumber;/ Enable RX frame done interrupt againhalIntOff();halRfEnableRxInterrupt();/* GLOBAL FUNCTIONS*/* fn basicRfI
20、nit* brief Initialise basic RF datastructures. Sets channel, short address and* PAN id in the chip and configures interrupt on packet reception* param pRfConfig - pointer to BASIC_RF_CONFIG struct.* This struct must be allocated by higher layer* txState - file scope variable that keeps tx state info
21、* rxi - file scope variable info extracted from the last incoming* frame* return none*/几个重要的底层函数:/*RF 初始化,调用 hal_rf.c 中的函数uint8 halRfInit(void)uint8 i;/ turning on power to analog part of radio and waiting for voltage regulator./模拟稳压器上电,延时 250uS 上电RFPWR = 0x04;/等待 ADI_RADIO_PD 为 0,也可以通过检测中断标志 RFIF.I
22、RQ_RREG_ON 为 1 来等待稳压器稳定while( RFPWR /根据需要设置 RF 功能,自动 CRC,自动应答 0x03/ Setting for AUTO CRC and AUTOACKMDMCTRL0L |= (AUTO_CRC | AUTO_ACK);/打开自动收发转换,接收包后 12 个符号超时,接受应答包控制/ Turning on AUTO_TX2RXFSMTC1 = (FSMTC1 /当 SRXON 发送时包接收不终止/ Turning off abortRxOnSrxon.FSMTC1 /FIFO 门限设为最大值 127/ Set FIFOP threshold t
23、o maximumIOCFG0 = 0x7F;/增益这部分没看懂,好像是用来优化的/ tuning adjustments for optimal radio performance; details available in datasheet */RXCTRL0H = 0x32;RXCTRL0L = 0xF5;/ Turning on receiver to get output from IF-ADCISRXON();halMcuWaitUs(1);/运行随机数发生器/ Enable random generatorADCCON1 for(i = 0 ; i channel);/设置短地
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ZigBee 应用 操作 教育 资料
限制150内