ZigBee教程.docx
- 文档编号:29483874
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:231
- 大小:121.33KB
ZigBee教程.docx
《ZigBee教程.docx》由会员分享,可在线阅读,更多相关《ZigBee教程.docx(231页珍藏版)》请在冰豆网上搜索。
ZigBee教程
ZigBee学习之1——点灯
我用的编译环境是IARfor517.30B,再介绍一下我的开发板的情况,ZigBee模块用的是CC2430.这块芯片是一款Soc的芯片,集成了8051内核和ZigBee射频部分,只要很少的外部电路就可以搭建一个射频模块。
因为其中的是8051的内核,所有对于熟悉8051系列的同学们来说,基本的一些操作就很简单了,这里我们在温习一下,顺便对CC2430芯片进行一下熟悉。
嵌入式的一大特点是其底层的软件和硬件紧密相关,如果没有数字电路的知识,那么作起来是很困难的。
我们先介绍一下基本的管脚分配情况:
P0的2和3接到了一个232电压转换芯片上,可以用来和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
#defineDEBUG_LEDP1_0
voiddelay(unsignedintn){
//26cyclesdelay
while(--n)asm("NOP");
}
voidLEDInit(){
P1SEL&=0XFE;//P1_0definedGeneralpurposeI/O
P1DIR|=0X01;//P1_0definedOutput
}
main(){
LEDInit();
while
(1){
DEBUG_LED=1;//Ledlight
delay(50000);
DEBUG_LED=0;
delay(50000);
}
}
编译通过以后就用TI的官方工具SmartRFFlashProgrammer将生成的HEX文件,烧录到CC2430吧,激动的时刻,呵呵如果点亮了这个小小的LED那么恭喜你,你的硬件因该是没有问的了,一个小小的胜利后我们就有更多的勇气和信心前进咯!
ZigBee学习之2——SPI&LCD
今天的任务是用SPI总线方式点亮LCD屏幕,呵呵这里要涉及到两个内容,一个是SPI总线,一个LCD。
CC2430的话已经集成了SPI总线,只要将IO口配置为外设,然后将USART配置成SPI方式就可以了。
关于LCD其实也很简单,很多没有接触过的同学可能将其想象的太过复杂了,就是将字或者图像转换为一个一个的点,如果要这点显示东西呢,就把这点点亮,否则则不点亮。
其实PCD8544已经将很多细节的东西做好了,我们要做的呢,就是发送一串命令序列,然后发送要显示的数据就可以了。
看看PCD8544的芯片资料,我们还会发现在最后它竟然给出了操作实例,呵呵相信大家都能看懂的吧,如果有看不懂的可以给我留言或者是QQ联系我哦,我如果知道的话一定给大家详细的答复!
CC2430的SPI的是放在USART外设里面的,和UART放在一起,同一个USART即可以配置成UART也可以配置成SPI,SPI的主从模式通过相关的寄存器来选择。
关于管脚的分配也不难,这里就不多说了,其实这里还算是8051的基础实验,对于8051很熟悉的同学肯定觉得我是在说废话了,哈哈!
这里只提一下关于SPI应该注意的一点问题:
1、PCD8544的SPI是高电平采样,所以,主机端必须是高电平之前要把数据准备好。
所以主机端的发送(MOSI)因该设为下降沿采样。
当用SPI和PCD8544通信时,速率不能太低,否则点不亮LCD,或者是出来乱码
下面是引用网友的SPI总线心得,我觉得看看很有益处:
SPI接口时钟配置心得:
在主设备这边配置SPI接口时钟的时候一定要弄清楚从设备的时钟要求,
因为主设备这边的时钟极性和相位都是以从设备为基准的。
因此在时钟极性的配置上一定要
搞清楚从设备是在时钟的上升沿还是下降沿接收数据,是在时钟的下降沿还是上升沿输出数据。
但要注意的是,由于主设备的SDO连接从设备的SDI,从设备的SDO连接主设备的SDI,
从设备SDI接收的数据是主设备的SDO发送过来的,主设备SDI接收的数据是从设备SDO发送过来的,
所以主设备这边SPI时钟极性的配置(即SDO的配置)跟从设备的SDI接收数据的极性是相反的,
跟从设备SDO发送数据的极性是相同的。
下面这段话是SychipWlan8100ModuleSpec上说的,
充分说明了时钟极性是如何配置的:
The81xxmodulewillalwaysinputdatabitsattherisingedgeoftheclock,
andthehostwillalwaysoutputdatabitsonthefallingedgeoftheclock.
意思是:
主设备在时钟的下降沿发送数据,从设备在时钟的上升沿接收数据。
因此主设备这边SPI时钟极性应该配置为下降沿有效。
又如,下面这段话是摘自LCDDriverICSSD1289:
SDIisshiftedinto8-bitshiftregisteroneveryrisingedgeofSCKintheorder
ofdatabit7,databit6……databit0.
意思是:
从设备SSD1289在时钟的上升沿接收数据,而且是按照从高位到地位的顺序接收数据的。
因此主设备的SPI时钟极性同样应该配置为下降沿有效。
时钟极性和相位配置正确后,数据才能够被准确的发送和接收。
因此应该对照从设备的SPI接口时序或者Spec文档说明来正确配置主设备的时钟。
老规矩,上程序:
先来一个不用SPI方式控制LCD显示的实例:
#include"periodef.h"
#include
voiddelay(uintn){
//26cyclesdelay
while(--n)asm("NOP");
}
voidLCD_IOInit(){
P0SEL&=~0X03;
P0DIR|=0X03;
P1SEL&=~0XF0;
P1DIR|=0XF0;
}
voidLCD_WriteOneByte(uchardata){
uchari=0;
for(i=0;i<8;i++){
LCD_SCK=0;
if((data<
LCD_SIN=1;
}
else{LCD_SIN=0;}
LCD_SCK=1;
}
}
voidLCD_WriteMByte(uchar*data,uintnum){
while(num--){
LCD_WriteOneByte(*data);
data++;
}
}
voidLCD_Init(){
LCD_nCS=0;
delay(100);
LCD_nRES=0;
delay(100);
LCD_nRES=1;
delay(100);
LCD_DnC=0;
LCD_WriteOneByte(0x21);
LCD_WriteOneByte(0xC8);
LCD_WriteOneByte(0x06);
LCD_WriteOneByte(0x13);
LCD_WriteOneByte(0x20);
LCD_WriteOneByte(0x0C);
LCD_DnC=1;
}
main(){
uinti=0;
ucharHello[]={
0x00,0x7E,0x10,0x10,0x7E,0x00,/*"H",0*/
/*(6X8,楷体)*/
0x00,0x7E,0x52,0x52,0x42,0x00,/*"E",1*/
/*(6X8,楷体)*/
0x42,0x7E,0x42,0x40,0x40,0x00,/*"L",2*/
/*(6X8,楷体)*/
0x42,0x7E,0x42,0x40,0x40,0x00,/*"L",3*/
/*(6X8,楷体)*/
0x00,0x3C,0x42,0x42,0x3C,0x00,/*"O",4*/
/*(6X8,楷体)*/};
LCD_IOInit();
LCD_Init();
//for(i=0;i<30;i++){
//LCD_WriteOneByte(Hello[i]);
//}
LCD_WriteMByte(Hello,30);
LCD_nCS=1;
}
下面是采用SPI总线方式控制LCD显示的例子:
//========================
//ThisfileisapplicabletoEshineEXBEE-DKV1
//Function:
LCDtest,theLCDuseSPIBUS.TheSPIBUSoccupationP1-USART1-ALT.2
//InPut:
//OutPut:
//Created:
longfan,2010.1.10
//Modify:
//========================
#include"periodef.h"
#include"font.h"
#include"TestBMP.h"
#include
voiddelay(uintn){
//26cyclesdelay
while(--n)asm("NOP");
}
voidLEDInit(){
P1SEL&=0XFE;//P1_0definedGeneralpurposeI/O
P1DIR|=0X01;//P1_0definedOutput
DEBUG_LED=1;//LEDlightup
}
//========================
//InitialP1-USART1-SPI
voidSPIInit_U1_P1(void){
PERCFG|=0X02;//USART1.alt.2,P1
P1SEL|=0XE0;//P1,ISP,P1_4(LCD_DnC)definedgeneralIO
P2SEL|=0X40;//USART1haspriority
U1GCR|=0x20;//MSBfirst,Negativeclockpolarity,DataisoutputonMOSIonthefallingedgeofCLK
U1GCR|=19;//MAXBaudrate(17),fallingedge
U1BAUD=0;
UTX1IF=0;//Clearinterrupt
}
//========================
//P1-USART1-SPISendOneByte
voidSPI_SendOne_U1_P1(uchardata){
U1DBUF=data;
while(!
UTX1IF);
UTX1IF=0;
}
//========================
//P1-USART1-SPISendMultilyByte
voidSPI_Send_U1_P1(uchar*data,uintlength){
while(length){
SPI_SendOne_U1_P1(*data);
data++;
length-=1;
}
}
//========================
//LCDUseSPIBUS,Setthefirstdisplaypiex.
//WhenaftercallthisfunctioncandirectcallSPIdataoutputfunction
//0 voidSPI_LCDSetPos(ucharX,ucharY){ LCD_DnC=0; SPI_SendOne_U1_P1(0x80|X); SPI_SendOne_U1_P1(0x40|Y); LCD_DnC=1; } //======================== //LCDUseSPIBUS,CleartheLCDDisplayanditsRAM. voidSPI_ClearLCD(){ uinti; SPI_LCDSetPos(0,0); for(i=0;i<504;i++){ SPI_SendOne_U1_P1(0); } } //======================== //LCDUseSPIBUS,SendoneLCDCommand voidSPI_LCDWriteOneComm(ucharcommand){ LCD_DnC=0; SPI_SendOne_U1_P1(command); } //======================== //LCDUseSPIBUS,SendMorethanoneLCDCommand voidSPI_LCDWriteMulComm(uchar*command,ucharnum){ LCD_DnC=0; SPI_Send_U1_P1(command,num); } //======================== //LCDUseSPIBUS,SendMorethanonedata voidSPI_LCDWriteData(uchar*data,ucharlength){ LCD_DnC=1; SPI_Send_U1_P1(data,length); } //======================== //LCDUseSPIBUS,DisplayaenglishcharacterWithoutsetposition,Theinverseargumentcontrol //theinversevideomode.Whenusefontlibrarycallthisfunctiontodisplay. //InPut: character: Thecharacterwanttodisplay //inverse: Inversevideomode (1)ornot(0) //OutPut: //Created: longfan,2010.1.10 //Modify: //======================== voidSPI_LCDWriteChar(ucharcharacter,ucharinverse){ ucharline; LCD_DnC=1; if(inverse){ for(line=0;line<6;line++){ SPI_SendOne_U1_P1(~font6x8[character-32][line]); } }else{ SPI_Send_U1_P1((uchar*)font6x8[character-32],6); } } //======================== //LCDUseSPIBUS,Displayaenglishcharacterat(X,Y),Theinverseargumentcontrol //theinversevideomode.Whenusefontlibrarycallthisfunctiontodisplay. //InPut: character: Thecharacterwanttodisplay //X,Y: Thepositionwanttodisplay //inverse: Inversevideomode (1)ornot(0) //OutPut: //Created: longfan,2010.1.10 //Modify: //======================== voidSPI_LCDDISPChar(ucharcharacter,ucharX,ucharY,ucharinverse){ ucharline; SPI_LCDSetPos(X,Y); if(inverse){ for(line=0;line<6;line++){ SPI_SendOne_U1_P1(~font6x8[character-32][line]); } }else{ SPI_Send_U1_P1((uchar*)font6x8[character-32],6); } } //======================== //LCDUseSPIBUS,Displayaenglishstringat(X,Y) voidSPI_LCDWriteEnString(uchar*EnString,ucharX,ucharY,ucharinverse){ ucharline; SPI_LCDSetPos(X,Y); while(*EnString){ ucharchara=*EnString; chara-=32; if(inverse){ for(line=0;line<6;line++){ SPI_SendOne_U1_P1(~font6x8[chara][line]); } }else{ SPI_Send_U1_P1((uchar*)font6x8[chara],6); } EnString++; } } //======================== //LCDUseSPIBUS,DrawaAREAuseHorizontal(thustheHighpixelmustbeamultipleof8). //Whenusedotmatrixtodisplayusethisfunction. //InPut: data: Thedotmatrixofthedatawanttodisplay //X,Y: Thepositionwanttodisplay //wide,high: Thepixelofwideandhigh //OutPut: //Created: longfan,2010.1.10 //Modify: //======================== voidSPI_LCDDrawArea_H(uchar*data,ucharX,ucharY,ucharwide,ucharhigh){ ucharrow; uchari; SPI_LCDSetPos(X,Y);//Setposition row=high/8;//calculatetherownumber for(i=0;i SPI_Send_U1_P1(data+(i*wide),wide); Y+=1; SPI_LCDSetPos(X,Y);//Setposition } } //======================== //LCDUseSPIBUS,InitialLCD voidSPI_LCDInit(){ P0DIR|=0X03;//P00(LCD_nCS),P01(LCD_nRES)Definedoutput P1DIR|=0X10;//P1_4(LCD_DnC)definedOutpu P2DIR|=1;//LCD_BKL LCD_nCS=0;//LCDEnable delay(100); LCD_nRES=0;//LCDRESERT delay(100); LCD_nRES=1; delay(100); LCD_BKL=0;//D5lightup //SendInitialcommand //LCD_DnC=0; //SPI_SendOne_U1_P1(0x21);//Chipisactive,Horizontaladdressing,Useextendedinstructionset //SPI_SendOne_U1_P1(0xC8);//SetVop //SPI_SendOne_U1_P1(0x06);//Temperaturecoefficient //SPI_SendOne_U1_P1(0x13);//1: 48 //SPI_SendOne_U1_P1(0x20);//Usebasicinstructionset //SPI_SendOne_U1_P1(0x0C);//DisplaymodeisNormalmode ucharInit_Comm[]={0x21,0xC8,0x06,0x13,0x20,0X0C}; SPI_LCDWriteMulComm(Init_Comm,6); SPI_ClearLCD();//ClearDisplayRAM SPI_LCDWriteOneComm(0X0C); LCD_DnC=1;//SendDisplayData } main(){ ucharHello[]={ 0x00,0x7E,0x10,0x10,0x7E,0x00,/*"H",0*/ /*(6X8,楷体)*/ 0x00,0x7E,0x52,0x52,0x42,0x00,/*"E",1*/ /*(6X8,楷体)*/ 0x42,0x7E,0x42,0x40,0x40,0x00,/*"L",2*/ /*(6X8,楷体)*/ 0x42,0x7E,0x42,0x40,0x40,0x00,/*"L",3*/ /*(6X8,楷体)*/ 0x00,0x3C,0x42,0x42,0x3C,0x00,/*"O",4*/ /*(6X8,楷体)*/ 0x00,0x7E,0x10,0x10,0x7E,0x00,/*"H",0*/ /*(6X8,楷体)*/ 0x00,0x7E,0x52,0x52,0x42,0x00,/*"E",1*/ /*(6X8,楷体)*/ 0x42,0x7E,0x42,0x40,0x40,0x00,/*"L",2*/ /*(6X8,楷体)*/ 0x42,0x7E,0x42,0x40,0x40,0x00,/*"L",3*/ /*(6X8,楷体)*/ 0x00,0x3C,0x42,0x42,0x3C,0x00,/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ZigBee 教程