ZigBee教程.docx

上传人:b****8 文档编号:29483874 上传时间:2023-07-23 格式:DOCX 页数:231 大小:121.33KB
下载 相关 举报
ZigBee教程.docx_第1页
第1页 / 共231页
ZigBee教程.docx_第2页
第2页 / 共231页
ZigBee教程.docx_第3页
第3页 / 共231页
ZigBee教程.docx_第4页
第4页 / 共231页
ZigBee教程.docx_第5页
第5页 / 共231页
点击查看更多>>
下载资源
资源描述

ZigBee教程.docx

《ZigBee教程.docx》由会员分享,可在线阅读,更多相关《ZigBee教程.docx(231页珍藏版)》请在冰豆网上搜索。

ZigBee教程.docx

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,/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1