当前位置:文档之家› SF-CC2430实验手册V1_3(印刷版)

SF-CC2430实验手册V1_3(印刷版)

SF-CC2430实验手册V1_3(印刷版)
SF-CC2430实验手册V1_3(印刷版)

目录

1、CC2430基础实验 (1)

1.1、自动闪烁 (1)

1.1.1、实验目的 (1)

1.1.2、实验相关寄存器介绍 (1)

1.1.3、实验相关函数介绍 (3)

1.1.4、实验步骤 (4)

1.2、按键控制开关 (4)

1.2.1、实验目的 (4)

1.2.2、实验相关寄存器介绍 (4)

1.2.3、实验相关函数介绍 (5)

1.2.4、实验步骤 (6)

1.3、利用定时器T1实现LED闪烁 (6)

1.3.1、实验目的 (6)

1.3.2、实验相关寄存器介绍 (6)

1.3.3、实验相关函数介绍 (7)

1.3.4、实验步骤 (8)

1.4、与PC串口通信实验 (8)

1.4.1、实验介绍 (8)

1.4.2、实验相关寄存器 (8)

1.4.3、实验相关函数 (8)

1.4.4、实验步骤 (10)

1.5、点对点通信 (10)

1.5.1、实验目的 (10)

1.5.2、实验设备 (10)

1.5.3、实验原理 (10)

1.5.4、SPP协议栈目录介绍 (10)

1.5.5、几个重要函数 (11)

1.5.6、程序实现 (12)

1.5.7、实验步骤 (17)

2、CC2430的一些中断实验 (21)

2.1、定时器中断 (30)

2.1.1、实验目的 (30)

2.1.2、实验相关寄存器 (30)

2.1.3、实验相关函数 (30)

2.1.4、实验步骤 (31)

2.2、外部中断 (31)

2.2.1、实验目的 (31)

2.2.2、实验相关寄存器介绍 (31)

2.2.3、试验相关函数介绍 (31)

2.2.4、实验步骤 (32)

3、CC2430的片内外设 (33)

3.1、片内温度 (33)

3.1.1、实验目的 (33)

3.1.2、实验相关寄存器 (33)

3.1.3、实验相关程序 (33)

3.1.4、实验步骤 (35)

3.2、1/3AVDD实验 (35)

3.2.1、实验目的 (35)

3.2.2、实验相关寄存器 (35)

3.2.3、实验相关函数介绍 (35)

3.2.4、实验步骤 (36)

3.3、AVDD实验 (36)

3.3.1、实验目的 (36)

3.3.2、实验相关寄存器介绍 (36)

3.3.3、实验相关函数介绍 (37)

3.3.4、实验步骤 (37)

4、CC2430协议栈 (38)

4.1、ZigBee2004精简版使用 (38)

4.1.1、实验目的 (38)

4.1.2、实验内容 (38)

4.1.3、实验设备 (38)

4.1.4、实验原理 (38)

4.1.5、协议栈目录介绍 (39)

4.1.6、几个重要的函数 (40)

4.1.7、程序流程及主函数 (46)

4.1.8、实验步骤 (51)

4.2、ZigBee2006协议栈简单应用 (53)

4.2.1、实验目的 (53)

4.2.2、实验内容 (53)

4.2.3、实验设备 (53)

4.2.4、实验原理 (53)

4.2.5、协议栈目录介绍 (54)

4.2.6、几个重要的函数 (55)

4.2.7、实验步骤 (55)

1、CC2430基础实验1.1、自动闪烁

1.1.3、实验相关函数介绍

写在程序中子函数及功能列写如下:

void Delay(uint n);

函数原型是

void Delay(uint n)

void Delay(unsigned char n)

{

unsigned char i;

unsigned int j;

for(i = 0; i < n; i++)

for(j = 1; j; j++);

}

函数功能是软件延时。

void main(void);

函数原型是:

void main(void)

{

// CC2430 中,I/O 口做普通I/O 使用时和每个I/O 端口相关的寄存器有3 个,分别是//PxSEL功能选择寄存器,PxDIR 方向寄存器,PxINP 输入模式寄存器,其中x 为0,1,//2 。这里选择P1.0 上的色LED 作为I/O 测试。

SLEEP &= ~0x04;

while(!(SLEEP & 0x40)); //晶体振荡器开启且稳定

CLKCON &= ~0x47; //选择1-32MHz 晶体振荡器

SLEEP |= 0x04;

P1SEL = 0x00; //P1.0 为普通I/O 口

P1DIR = 0x01; //P1.0 输出

while(1)

{

P1_0 = 1;

Delay(10);

P1_0 = 0;

Delay(10);

}

}

函数功能是把连接LED 的I/0口(P1.0)设置为输出,通过将P1.0口置高和置低来控制LED闪烁。

1.1.4实验步骤

第一步:把编译通过的程序用IAR 打开,IAR 使用方法请参照IAR IDE 用户手册.pdf;

{

if(K1 == 0) //低电平有效{

Delay(100); //检测到按键if(K1 == 0)

{

while(!K1); //直到松开按键

return(1);

}

}

if(K2 == 0)

{

Delay(100);

12

if(K2 == 0)

{

while(!K2);

return(2);

}

}

return(0);

}

函数功能是检测按键是否按下,若有键按下,则返回相应的值,如P00 对应的按键按下则返回1,P01 对应的按键按下返回2。

1.2.4实验步骤

第一步:把编译通过的程序用IAR 打开,IAR 使用方法请参照IAR IDE 用户手册.pdf;第二步:把仿真器和模块连接好;

第三步:通过IAR自带debug功能把程序烧写到目标板上;

第四步:手动目标板按键,观察目标板LED 现象。

1.3、利用定时器T1实现LED闪烁

1.3.1、实验目的

用定时器 1 来改变小灯的状态,T1 每溢出两次,两个小灯闪烁一次,并且在停止闪烁后成闪烁前相反的状态。

1.3.2、实验相关寄存器介绍

实验中操作了的寄存器有P1,P1DIR,P1SEL,T1CTL ;前面三个寄存器在实验一已经有

详述,这里不再重复介绍。

P1见实验一说明文档,P1DIR 见实验一说明文档,P1SEL 见实验一说明文档

写在程序中的部分子函数及功能列写如下:

void Initial(void);

函数原型:

void Initial(void)

{

//初始化P1

P1DIR = 0x03; //P10 P11为输出

RLED = 1;

YLED = 1; //灭LED

//用T1来做实验

T1CTL = 0x0d; //中断无效,128分频;自动重装模式(0x0000->0xffff);

}

函数功能是将P10,P11 设为输出,并将定时器1 设为自动重装模式。

1.3.4、实验步骤

第一步:把编译通过的程序用IAR 打开,IAR 使用方法请参照IAR IDE 用户手册.pdf;第二步:把仿真器和模块连接好;

第三步:通过IAR自带debug功能把程序烧写到目标板上;

第四步:观察目标板LED 现象。

其他定时器的介绍查看CC2430芯片手册。

1.4、与PC串口通信实验

1.4.1、实验介绍

上电后模块向电脑串口发出问候语,由串口向模块发送不大于30个字符的字符串,末尾加#结束,模块会返回相同的字符串,波特率为57600。

1.4.2、实验相关寄存器

本实验中用的寄存器很多有CLKCON、SLEEP、PERCFG、U0CSR、U0GCR、U0BAUD、U0BUF、ADCCON1、ADCCON3等,这些寄存器的具体介绍和功能详细看CC2430的芯片手册,里面有详细的介绍。

1.4.3、实验相关函数

初始化函数initUARTtest(void)

函数原型:

void initUARTtest(void)

{

CLKCON &= ~0x40; //晶振

while(!(SLEEP & 0x40)); //等待晶振稳定

CLKCON &= ~0x47; //TICHSPD128分频,CLKSPD不分频

SLEEP |= 0x04; //关闭不用的RC振荡器

PERCFG = 0x00; //位置1 P0口

P0SEL = 0x3c; //P0用作串口

U0CSR |= 0x80; //UART方式

U0GCR |= 10; //baud_e

U0BAUD |= 216; //波特率设为57600

UTX0IF = 1;

U0CSR |= 0X40; //允许接收

IEN0 |= 0x84; //开总中断,接收中断

}

函数功能:将系统时钟设为高速晶振,将P0 口设置为串口0 功能引脚,串口0 使用UART 模式,波特率设为57600,允许接收。在使用串口之前调用。

串口发送字符串函数:

void UartTX_Send_String(uchar *Data,int len)

函数原型:

void UartTX_Send_String(uchar *Data,int len)

{

int j;

for(j=0;j

{

U0DBUF = *Data++;

while(UTX0IF == 0);

UTX0IF = 0;

}

}

串口接收一个字符函数:

#pragma vector = URX0_VECTOR

__interrupt void UART0_ISR(void)

{

URX0IF = 0; //清中断标志

temp = U0DBUF;

}

1.4.4、实验步骤

第一步:把编译通过的程序用IAR 打开,IAR 使用方法请参照IAR IDE用户手册.pdf;第二步:把仿真器和模块连接好,用串口线连接模块和PC;

第三步:通过IAR 自带debug功能把程序烧写到目标板上;

第四步:打开串口调试助手,在发送区输入30 个以内的字符,设置波特率为57600,点击发送,观察接收区现象。

1.5、点对点通信

1.5.1、实验目的

本实验通过发送模块循环发送0x01、0x02到接收模快,以指示灯来只是现象。来让让用户了解CC2430 点对点通信操作流程,了解SPP 的使用和了解射频配置。

1.5.2、实验设备

SF-CC2430 学习模块2个,2430/1 仿真器1个

1.5.3、实验原理

基于802.15.4的CC2430无线收发模块的核心部分是一个CC2420的射频收发器。发送基于上变频器,发送数据帧的前导符和开始符由硬件生成,通过数模转换把数字信号转换成模拟信号发送出去。接收数据通过放大和正交降频转换到中频2MHz中,经AD 转换提取相应的数据。

CC2430的数据缓冲区通过先进先出的方式接收128位数据。使用先进先出读取数据需要通过特殊功能寄存器接口,内存与先进先出缓冲区数据移动使用DMA方式来实现。

CRC校验使用硬件实现,接收信号强度指标(RSSI)和相关值添加到帧中,在接受模式中可以用中断来使能清除信道评估(CCA)。

1.5.4、SPP协议栈目录介绍

SPP栈的结构如图1_5_1,核心是cul 和hal这来两个函数组。由图,appEX放置用户自己编写的应用程序,cul库是与射频模块相关配置的函数库,Hal是电路板硬件配置

的一些函数库。Cul 和hal这两个库是协议已经封装好的函数库,用户根据需要自己选择性的调用。Tools是使用的工具,output是工程自己生成的输出文件,这个不需要用户调用和配置。

图1_5_1 spp协议栈结构

1.5.5、几个重要函数

射频初始化函数

BOOL sppInit(UINT32 frequency, BYTE address)

功能描述:初始化简单的数据包装协议 Simple Packet Protocol (SPP),从 DMA 管理器申请两个 DMA 通道,用于分别从 Rx FIFO 和 Tx FIFO 传输数据。定时器 4 管理器同样被设置,这个单元用于在数据包发送后接收器在一定时间内没有返回应答时产生中断。无线部分配置为发送,在函数halRfConfig(frequency)中设定相应的频率,设置发送时自动计算和插入和检查 CRC 值。

参数描述:

UINT32 frequency:RF 的频率(kHz.); BYTE address:节点地址返回:配置成功返回TRUE,失败返回 FALSE

发送数据包函数

BYTE sppSend(SPP_TX_STRUCT* pPacketPointer)

功能描述:发送 length 字节的数据(最多 122),标志,目的地址,源地址在 Tx DMA 通道传送有效载荷到 Tx FIFO 前插入,如果期望应当,设置相应的标志。

参数:

SPP_TX_STRUCT* pPacketPointer:发送数据包头指针返回:发送成功返回 TRUE,失败返回 FALSE。

接收数据

void sppReceive(SPP_RX_STRUCT *pReceiveData)

功能描述:

这个函数使能接收 128 字节,包括头和尾。接收数据通过 DMA 传输到 pReceiveData。DMA装备同时接收开启。接收数据将触发 DMA,当所有的数据包接收并且移走,DMA 产生一个中断同时运行以前定义的函数 rxCallBack。rxCallBack函数只根据收到数据包的情况置相应的收数状态。

参数:SPP_TX_STRUCT* pPacketPointer:接收数据包头指针返回:无

INIT_GLED();

INIT_YLED();

radioInit(frequency, myAddr);

}

这个不用多解释,实际上仅仅调用了sppInit 函数初始化了射频。sppInit 函数中有具体的注释由于篇幅限制这里不再多说。

发送状态函数

void contionuousMode(void)

{

BOOL res;

BYTE sendBuffer[] = {0x01,0x02};//发送的数据

while(1)

{

GLED = LED_OFF;

YLED = LED_ON;

res = radioSend(sendBuffer, sizeof(sendBuffer), remoteAddr, DO_NOT_ACK );

halWait(200);

YLED = LED_OFF;

halWait(200);

if(res == TRUE) //发数成功

{

GLED = LED_ON;

halWait(200);

}

else

{

GLED = LED_OFF;

halWait(200);

}

}

}

在发送状态调用了radioSend 函数来发送数据,似乎与前面提到的sppSend 发送数据不一样,但是实际上是一样的,因为在radioSend 函数中调用了sppSend 函数。

接收状态函数

void receiveMode(void)

{

BYTE* receiveBuffer;

BYTE length;

BYTE res;

BYTE sender;

while(1)

{

YLED = LED_ON;

res = radioReceive(&receiveBuffer, &length, RECEIVE_TIMEOUT, &sender);

YLED = LED_OFF;

if(res == TRUE) //收数成功

{

GLED = LED_ON;

halWait(200);

}

else

{

GLED = LED_OFF;

halWait(200);

}

GLED = LED_OFF;

}

}

同样的道理,虽然在这里调用的是radioReceive 函数,但是在radioReceive 函数函数里调用了sppReceive 函数来接收数据。

射频主函数

#ifdef COMPLETE_APPLICATION

void rf_test_main(void){

#else

void main(void){

#endif

INT_GLOBAL_ENABLE(INT_ON);

#ifdef RX //如果是接收模块

{

myAddr = ADDRESS_0;

remoteAddr = ADDRESS_1;

initRfTest();

receiveMode();

}

#else //发送模块

{

myAddr = ADDRESS_1;

remoteAddr = ADDRESS_0;

initRfTest();

contionuousMode();

}

#endif

}

注意这里的几个条件编译,主要是为了在同一个文件下同时编写 TX 和 RX. 例如:按照下图1_5_3方式可以找到设置编译TX和RX 对话框。

图1_5_3

定义了如图1_5_3条件编译表运行接收状态:

图1_5_4 另一个TX 就是发送状态。

相关主题
文本预览
相关文档 最新文档