南邮linux实验二读取用户数据,实验二:串口收发数据实验

1.

实验环境

1)

硬件:通用节点或任意传感器节点一个、USB仿真器、USB电缆、PC机;

2)

软件:IAR Embedded Workbench

for MCS-51、串口调试工具;

2.

实验内容

1)

熟悉Zigbee硬件模块相关接口;

2)

使用IAR 开发环境设计程序,利用CC2530 的串口0 进行数据收发通讯;

3.

实验原理

1)

硬件接口原理

在CC2530中,我们总共有2个可用的串行接口,这些串行接口可被配置为标准串口或者SPI接口。这个例程中我们只使用USART0,并且工作在UART标准串口模式下。由于每种设置都有2套可用的IO映射,这里根据我们的硬件设置,我们应该使用其默认设置,UART0的TX和RX对应于P0_3和P0_2。

blog_198e41bfa0102y8ut.html

图5-2-1

部分外设复用IO对应图

首先我们需要了解CC2530

的IO口相关寄存器:

blog_198e41bfa0102y8ut.html

图5-2-2 P0 寄存器

blog_198e41bfa0102y8ut.html

图5-2-3

P0SEL 寄存器

blog_198e41bfa0102y8ut.html

图5-2-4

P0DIR 寄存器

以上图表列出了关于CC2530 处理器的P0 IO口相关的寄存器,其中P0 寄存器为IO数据寄存器,P0SEL为外设功能选择寄存器,P0DIR 为IO 输入输出选择寄存器,例程中我们需要对这3个寄存器进行IO配置相关设置,其他相关寄存器使用默认配置。如想深入了解请自行参考CC2530

的芯片手册。

blog_198e41bfa0102y8ut.html

图5-2-5

CLKCONCMD 寄存器

blog_198e41bfa0102y8ut.html

图5-2-6

CLKCONSTA 寄存器

blog_198e41bfa0102y8ut.html

图5-2-7

SLEEP 控制寄存器

本例程中,程序通过配置以上寄存器将系统主时钟设置为片外32M晶振。

然后是串行接口外设相关寄存器,通过设置这些寄存器,我们将串行接口设定为预想的模式。

blog_198e41bfa0102y8ut.html

图5-2-8

PERCFG 寄存器

blog_198e41bfa0102y8ut.html

图5-2-9

U0CSR 寄存器

blog_198e41bfa0102y8ut.html

图5-2-10

U0GCR 寄存器

blog_198e41bfa0102y8ut.html

图5-2-11

U0BUF 寄存器

blog_198e41bfa0102y8ut.html

图5-2-12

U0BAUD 寄存器

以上图表列举了和CC2530串口操作定相关的寄存器,其中包括CLKCONCMD控制寄存器,用来控制系统时钟源,SLEEP 寄存器用来控制各种时钟源的开关和状态。PERCFG 寄存器为外设功能控制寄存器,用来控制外设功能模式。U0CSR、U0GCR、U0BUF、U0BAUD 等位串口相关寄存器。

blog_198e41bfa0102y8ut.html

图5-2-13

USB转串口部分原理图

上图是节点的串口相关电路原理图。在这个图中,我们可以看到CH340芯片完成了USB转串口的工作,通过USB电缆连接节点和计算机后,CH340芯片会在计算机中虚拟一个串口,这个串口信号对于图中的CH340_TXD和CH340_RXD,通过J2上的跳线帽与CC2530的P0.2和P0.3引脚相连。

通过之前的IO映射复用图我们可以发现,P0.2和P0.3对应的是USART0在UART模式下的RXT和TXD引脚。

2)软件设计

#include "ioCC2530.h"

#include

#define uint unsigned int

#define uchar unsigned char

//定义控制灯的端口

#define led1 P1_0

#define led2 P1_1

void InitIO(void);

//IO初始化

void InitUart(void);

//串口初始化

void SendString(char*string,uint

legth);

//发送字符串

uchar temp;

// 存放接受的数据

char wch[] = "Welcome to test this

program!\n";

void DelayXms(unsigned int Count)

{

unsigned int

i;

unsigned int

j;

for(i = 0; i <

Count; i++)

{

for( j=10000; j>0; j--);

}

}

void InitIO(void)

{

SLEEPCMD &= ~0X04;

CLKCONCMD = 0X10;

//32k和32M时钟使用外部晶体,timer分频8M

while(CLKCONSTA!=0X10);

//等待时钟切换

SLEEPCMD = 0X04;

P2DIR = 0x00;

//高两位零

若设则最高优先USART0

P1DIR|= 0X03;

//P1.0 P1.1 LEDs 灯端口配置

P0DIR|= 0X00;

//input

PERCFG = 0x00;

//UART0 默认端口

P1SEL = 0X00;

P0SEL = 0X0c;

//P0<3:2>设置成外围应用

}

void InitUart(void)

{

U0CSR |= 0x80;

//UART方式

U0GCR = 11;

//baud_e 波特率设为115200

U0BAUD |= 216;

//baud_m = BaudRate*2^(28-buad_e)/32M-256

//BaudRate=(256+baud_m)/2^(28-buad_e)x32MHz

UTX0IF = 1;

//接收中断标记

U0CSR |= 0X40;

//允许接收

URX0IE = 1;

//接收中断使能

EA =1;

//总中断开关打开

}

void SendString(char*string,uint lenth)

{

uint j;

for (j=0; j

{

U0DBUF = *string++;

//将要发送字符送入U0DBUF发送寄存器

while(UTX0IF == 0);

//等待发送完成

UTX0IF = 0;

//清0标志位

}

}

void main(void)

{

InitIO();

InitUart();

DelayXms(10);

led1=1;

//点亮2个LED灯

led2=1;

SendString(wch,sizeof(wch));

while(1)

{

; //进入无限循环等待中断函数被处触发

}

}

#pragma vector = URX0_VECTOR

__interrupt void UART0_ISR(void)

{

URX0IF = 0;

//清中断标志

temp = U0DBUF;

U0DBUF = temp;

//将收到的字符发送回去

while(UTX0IF == 0);

//等待发送

UTX0IF = 0;

//清发送标志

led1 = ~led1;

//指示中断活动

led2 = ~led2;

}

程序中主要有这几个函数:

DelayXms(unsigned int Count):延时函数。

InitIO():完成IO初始化功作。首先将系统切换到32Hz主晶振下工作并配置芯片内部频率,因为串口工作波特率较高,芯片对串口信息的处理要求其工作频率也较高,所以需要在32M频率下工作。然后配置相关IO寄存器,包括2个LED灯的控制IO口为输出模式,2个串口收发信号引脚为特殊功能应用模式。

InitUart():完成串口的初始化工作。其中对串口寄存器进行设置,最重要的是串口的波特率设置。我们找到CC2530用户手册的P160页,其中有对波特率相关计算的详细描述。这里归纳其计算公式为:

blog_198e41bfa0102y8ut.html

其中BAUD_M和BAUD_E为相关寄存器中的设置位。下表归纳了在系统时钟为32MHz频率下的常用波特率对于设置值。

表5-2-1 系统时钟为32MHz时的常用波特率配置

blog_198e41bfa0102y8ut.html

这里通过配置CC2530 处理器的串口相关控制寄存器来设置串口0 的工作模式为串口模式,波特率为115200,使用中断方式接受串口数据并向串口输出。

SendString(char*string,uint

legth):完成从串口发送字符串。其中2个参数分别为发送字符串地址和字符串长度。

main():主函数。完成各种初始化后进入循环等待串口接收中断被触法。

UART0_ISR():串口接收中断函数。将收到的字符从串口发回。同时改变LED灯的状态,指示串口收到数据。

主函数和中断函数的流程图如下:

blog_198e41bfa0102y8ut.html

图5-2-14

main函数和中断函数程序流程图

4.

实验步骤

l

使用USB 仿真器连接PC 机和ZIGBEE模块。将系统配套USB线一端连接PC 机,一端连接ZIGBEE模块的MINI-USB接口上。

如果使用传感器节点运行本例程,请检查板子上的“TXD”和“RXD”位置跳线帽是否已经插上(左下图圆圈处),下方的电源开关打到“OFF”档,节点使用仿真器连接供电。

blog_198e41bfa0102y8ut.html

blog_198e41bfa0102y8ut.html

图5-2-15

节点实物图(左为传感器节点,右为通用节点)

l

连接USB电缆时,需要安装USB转串口的驱动程序,在“...\基础传感器实验\1-5基础例程\2-串口”目录下运行程序“CH341SER.EXE”安装驱动,重新拔插USB电缆,待驱动自动加载好,在“我的电脑右键——属性——设备管理器”中可以发现如下虚拟串口条目“USB-SERIAL CH340(COMXX)”。记住这里的串口号码“COMXX”。

blog_198e41bfa0102y8ut.html

图5-2-16

查看串口号

l

启动IAR 开发环境,打开“...\基础传感器实验\1-5基础例程\2-串口”目录下的实验工程。

l

在IAR 开发环境中编译程序、点击blog_198e41bfa0102y8ut.html下载、调试程序。按“F5”使程序运行。

l

打开“...\基础传感器实验\1-5基础例程\2-串口”目录下的串口调试程序“串口调试程序(支持中文).EXE”。按照下图设置这几项:串口号选择刚刚在设备管理器中记下的串口号;波特率选择“115200”;数据位8位;停止位1位;校验位none;流控制none等其他均为默认。点击右下角的发送数据按钮,可以看到接受文本框中显示接受到同样的数据。

l

更换发送文本框“字符串输入框”中的内容,点击发送按钮。可以看到相同的字符串又被返回。

blog_198e41bfa0102y8ut.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值