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;//用于存放接收到的数据
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 = 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 = SciaRegs.SCIRXBUF.all;
        Send_Flag = 1;
        if(SciaTx_Ready() == 1)
        {
                SciaRegs.SCITXBUF =Sci_Result;
        }
       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;
}

asas1235813 发表于 2013-8-30 23:07

这个可以进去,在板子上测试过了。。。。。

tianwen_4524 发表于 2013-8-31 09:16

asas1235813 发表于 2013-8-30 23:07 static/image/common/back.gif
这个可以进去,在板子上测试过了。。。。。

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

asas1235813 发表于 2013-8-31 09:34

tianwen_4524 发表于 2013-8-31 09:16 static/image/common/back.gif
非常感谢!!!我试试,如有问题,望能再请教!!!!

也是菜鸟,一起讨论:lol

tianwen_4524 发表于 2013-8-31 09:38

asas1235813 发表于 2013-8-31 09:34 static/image/common/back.gif
也是菜鸟,一起讨论

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

tianwen_4524 发表于 2013-8-31 09:40

asas1235813 发表于 2013-8-31 09:34 static/image/common/back.gif
也是菜鸟,一起讨论

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

asas1235813 发表于 2013-8-31 09:53

tianwen_4524 发表于 2013-8-31 09:40 static/image/common/back.gif
不过我先回去上机试试再说吧!!!!!!!非常感谢了!!

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

tianwen_4524 发表于 2013-8-31 10:27

asas1235813 发表于 2013-8-31 09:53 static/image/common/back.gif
才上手一个月,确实是菜鸟    所谓的发送中断的含义并不是在中断里面进行发送数据, 发送中断进入的 ...

明白!谢谢!!!

asas1235813 发表于 2013-8-31 10:29

tianwen_4524 发表于 2013-8-31 10:27 static/image/common/back.gif
明白!谢谢!!!

相互交流 :lol

tianwen_4524 发表于 2013-9-4 10:44

asas1235813 发表于 2013-8-31 10:29 static/image/common/back.gif
相互交流

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

我试了之前上楼的方法,再接收中断中发送数据,能正常进入发送中断!
后,我又试了再发送中断中发送数据,也能正常进入发送中断!
我的方法,与大家共享一下,与有什么不对请指教!
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;

}

wei3890836 发表于 2015-1-6 09:39

HD21425 发表于 2013-8-30 22:07 static/image/common/back.gif
上面的“发送一个数据来启动发送中断”意思是:你先要给SCITXBUF赋一个值,这样SCITXBUF会发送给TXSHF,然 ...

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

wei3890836 发表于 2015-1-6 09:47

tianwen_4524 发表于 2013-9-4 10:44 static/image/common/back.gif
非常感谢各位,问题搞定了!

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


你在发送中断中发送数据也能进入中断是因为你在主函数中预先向SciaRegs.SCITXBUF=TXDATA写入数据,这才触发发送中断的
页: 1 [2]
查看完整版本: sci的发送中断服务程序进不了