sci的发送中断服务程序进不了
#include "DSP28_Device.h"void InitPieCtrl(void);
void InitPieVectTable(void);
interrupt void TX_ISR(void);
//interrupt void RX_ISR(void);
Uint16 Send_Flag,RX_dat,i,j,TX_dat;
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化SCIA寄存器*/
InitSci();
for(i = 0; i < 100; i++)
{
RX_dat=0;
TX_dat=i;
}
i = 0;
j = 0;
Send_Flag = 0;
EALLOW;
PieVectTable.TXAINT=&TX_ISR;
// PieVectTable.RXAINT=&RX_ISR;
EDIS;
// PieCtrl.PIEIER9.bit.INTx1=1;
PieCtrl.PIEIER9.bit.INTx2=1;
IER=IER|0x0100;
EINT;
while(1)
{
// if(SciaRegs.SCICTL2.bit.TXRDY==1&&Send_Flag==1)
// { SciaRegs.SCITXBUF=RX_dat;
//i++;
//Send_Flag=0;
//if(i==j)
//{ i=0;
// j=0;
//}
//if(i==100)
// i=0;
//
// }
;
}
}
interrupt void TX_ISR(void)
{
// PieCtrl.PIEIER9.bit.INTx1=0;
SciaRegs.SCITXBUF=RX_dat;
i++;
if(i==100)
{
PieCtrl.PIEIER9.bit.INTx2=0;
}
PieCtrl.PIEACK.bit.ACK9=1;
// PieCtrl.PIEIER9.bit.INTx1=1;
}
//interrupt void RX_ISR(void)
//{
// RX_dat=SciaRegs.SCIRXBUF.all;
// Send_Flag=1;
// j++;
// if(j==2)
//j=0;
// PieCtrl.PIEACK.bit.ACK9=1;
//}
首先SCI的接收中断服务程序可以正常进入执行,同时,也可以通过判断SciaRegs.SCICTL2.TXRDY==1来发送数据,在串口接收窗口中能正常显示发送的数据,但就是进不去发送中断服务程序中,请求帮忙???拜托兄弟们和版主们,给点意见,万分感谢!!!!!
怎么没一个声音 没一个人知道呢??还是问题太简单??还是问题解释得不明白??都说下喂,兄弟,版主。。。 究竟为什么没人的呢??? 究竟为什么没人的呢??? 发送TXENA使能,从SCITXBUF向TXSHF赋值使得TXRDY=1,表明SCITXBUF可以接受新的值,如果发送中断TX INT ENA使能,则数据的转移产生中断,而向SCITXBUF赋值将清零TXRDY。试着向SCITXBUF赋个值呢。 ggzzc 发表于 2013-4-19 07:09 static/image/common/back.gif
发送TXENA使能,从SCITXBUF向TXSHF赋值使得TXRDY=1,表明SCITXBUF可以接受新的值,如果发送中断TX INT ENA ...
首先非常感谢这位兄台的回答。我也赋值给TXBUF了(即在初始化后SciaRegs.SCIATXBUF=a),但还是进不去中断,但却是紧紧进不去中断,但又可以通过查询方式将数据发送出去(即通过判断SciaRegs.SCIACTL2.BIT.TXRDY==1),同时接收的中断服务程序又能正常进入。
怎么没人回答了呢????我试了几次,在标准模式下,怎么也进不去发送中断中去。但在FIFO模式就可以。
要不这样,谁可以给个例子我,拜托,我是新手,希望高手们能帮帮忙,将万分感谢。。。。。。。。。。。。。。。。。。。。。。。。 tianwen_4524 发表于 2013-5-30 17:06 static/image/common/back.gif
怎么没人回答了呢????我试了几次,在标准模式下,怎么也进不去发送中断中去。但在FIFO模式就可以。
要 ...
void InitSci(void)
{
// Initialize SCI-A:
EALLOW;
GpioMuxRegs.GPFMUX.all = 0x0030;
EDIS;
SciaRegs.SCIFFTX.bit.SCIRST=0; //复位SCI的发送和接收通道
/* loopback 8 bit data */
SciaRegs.SCICCR.all = 0x07; // 1 bit stop, disable parity, idle mode, 8 bits data
//一个停止位,奇校验,奇偶校验禁止,自测试模式禁止,空闲位模式协议选择,字符长度为8位
//地址位模式在帧中增加了一个附加位,空闲线模式常用于正常通信
SciaRegs.SCICTL1.all = 0x03; // 发送器使能,接收器使能
//接收错误中断禁止,SCI复位,无唤醒模式,睡眠模式禁止
// SciaRegs.SCICTL2.all = 0x03; //使能RXRDY/BRKDT中断,使能TXRDY中断
SciaRegs.SCIFFTX.bit.SCIFFENA=1;//使能SCI FIFO增强功能
SciaRegs.SCIFFTX.bit.TXFFILIL=0;//设置发送FIFO中断等级位
SciaRegs.SCIFFRX.bit.RXFFIL=4; //设置接收FIFO中断等级位,匹配中断
SciaRegs.SCIFFRX.bit.RXFFIENA=1;// 禁止SCIA FIFO接收中
SciaRegs.SCIFFTX.bit.TXFFIENA=0;// 禁止SCIA FIFO发送中
SciaRegs.SCIFFTX.bit.TXINTCLR=1;//清除中断标志位
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志位
////////////////////9600///19200/////
// SciaRegs.SCIHBAUD = 0x00;//0x01;//0x00;
// SciaRegs.SCILBAUD = 0xF3;//0x44;//0xa2;
// SciaRegs.SCICTL1.all = 0x23;//SCI退出复位
//tbd...
//退出复位状态
SciaRegs.SCICTL1.bit.SWRESET=1;
SciaRegs.SCIFFTX.bit.SCIRST=1;
// Initialize SCI-B:
//tbd...
}
interrupt void SCIRXINTA_ISR(void) // SCI-A
{
unsigned char i; //ReceivedAChar;
DINT;//关闭总中断
// 数据接收
//temp=SciaRegs.SCIFFRX.bit.RXFIFST; //数据长度
for(i=0;i<5;i++)
{
Receviced_data = SciaRegs.SCIRXBUF.all;
//ReceivedAChar = SciaRegs.SCIRXBUF.all;
//Receviced_data = ReceivedAChar; //接收串口数据
Receviced_data = '\0';
}
flag=1; //表示接受完成
SciaRegs.SCIFFRX.bit.RXFIFORESET=0; //将FIFO指针复位为0
for(i=0;i<20;i++); //延时
SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //退出复位状态
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // 清除接收中断标志
SciaRegs.SCIFFRX.bit.RXOVF_CLR = 1; //清除溢出中断标志
PieCtrl.PIEACK.all |= M_INT9; //响应中断
EINT; //开总中断
}
interrupt void SCITXINTA_ISR(void) // SCI-A
{
unsigned char ReceivedAChar;
DINT;//关闭总中断
//自动侦测波特率处理
if(SciaRegs.SCIFFCT.bit.ABD == 1)
{
SciaRegs.SCIFFCT.bit.ABDCLR = 1; //清除ABD
SciaRegs.SCIFFCT.bit.CDC = 0; //禁止自动波特率侦测
ReceivedAChar = SciaRegs.SCIRXBUF.all;
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//清除中断标志位
SciaRegs.SCIFFRX.bit.RXFIFORESET=0; //将FIFO指针复位为0
SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //退出复位状态
if(ReceivedAChar == 'A')
{
Send_String_SCIA("right!");// Autobaud
SciaRegs.SCIFFRX.bit.RXFFIENA = 1;// 使能SCIA FIFO接收中断
connect_right = 1;
}
else
{
Send_String_SCIA("wrong!");// Autobaud
connect_right = 0;
}
}
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;//清除中断标志位
PieCtrl.PIEACK.all |= M_INT9; //响应中断
EINT; //开总中断
}
参考一下不行了告诉我 zhangmangui 发表于 2013-5-30 17:58 static/image/common/back.gif
void InitSci(void)
{
// Initialize SCI-A:
非常感谢, SciaRegs.SCIFFTX.bit.SCIFFENA=1;//使能SCI FIFO增强功能
SciaRegs.SCIFFTX.bit.TXFFILIL=0;//设置发送FIFO中断等级位
不过我的意思是,在SCIFFENA=0时(即在标准模式中),进入TX中断的服务程序里,在SCIFFENA=1,(FIFO模式中),我的代码也已能进入TX中断!!!!!!有在标准模式中,进入TX中断的服务程序的例子吗?????????
tianwen_4524 发表于 2013-5-31 09:35 static/image/common/back.gif
非常感谢, SciaRegs.SCIFFTX.bit.SCIFFENA=1;//使能SCI FIFO增强功能
...
SCI不用FIFO的我没试过 zhangmangui 发表于 2013-6-1 10:32 static/image/common/back.gif
SCI不用FIFO的我没试过
谢谢。。。 等待。。。知道的,记得我在等你。。。 SCITXBUF向TXSHF赋值使得TXRDY=1,也就是说你想通过发送中断发送一串数据,首先要先发送一个数据来启动发送中断,然后在发送中断里发送剩下的数据。这个启动很重要! 上面的“发送一个数据来启动发送中断”意思是:你先要给SCITXBUF赋一个值,这样SCITXBUF会发送给TXSHF,然后TXRDY=1,然后就会进入中断
页:
[1]
2