搜索
bottom↓
回复: 3

DSP SCI串口中断总结

[复制链接]

出0入0汤圆

发表于 2015-7-7 19:56:24 | 显示全部楼层 |阅读模式
调了两天程序,终于在串口外打通了。我竟然没注意到这两个问题:

1,接收中断
     如果想要循环进接收中断,那么每次进入接收中断都要对RXBUF进行读操作。//这个大家应该都知道的

2,发送中断
    如果想利用发送中断,仅通过串口TXBUF发送一个是进不了中断的,还要ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;把中断标志位清0才能进中断。
   或者直接ScicRegs.SCIFFTX.bit.TXFFINTCLR=1;把发送中断位清0,也能促使 进入 发送中断

虽然感觉这么不可信,但这是调试结果。

有感兴趣的话,可以上程序讨论一下。。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-7-7 20:53:56 | 显示全部楼层
1、每次接收完一个数据产生中断,不把数据从RXBUF读出来那你进接收中断干嘛?好玩么?
2、表示不开FIFO的话从来不需要对TXFFINTCLR清零。

出0入0汤圆

 楼主| 发表于 2015-7-8 20:06:41 | 显示全部楼层
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 [100];
// 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;            //Enable  SCI-C TX
        PieCtrlRegs.PIEIER8.bit.INTx5=1;            //Enable SCI-R  RX
           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[k]=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明显也起作用了

特来请教一下,非常感谢。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-7-11 23:49:51 | 显示全部楼层
发送的FIFO未用过接收的FIFO使用还不错的,但是他的中断标志位有点奇怪。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 19:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表