第5节 串行通信通用函数与测试实例
推荐给好友
打印
加入收藏
更新于2008-07-25 19:36:04

 7.5.1 串行通信子函数

1.串行通信头文件SCI.h
//[SCI.h]串行通信头文件-----------------------------------------------------

#include "GP32C.h" //GP32 MCU映像寄存器名定义
#include "Type.h" //类型别名定义

#define ReSendStatusR SCS1 //SCI状态寄存器
#define ReTestBit 5 //接收缓冲区满标志位
#define SendTestBit 7 //发送缓冲区空标志位
#define ReSendDataR SCDR //数据寄存器

//串行通信函数声明
void SCIinit(void); //串行口初始化
void SCIsend1(INT8U o); //发送1字节
void SCIsendN(INT8U n, INT8U ch[]); //发送n字节
INT8U SCIre1(INT8U *p); //接收1字节
INT8U SCIreN(INT8U n, INT8U ch[]); //接收n字节

2.串行通信驱动文件SCI.c
串行通信驱动文件包括SCI初始化、接收1字节、发送1字节、接收n字节和发送n字节函数。读者可以直接使用这些函数进行MCU的串行通信编程。
//[SCI.c]串行通信----------------------------------------------------------*
//本文件包含: *
// (1)SCIinit: 串行口初始化 *
// (2)SCIsend1:串行发送1个字节 *
// (3)SCIsendN:串行发送n字节 *
// (4)SCIre1: 串行接收1字节 *
// (5)SCIreN: 串行接收n字节 *
//硬件连接: *
// MCU的串口与PC方的串口相连 *
//-------------------------------------------------------------------------*

//头文件
#include "SCI.h"

//SCIinit:串行口初始化-----------------------------------------------------*
//功能:对串行口进行初始化,默认为允许SCI,正常码输出,8位数据,无校验, *
// 允许发送器,允许接收器.查询方式收发,波特率为9600(设fBUS = 2.4576MHz) *
//参数:无 *
//返回:无 *
//说明:该函数与具体的芯片型号(MC68HC908GP32)有关 *
//-------------------------------------------------------------------------*
void SCIinit(void)
{
//1.总线频率fBUS= 2.4576MHz,定义波特率Bt = 9600
SCBR = 0b00000010;
//2.设置允许SCI,正常码输出,8位数据,无校验
SCC1 = 0b01000000;
//3.设置允许发送,允许接收,查询方式收发
SCC2 = 0b00001100;
}

//SCIsend1:串行发送1个字节-------------------------------------------------*
//功能:串行发送1个字节 *
//参数:要发送的数据 *
//返回:无 *
//-------------------------------------------------------------------------*
void SCIsend1(INT8U o)
{
//判断ReSendStatusR的第SendTestBit位是否为1,是1可以发送
while (1)
if ((ReSendStatusR & (1<<SendTestBit)) != 0)
{
ReSendDataR = o;
break;
}
}


//SCIsendN:串行发送N个字节-------------------------------------------------*
//功能:发送数组中的N个字节数据 *
//参数:待发送数据的字节数及存放这些数据的数组首地址 *
//返回:无 *
//内部调用函数:SCIsend1 *
//-------------------------------------------------------------------------*
void SCIsendN(INT8U n, INT8U ch[])
{
int i;
for(i=0; i<n; i++)
SCIsend1(ch[i]);
}

//SCIre1:串行收一个字节数据------------------------------------------------*
//功能:从串行口接收1个字节的数据 *
//参数:标志指针p *
//返回:接收到的数据(若接收失败,返回0xff) *
//说明:参数*p带回接收标志.*p = 0,收到数据;*p = 1,未收到数据 *
//-------------------------------------------------------------------------*
INT8U SCIre1(INT8U *p)
{
INT16U k;
INT8U i;
//ReSendStatusR第ReTestBit位为1表示可接收数据
for(k=0; k < 0xfbbb; k++)
if ((ReSendStatusR & (1<<ReTestBit)) != 0)
{
i = ReSendDataR;
*p = 0x00;
break;
}
//接收失败
if (k >= 0xfbbb)
{
i = 0xff;
*p = 0x01;
}
return i;
}


//SCIreN:HC08串行接收N个字节-----------------------------------------------*
//功能:接收N个字节数据,并存放在ch数组中 *
//参数:待接收的数据字节数及其存放的数组首地址 *
//返回:接收标志 = 0 收到数据, = 1 未收到数据 *
//内部调用函数:SCIre1 *
//-------------------------------------------------------------------------*
INT8U SCIreN(INT8U n, INT8U ch[])
{
int m;
INT8U fp;
m = 0;
while (m < n)
{
ch[m] = SCIre1(&fp);
if (fp == 1)
{
return 1;
}
m++;
}
return 0;
}

7.5.2查询方式工程文件

1.查询方式工程(08C)文件列表
查询方式08C工程文件列表见表7-4。PC方以7.5.4节的串口调试器进行数据的收发。
表7-4 查询方式测试工程文件
工程文件名 SCI_Pooling.prj
所在路径 MC08Ex2007\GP32\GP32C\C02_串行通信查询方式
文件类型 文件名 功能简述 讲解章节
头文件 GP32C.h 芯片头文件 [08C工程文件组织]5.3
SCI.h SCI收发子函数头文件 本章
Type.h 数据类型头文件 [08C工程文件组织]5.3
EnDisInt.h 开放或禁止MCU模块中断 [本章]
Includes.h 总头文件 [08C工程文件组织]5.3
C语言
子函数文件 MCUinit.c 芯片系统初始化函数定义 [初始化及PLL编程实例]14.2.5
SCI.c SCI收发子函数定义 [本章]
C语言主函数 Main.c 主函数 [本章]

2.查询方式08C语言主程序
//-------------------------------------------------------------------------*
//工 程 名:SCI_Pooling.prj *
//硬件连接: *
// (1)MCU的串口与PC方的COM1相连 *
//程序描述:利用查询方式把收到的数据发送回去 *
//目 的:初步掌握利用查询方式进行串行通信的基本知识 *
//------------------清华2007版《嵌入式技术基础与实践》实例-----------------*

//总头文件
#include "Includes.h"
//主函数
void main()
{
INT8U i;
DisableMCUint(); //禁止总中断
//1. 芯片初始化
MCUinit();
//2. 模块初始化
SCIinit(); //(1) 串口初始化
//总循环
while (1)
{
//接收1个字节的数据
i=SCIreN(1,SerialBuff);
//发送接到的1个字节数据
if (i == 0)
{
SCIsendN(1,SerialBuff);
}
}
}

7.5.3 中断方式工程文件

1.中断方式08C工程文件列表
前面7.5.2节介绍了串行通信的查询方式,本节将介绍串行通信的中断方式。中断方式测试工程文件列表见表7-5。使用时的注意问题在下面讨论。
表7-5 中断方式08C测试工程文件
工程文件名 SCI_INT.prj
所在路径 MC08Ex2007\GP32\GP32C\C03_串行通信中断方式
文件类型 文件名 功能简述 讲解章节
头文件 GP32C.h 芯片头文件 [08C工程文件组织]5.3
Includes.h 总头文件 [08C工程文件组织]5.3
EnDisInt.h 开放或禁止MCU模块中断 [本章]
SCI.h 串行通信头文件 [本章]
Type.h 数据类型头文件 [08C工程文件组织]5.3
C语言
子函数文件 MCUinit.c 芯片系统初始化函数定义 [初始化及PLL编程实例]14.2.5
SCI.c SCI收发子函数定义 [本章]
Vectors.c 中断处理及中断向量表 [08C工程文件组织]5.3
C语言主函数 Main.c 主函数 [本章]

2.中断方式08C语言主程序main.c
使用中断方式进行串行通信时,在主函数中要调用宏EnableSCIReInt(),开放串行中断。在系统初始化子函数MCUInit()中有关总中断(DISABLE_INTERRUPTS),因此在放开串行中断后要放开总中断(ENABLE_INTERRUPTS)。
//-------------------------------------------------------------------------*
//工 程 名:SCI_Int.prj *
//硬件连接: *
// (1)MCU的串口与PC方的串口相连 *
//程序描述:利用中断方式把收到的数据发送回去 *
//目 的:初步掌握利用中断方式进行串行通信的基本知识 *
//------------------清华2007版《嵌入式技术基础与实践》实例-----------------*
//总头文件
#include "Includes.h"
//主函数
void main()
{
DisableMCUint(); //禁止总中断
//1. 芯片初始化
MCUinit();
//2. 模块初始化
SCIinit(); //(1) 串口初始化
//3. 开放各模块中断
EnableSCIreInt(); //(1)开放SCI接收中断
//4. 开放总中断
EnableMCUint();
//主循环
while (1)
{
}
}

3.串行中断子函数声明EnDisInt.h
在该头文件中对开关总中断进行了宏定义,并且其他各个模块的中断设置函数在此进行声明。
//[EnDisInt.h]开放或禁止MCU各模块中断头文件---------------------------------

#include "GP32C.h" //GP32 MCU映像寄存器名定义

//开放或禁止中断宏定义
#define EnableMCUint() asm("CLI") //开放总中断
#define DisableMCUint() asm("SEI") //禁止总中断
#define EnableSCIreInt() SCC2 |= (1 << 5) //令SCC2.5=1,开放SCI接收中断
#define DisableSCIreInt() SCC2 &= ~(1 << 5) //令SCC2.5=0,禁止SCI接收中断

4.串行中断处理函数
//[Vectors.c]中断处理函数与中断向量表------------------------------------*
//功能: *
// (1)定义中断处理子程序 *
// (2)放置中断向量表 *
//本文件包含: *
// (1)SCI接收中断处理函数 *
// (2)未定义的中断处理函数 *
//说明:该文件与芯片具体型号有关 *
// (1)芯片型号MC68HC908GP32 *
//-------------------------------------------------------------------------*

#include "Type.h" //类型别名定义
#include "EnDisInt.h" //开放或禁止MCU各模块中断的宏定义
#include "SCI.h" //该头文件包含串行通信函数声明

//isrSCIre:接收中断处理函数------------------------------------------------*
//功能:接收1个字节数据, 发送接到的数据 *
//参数:无 *
//返回:无 *
//内部调用函数:SCIreN, SCIsendN *
//-------------------------------------------------------------------------*
#pragma interrupt_handler isrSCIre
void isrSCIre(void)
{
INT8U f; //标志是否接收到数据
INT8U SerialBuff[1]; //存放接收数据的数组
DisableMCUint(); //禁止总中断
//接收1个字节的数据
f = SCIreN(1, SerialBuff);
//若收到数据,则发送接到的数据
if (f == 0)
SCIsendN(1, SerialBuff);
EnableMCUint(); //开放总中断
}

//此处为用户中断处理函数的存放处

//

//未定义的中断处理函数,本函数不能删除
#pragma interrupt_handler isrDummy
void isrDummy(void)
{
}

//中断矢量表,需定义中断函数,可修改下表中的相应项目
//(interrupt service routine,isr 中断处理程序)
#pragma abs_address:0xffdc //中断向量表起始地址
void (* const _vectab[])(void) = {
//…………省略其他未使用的中断向量定义
isrSCIre, //SCI接收中断
//…………省略其他未使用的中断向量定义
};
#pragma end_abs_address

5.串行中断方式矢量表文件
HC08的中断向量表的详细说明在前面章节已经介绍。在使用中断方式时,只要将中断向量表中串行接收中断项的isrDummy改为中断处理函数的函数名isrSCIre即可,函数内容如上面所描述的。
本节仅讲述了串行通信的08C编程实例,用汇编编程的思想与之基本类似,读者可以参见教学资料的“MC08Ex2007\GP32\GP32S\C02_串行通信查询方式”和“MC08Ex2007\GP32\GP32S\C03_串行通信中断方式”下的汇编工程文件。

7.5.4 通过PC机方程序调试串行通信

1.自已动手编程序
参见教学资料中利用VB、VC、C#语言给出的串行测试程序。

2.串口调试器(SSCOM V2.0)
串口调试工具比较多,SSCOM是其中比较出色的一款软件,读者可以从网址HTTP://www.mcu51.com/download/sscom.rar中下载,本书教学资料的“MC08Ex2007\配套软件\串口调试器”文件夹下包含该软件。在一些与串口操作相关的实验中,该软件带来很多方便。软件运行界面如图7-6所示。本书中一些与串口数据收发相关的程序,高端软件可以用SSCOM配合进行,读者也可以参照前两节内容自行编写程序。

<<上一节 下一节>>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.