首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

AW 串口通讯

AW 串口通讯

串口中断不能打开什么原因啊!

//====================================================================
//函数名:Init_SCI1
//作用:串口1初始化
//====================================================================
void Init_SCI1(void)
{
SCI1BDH=0x00;//波特率设置:波特率=总线频率/(16*BR)
SCI1BDL=0x41;//总线频率为10M,波特率为9615,BR=65
SCI1C1=0x00;//0x00:开始位+8个数据位(低位在前)+停止位;无校验
//0x02:开始位+8个数据位(低位在前)+停止位;偶校验,even
//0x03:开始位+8个数据位(低位在前)+停止位;奇校验,odd
//#define SCI1C1 _SCI1C1.Byte
//0 SCI1C1_PT 0,奇效验1,偶效验
//1 SCI1C1_PE 奇偶效验允许位
//2 SCI1C1_ILT 空闲方式选择位
//3 SCI1C1_WAKE 唤醒条件选择位
//4 SCI1C1_M 字符长度选择位
//5 SCI1C1_RSRC 接收源选择位
//6 SCI1C1_SCISWAI 等待模式下时钟选择位
//7 SCI1C1_LOOPS 循环模式选择位
// SCI1C2_TE=1;//0:禁止发送;1:使能发送
// SCI1C2_TIE=0;//0:禁止发送中断;1:使能发送中断
// SCI1C2_TCIE=0; //发送完成中断允许位

// SCI1C2_RIE=1;//0:禁止接收中断;1:使能接收中断
// SCI1C2_RE=1;//0:禁止接收;1:使能接收
SCI1C2=0x2C;//使能接受中断 使能发送和接收
SCI1C3 = 0x00;


cTransNum=0; //清发送数据计数值
cTransSum=0; //清发送数据效验和
cTransBuf[0]='\0'; //设定发送的数据长度为零

cReceiveNum=0; //清接收数据计数值
cReceiveSum=0; //清接收数据效验和
cReceiveBuf[0]='\0'; //设定接收的数据长度为零

cReceiveTemp=0; //清本次接收数据暂存
cReceiveTemp1=0; //清上次接收数据暂存
cTimeNum=0; //清定时发送计数
}

void main(void)
{
DisableInterrupts; //禁止中断
Init_FBE(); //初始化晶振
Init_mclk();
Init_PortB();
Init_PortF(); //初始化LED

Init_KBI(); //初始化按键
Init_SCI1(); //初始化SCI
Init_LCD();
Init_TPM(); //初始化定时器

EnableInterrupts; /* 使能中断*/


for(;;)
{

switch(cReceiveBuf[1])
{
case 0: ////////当前处于监视状态
DisplayFunction(iStakeoutValue1,iStakeoutValue2);
PTFD_PTFD0=0;
break;
case 1:
DisplayFunction(iStakeoutValue1,iStakeoutValue2); //显示功能项菜单
// DisplayLed2(iStakeoutValue2); //显示功能项对应的数值
// bValueGlitter=0; //清闪烁标志位
break;
case 2:
DisplayFunction(iStakeoutValue1,iStakeoutValue2); //显示功能项菜单
// DisplayLed2(iStakeoutValue2); //显示功能项对应的数值
// bValueGlitter=1; //置闪烁标志位
break;
default:
// cDisplayNumHex[0]=cDisplayNumHex[1]=ErrorId[0];
// cDisplayNumHex[2]=ErrorId[5]; //如不是上述故障则显示0.0.
// cDisplayNumHex[3]=ErrorId[5];
// iStakeoutValue2=cReceiveBuf[5]*256+cReceiveBuf[4];
break;
}
//
} /* loop forever */
}


//====================================================
//SCI1接收中断服务程序
//====================================================
interrupt VectorNumber_Vsci1rx void isrSCI1(void)
{
PTFD_PTFD1=0; 测试用不执行此指令
/* cReceiveTemp=SCI1D; //接收当前的字符
if(cReceiveTemp=='e') ////////接收到结束码后的处理
{
if(cReceiveBuf[cReceiveNum-1]==cReceiveSum) //////效验和正确
{
cReceiveBuf[cReceiveNum-1]='\0'; //上次接收到的字符为接收数组结束标志
Receive(); //接收数据处理
}
cReceiveNum=0; //清发送已接收的数据计数
cReceiveSum=0; //清接收效验和
cReceiveBuf[0]='\0'; //设定接收数据长度为零
cReceiveTemp=0; //清接收暂存
cReceiveTemp1=0; //清上次接收暂存
PTFD_PTFD1=0;
}
else ////////接收数据
{
cReceiveBuf[cReceiveNum]=cReceiveTemp; //把本次接收的数据放到数组中
cReceiveSum+=cReceiveTemp1; //求效验和
cReceiveTemp1=cReceiveTemp; //把本次接收的数据放到暂存,用作下次的效验和
cReceiveNum++; //接收数据计数加1
} */
// PTFD_PTFD1=0;
// SCI1C2_RIE=0;
}

//====================================================
//SCI1发送中断服务程序
//====================================================
interrupt VectorNumber_Vsci1tx void SCI1_TX_ISR(void)
{ //清发送中断允许位
/* if((cTransNum)<10) ////////发送数据 strlen(cTransBuf
{
SCI1D=cTransBuf[cTransNum]; //发送数据
cTransSum+=cTransBuf[cTransNum]; //求发送数据效验和
cTransNum++; //已发送的数据个数
}
else if((cTransNum)==10) ////////发送效验和 strlen(cTransBuf)
{
SCI1D=cTransSum; //发送效验和
cTransNum++; //已发送的数据个数
}
else if((cTransNum>10)) ////////发送结束码 strlen(cTransBuf))
{
SCI1D='e'; //发送结束码
cTransNum=0; //清计数位
cTransSum=0; //清发送数据效验和
cTransBuf[0]='\0'; //设定发送数据长度为零
//while(SCI1S1_TC)
//SCI1S1_TC=0;
SCI1C2_TIE=0; //清发送中断标志
// PTFD_PTFD1=0;
} */
}


在定时器中断能够正常运行
在SCi中断中不能运行

void Init_SCI1(void)
{
SCI1BDH=0x00;//波特率设置:波特率=总线频率/(16*BR)
SCI1BDL=0x41;//总线频率为10M,波特率为9615,BR=65
SCI1C1=0x00;//0x00:开始位+8个数据位(低位在前)+停止位;无校
SCI1C2=0x2C;//使能接受中断 使能发送和接收
SCI1C3 = 0x00;
}

void main(void)
{
DisableInterrupts; //禁止中断
Init_FBE(); //初始化晶振
Init_mclk();
Init_PortB();
Init_PortF(); //初始化LED
Init_KBI(); //初始化按键
Init_SCI1(); //初始化SCI
Init_LCD();
Init_TPM(); //初始化定时器
EnableInterrupts; /* 使能中断*/


for(;;)
{
}
interrupt VectorNumber_Vsci1rx void isrSCI1(void)
{
PTFD_PTFD1=0; 测试用不执行此指令
}

interrupt VectorNumber_Vsci1tx void SCI1_TX_ISR(void)
{ }在定时器中断能够正常运行
在SCi中断中不能运行

void Init_SCI1(void)
{
SCI1BDH=0x00;//波特率设置:波特率=总线频率/(16*BR)
SCI1BDL=0x41;//总线频率为10M,波特率为9615,BR=65
SCI1C1=0x00;//0x00:开始位+8个数据位(低位在前)+停止位;无校
SCI1C2=0x2C;//使能接受中断 使能发送和接收
}void main(void)
{
DisableInterrupts; //禁止中断
Init_SCI1(); //初始化SC
EnableInterrupts; /* 使能中断*/
for(;;)
{}

interrupt VectorNumber_Vsci1rx void isrSCI1(void)
{
PTFD_PTFD1=0; 测试用不执行此指令
}

interrupt VectorNumber_Vsci1tx void SCI1_TX_ISR(void)
{ }

中断矢量地址是否正确?
海纳百川  有容乃大

发送现在正常接收只能接收一下字符interrupt VectorNumber_Vsci1rx void isrSCI1(void)
{
byte temp = 0;
temp = SCI1S1; //接收当前的字符
cReceiveTemp=SCI1D; //接收当前的字符
if(cReceiveTemp=='e') ////////接收到结束码后的处理
{
temp = SCI1S1;
if(cReceiveBuf[cReceiveNum-1]==cReceiveSum) //////效验和正确
{
cReceiveBuf[cReceiveNum-1]='\0'; //上次接收到的字符为接收数组结束标志
Receive(); //接收数据处理
}
SCI1C2_RIE=0;
cReceiveNum=0; //清发送已接收的数据计数
cReceiveSum=0; //清接收效验和
cReceiveBuf[0]='\0'; //设定接收数据长度为零
cReceiveTemp=0; //清接收暂存
cReceiveTemp1=0; //清上次接收暂存

}
else ////////接收数据
{
temp=SCI1S1;
cReceiveBuf[cReceiveNum]=cReceiveTemp; //把本次接收的数据放到数组中
cReceiveSum+=cReceiveTemp1; //求效验和
cReceiveTemp1=cReceiveTemp; //把本次接收的数据放到暂存,用作下次的效验和
cReceiveNum++; //接收数据计数加1
}
}

返回列表