DSP SCI串口中断总结
调了两天程序,终于在串口外打通了。我竟然没注意到这两个问题:1,接收中断
如果想要循环进接收中断,那么每次进入接收中断都要对RXBUF进行读操作。//这个大家应该都知道的
2,发送中断
如果想利用发送中断,仅通过串口TXBUF发送一个是进不了中断的,还要ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;把中断标志位清0才能进中断。
或者直接ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;把发送中断位清0,也能促使 进入 发送中断
虽然感觉这么不可信,但这是调试结果。
有感兴趣的话,可以上程序讨论一下。。。
1、每次接收完一个数据产生中断,不把数据从RXBUF读出来那你进接收中断干嘛?好玩么?
2、表示不开FIFO的话从来不需要对TXFFINTCLR清零。
steaven2000 发表于 2015-7-7 20:53
1、每次接收完一个数据产生中断,不把数据从RXBUF读出来那你进接收中断干嘛?好玩么?
2、表示不开FIFO的话 ...
1,对,你说的对,接收中断不对RXBUF操作,是没意义的
2,我开了FIFO但是不知怎么取里面的数据 ,还是把RXBUF中的数据一个一个的接收进来的,
程序主要功能:接收一串数据,然后进 “发送中断函数” 中再把它发送出去 程序如下(用的是5.5)
//以下是中断函数
interrupt void SCIRXINTC_ISR(void) // SCI-C
{
DINT;
int i;
//从RXBUF中一个一个接收接收
for(i=0;i<8;i++){
buffer=ScicRegs.SCIRXBUF.all;
}
/////////////////TXFFINTCLR=1,就是用这句话,等接收中断程序执行完后立即触发发送中断
ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;
//复位
ScicRegs.SCIFFRX.bit.RXFIFORESET=0;
ScicRegs.SCIFFRX.bit.RXFIFORESET=1;
//接收中断标志位清0,以便下次还能进入接收中断
ScicRegs.SCIFFRX.bit.RXFFINTCLR=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP8;
EINT;
}
以下是初始化函数
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "string.h"
void scic_echoback_init(void);
void scic_fifo_init(void);
// FIFO BUFFER
char buffer ;
// Global counts used in this example
Uint16 LoopCount;
Uint16 ErrorCount;
void main(void)
{
Uint16 ReceivedChar;
char *msg;
Uint16 i, j,k;
InitSysCtrl();
InitSciGpio();
InitXintf16Gpio();
DINT;//禁止全局中断
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER8.bit.INTx6=1; //EnableSCI-C TX
PieCtrlRegs.PIEIER8.bit.INTx5=1; //Enable SCI-RRX
IER |= M_INT8; //Enable the cpu interrupt
EINT;//使能全局中断
ERTM;//开全局实时中断
LoopCount = 0;
ErrorCount = 0;
scic_echoback_init();// Initalize SCI for echoback
for(k=0;k<8;k++){
buffer=0;
}
while(1);
}
void scic_echoback_init()
{
ScicRegs.SCICCR.all =0x0007; // 1 stop bit,No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScicRegs.SCICTL1.bit.RXENA=1;// enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKE
ScicRegs.SCICTL1.bit.TXENA=1;
//在这开了FIFO中断
ScicRegs.SCICTL2.bit.TXINTENA = 1;
ScicRegs.SCICTL2.bit.RXBKINTENA =1;
#if (CPU_FRQ_150MHZ)
ScicRegs.SCIHBAUD =0x0001;// 9600 baud @LSPCLK = 37.5MHz.
ScicRegs.SCILBAUD =0x00E7;
#endif
#if (CPU_FRQ_100MHZ)
ScicRegs.SCIHBAUD =0x0001;// 9600 baud @LSPCLK = 20MHz.
ScicRegs.SCILBAUD =0x0044;
#endif
/******SCI FIFO Initialize******/
ScicRegs.SCIFFTX.bit.TXFIFOXRESET=1;
ScicRegs.SCIFFTX.bit.SCIFFENA=1;
ScicRegs.SCIFFTX.bit.TXFFST=0;
ScicRegs.SCIFFTX.bit.TXFFINT=0;//////////
ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;
ScicRegs.SCIFFTX.bit.TXFFIENA=1;
ScicRegs.SCIFFTX.bit.TXFFIL=0;
ScicRegs.SCIFFRX.bit.RXFFOVF=0;
ScicRegs.SCIFFRX.bit.RXFFOVRCLR=1;
ScicRegs.SCIFFRX.bit.RXFIFORESET=1;
ScicRegs.SCIFFRX.bit.RXFFST=0;
ScicRegs.SCIFFRX.bit.RXFFINT=0;
ScicRegs.SCIFFRX.bit.RXFFINTCLR=1;
ScicRegs.SCIFFRX.bit.RXFFIENA=1;
ScicRegs.SCIFFRX.bit.RXFFIL=8;
ScicRegs.SCICTL1.bit.SWRESET=1;// Relinquish SCI from Reset
}
//===========================================================================
// No more.
//===========================================================================
从书上看,我的理解是:开FIFO后,接收BUF不起作用了,数据直接进入了FIFO的16级缓冲器中的,当中断来时,可心直接从FIFO的缓冲器中读出来
调试了一天也没弄出来,最后还是用一般的方法接收一串数据,并且这个BUF明显也起作用了
特来请教一下,非常感谢。
发送的FIFO未用过接收的FIFO使用还不错的,但是他的中断标志位有点奇怪。。
页:
[1]