发新帖我要提问
12
返回列表
打印

sci的发送中断服务程序进不了

[复制链接]
楼主: tianwen_4524
手机看帖
扫描二维码
随时随地手机跟帖
21
asas1235813| | 2013-8-30 23:06 | 只看该作者 回帖奖励 |倒序浏览
void InitSci(void)
{
        SciaRegs.SCICCR.bit.STOPBITS = 0; //设置为1个停止位
        SciaRegs.SCICCR.bit.PARITYENA = 0; //禁止奇偶校验
        SciaRegs.SCICCR.bit.LOOPBKENA = 0; //禁止回送测试模式功能
        SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0; //只与PC上位机进行通信,因此选择空闲线模式协议
        SciaRegs.SCICCR.bit.SCICHAR = 7; //选择数据的长度为8位

        SciaRegs.SCICTL1.bit.TXENA = 1; //启动发送器工作
        SciaRegs.SCICTL1.bit.RXENA = 1; //使能接收位

        SciaRegs.SCIHBAUD = 0;
        SciaRegs.SCILBAUD = 0xF3;//设置波特率为19200
        SciaRegs.SCICTL1.bit.SWRESET = 1; //复位SCI模块
}


****************************************************************************/
#include "DSP28_Device.h"
unsigned int Sci_Result[100];//用于存放接收到的数据
unsigned int i;
unsigned int Send_Flag; //发送标志位。1:有数据需要发送 0:无数据需要发送
/****************************************************************************
*
*名    称:SciaTx_Ready()
*
*功    能:查询SCICTL2寄存器的TXRDY标志位,来确认发送准备是否就绪
*
*入口参数:无
*
*出口参数:i,即TXRDY的状态
*          1:发送准备已经就绪
*          0:发送准备尚未就绪
*      
****************************************************************************/
int SciaTx_Ready()
{
        unsigned int ans;
        if(SciaRegs.SCICTL2.bit.TXRDY == 1)
        {
                ans = 1;
        }
        else
        {
                ans= 0;
        }
        return ans;
}
/****************************************************************************
*
*名    称:SciaRx_Ready()
*
*功    能:查询SCIRXST寄存器的RXRDY标志位,来确认接收准备是否就绪
*
*入口参数:无
*
*出口参数:i,即RXRDY的状态
*          1:接收准备已经就绪
*          0:接收准备尚未就绪
*      
****************************************************************************/
int SciaRx_Ready()
{
        unsigned int ans;
        if(SciaRegs.SCIRXST.bit.RXRDY == 1)
        {
                ans = 1;
        }
        else
        {
                ans = 0;
        }
        return ans;
}

void main()
{
        DINT;
        IER = 0x0000;
        IFR = 0x0000;

        InitSysCtrl();
        InitPieCtrl();
        InitPieVectTable();
        InitGpio();
        InitPeripherals();

        for(i=0;i<100;i++)
        {
                Sci_Result[i] = 0;
        }
        Send_Flag = 0;
        i=0;

        PieCtrl.PIEIER9.bit.INTx1 = 1; //使能PIE中断的接收中断
        PieCtrl.PIEIER9.bit.INTx2 = 1; //使能PIE中断的发送中断

        IER|=M_INT9;
        EINT;
        DRTM;
        while(1);
}
interrupt void SCIRXINTA_ISR()     // SCI-A接收中断函数
{
        Sci_Result[i] = SciaRegs.SCIRXBUF.all;
        Send_Flag = 1;
        if(SciaTx_Ready() == 1)
        {
                SciaRegs.SCITXBUF =  Sci_Result[i];
        }
         PieCtrl.PIEACK.all = PIEACK_GROUP9;
         //EINT;
}

interrupt void SCITXINTA_ISR()     // SCI-A发送中断函数
{
        if(Send_Flag == 1)
        {
                Send_Flag = 0;
                i++;
                if(i==100)
                {
                        i=0;
                }
        }
        PieCtrl.PIEACK.all = PIEACK_GROUP9;
        //EINT;
}

使用特权

评论回复
22
asas1235813| | 2013-8-30 23:07 | 只看该作者
这个可以进去,在板子上测试过了。。。。。

使用特权

评论回复
23
tianwen_4524|  楼主 | 2013-8-31 09:16 | 只看该作者
asas1235813 发表于 2013-8-30 23:07
这个可以进去,在板子上测试过了。。。。。

:)非常感谢!!!我试试,如有问题,望能再请教!!!!:handshake

使用特权

评论回复
24
asas1235813| | 2013-8-31 09:34 | 只看该作者
tianwen_4524 发表于 2013-8-31 09:16
非常感谢!!!我试试,如有问题,望能再请教!!!!

也是菜鸟,一起讨论:lol

使用特权

评论回复
25
tianwen_4524|  楼主 | 2013-8-31 09:38 | 只看该作者
asas1235813 发表于 2013-8-31 09:34
也是菜鸟,一起讨论

兄弟,真谦虚!
    我看了你的程序,觉得有点奇怪,怎么在接收中断里发送数据,难道在发送中断里发送数据不行吗???

使用特权

评论回复
26
tianwen_4524|  楼主 | 2013-8-31 09:40 | 只看该作者
asas1235813 发表于 2013-8-31 09:34
也是菜鸟,一起讨论

不过我先回去上机试试再说吧!!!!!!!非常感谢了!!

使用特权

评论回复
27
asas1235813| | 2013-8-31 09:53 | 只看该作者
tianwen_4524 发表于 2013-8-31 09:40
不过我先回去上机试试再说吧!!!!!!!非常感谢了!!

才上手一个月,确实是菜鸟:lol    所谓的发送中断的含义并不是在中断里面进行发送数据, 发送中断进入的条件是TXRDY被置位以后才能进入发送中断。而SCITXBYF的数据发送完成以后TXRDY才会被置位,也就是说在发送数据完成之后才进入发送中断,换句话来说,并不是通过中断来发送数据,而是发送数据完成以后才进入中断。同样接收中断也是接收完数据后才进入接收中断。所以使用不需要一定在发送中断里发送数据,而可以再任何一个中断里都可以发送数据,比如说定时中断,周期中断也可以发送,也可以,不知道懂了没。。。。。

使用特权

评论回复
28
tianwen_4524|  楼主 | 2013-8-31 10:27 | 只看该作者
asas1235813 发表于 2013-8-31 09:53
才上手一个月,确实是菜鸟    所谓的发送中断的含义并不是在中断里面进行发送数据, 发送中断进入的 ...

明白!谢谢!!!

使用特权

评论回复
29
asas1235813| | 2013-8-31 10:29 | 只看该作者
tianwen_4524 发表于 2013-8-31 10:27
明白!谢谢!!!

相互交流 :lol

使用特权

评论回复
30
tianwen_4524|  楼主 | 2013-9-4 10:44 | 只看该作者
asas1235813 发表于 2013-8-31 10:29
相互交流

非常感谢各位,问题搞定了!

我试了之前上楼的方法,再接收中断中发送数据,能正常进入发送中断!
后,我又试了再发送中断中发送数据,也能正常进入发送中断!
我的方法,与大家共享一下,与有什么不对请指教!
void main()
{        SysCtrl_init();
          DINT;
          IER=0;
         IFR=0;
        PieCtrl_init();
        PieVectTable_init();
       Sci_init();
      EALLOW;
      PieVectTable.Txint=&SCITXINTA_ISR;
     PieVectTable.Rxint=&SCIRXINTA_ISR;
     EDIS;
     PieCtrl.PIEIER9.bit.INTX1=1;
     PieCtrl.PIEER9.bit.INTX2=1;
     IER=IER|0X0100;
     EINT;
     if(SciaRegs.SCICTL2.bit.TXRDY==1)
              SciaRegs.SCITXBUF=TXDATA;
     while(SciaRegs.SCICTL2.bit.TXEMPTY==1)
             SciaRegs.SCITXBUF=TXDATA;
     while(1)
     {
               while(SciaRegs.SCICTL2.bit.TXEMPTY==1)
                       SciaRegs.SCITXBUF=TXDATA;
     }
}

void SCIRXINTA_ISR()
{   
      RXDATA=SciaRegs.SCIRXBUF.all&0xFF;
      PieCtrl.PIEACK.bit.ACK9=1;
}

void SCIRXINTA_ISR()
{
      SciaRegs.SCITXBUF=TXDATA;
     TXDATA++;
      if(TXDATA>=256)
           TXDATA=0;
     PieCtrl.PIEACK.bit.ACK9=1;

}

使用特权

评论回复
31
wei3890836| | 2015-1-6 09:39 | 只看该作者
HD21425 发表于 2013-8-30 22:07
上面的“发送一个数据来启动发送中断”意思是:你先要给SCITXBUF赋一个值,这样SCITXBUF会发送给TXSHF,然 ...

向SCITXBUF赋一个值,那我接收到这个无用的值怎么处理?

使用特权

评论回复
32
wei3890836| | 2015-1-6 09:47 | 只看该作者
tianwen_4524 发表于 2013-9-4 10:44
非常感谢各位,问题搞定了!

我试了之前上楼的方法,再接收中断中发送数据,能正常进入发送中断!

你在发送中断中发送数据也能进入中断是因为你在主函数中预先向SciaRegs.SCITXBUF=TXDATA写入数据,这才触发发送中断的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则