This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28027 FIFO使用问题

Other Parts Discussed in Thread: TMS320F28027, CONTROLSUITE

大家好,我使用的DSP是TMS320F28027。现在我需要做PC和DSP的双向通讯,利用PC来监控。数据格式:1位起始位,8位数据位,一位停止位,无校验位和校验位。双向通讯时:DSP每隔5分钟,发送一次数据至PC;而只有当需要改变DSP工作状态时,PC才需要发送数据给DSP,由于PC每次发送数据为4帧,所以使用了28027的FIFO功能,原本打算28027一次FIFO中断可以接收4帧数据,但此功能在程序中没有实现,只能每次中断接收这4帧数据中的第一帧数据。如下是SCI FIFO配置和接收程序:

void InitSci(void)
{
// Initialize SCI-A:
 SciaRegs.SCICCR.all =0x0007;    // 1bit 停止位    无循环模式
                                    // 无极性,       字符长度:8 bits,
                                    // 异步模式,     空闲线协议
 SciaRegs.SCICTL1.all =0x0003;   // 使能 TX, RX, 内部 SCICLK,
                                    // 禁止 RX ERR, SLEEP, TXWAKE
 SciaRegs.SCIHBAUD = 0x00;       // Baud=15MHz/((0x00C2+1)*8)
 SciaRegs.SCILBAUD = 0xC2;
 SciaRegs.SCICTL2.bit.TXINTENA = 1; // 使能SCI发送中断
 SciaRegs.SCICTL2.bit.RXBKINTENA = 1;  // 使能SCI接收中断 
 SciaRegs.SCIFFTX.all = 0xE060; 
                                 // bit 15 = 1 : 退出复位
         // bit 14 = 1 : 使能FIFO增强模式
         // bit 13 = 1 : 使能 TX FIFO操作
         // bit 6 = 1 :  CLR TXFFINT-标志
         // bit 5 = 1 :  使能TX FIFO匹配
         // bit 4-0 :    如果TX FIFO等于0,产生TX-ISR中断
 SciaRegs.SCIFFRX.all = 0xE064; // Rx 中断级设置为4
 SciaRegs.SCICTL1.all =0x0023; // 使SCI退出复位  
}

void InitSciGpio()
{
   InitSciaGpio();
}

void InitSciaGpio()
{
   EALLOW;

 GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;    // Enable pull-up for GPIO19 (SCIRXDA)
 GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;    // Disable pull-up for GPIO12 (SCITXDA)

 GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;  // Asynch input GPIO19 (SCIRXDA)


 GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2;   // Configure GPIO19 for SCIRXDA operation
 GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2;   // Configure GPIO12 for SCITXDA operation

    EDIS;
}

interrupt void sciaRxFifoIsr(void)
{  
 static int l=0;
 Uint16 k=0;
 static int rdd[4];

/*********************************************************************************************************************/
 EINT;                                               // Enable Global interrupt INTM   
 
 EALLOW;
 SciaRegs.SCIFFRX.bit.RXFIFORESET = 0;
 SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
 SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;                // clear receive FIFO interrupt flag
 PieCtrlRegs.PIEACK.bit.ACK9 |= PIEACK_GROUP9;       // Issue PIE ack
 EDIS;

/*********************************************************************************************************************/
/***   Receive Data                                                                                                ***/
/*********************************************************************************************************************/  
 
 for(l=0;l<4;l++)
 {
  rdataA[l] = SciaRegs.SCIRXBUF.bit.RXDT; 
 }
 
 if(l==4)                                     // recieve 4 Remote control data
 {
  l = 0;
  Recive_OK_Flag = 1;
 }
 else
 {
  l = 0;
  Recive_OK_Flag = 0; 
 }

 rdd[0] = rdataA[0];                          // For testing
 rdd[1] = rdataA[1];
 rdd[2] = rdataA[2];
 rdd[3] = rdataA[3];
 k++;

}

此程序功能没有实现,比如PC发出了"01 02 03 04”,而DSP却只接收了第一帧数据,即"01"。原本是希望FIFO接收中断一次就可以将这4帧数据全部接收,所以请大家帮忙看看,是哪里设置错误。谢谢!

  • 楼主比对ti例程包中的scia_loopback_interrupts例程,检查一下配置吧。

    例程包可以在controlsuite中找到:

    www.ti.com/.../controlsuite

  • 您好!

    首先PC每次发送数据为4帧,正常情况下,每收到一帧然后进入中断,您可以这样实现。

    个人感觉 SciaRegs.SCIFFRX.all这个寄存器的配置有问题,建议您对照着例程进行修改。无非就是设置一下FIFO深度为4然后触发中断。

    另外,在中断前面部分加入断点,看一下接收Buf中4个数据是不是都进来了。

    确认一下是不是在以下程序段中出问题。

    for(l=0;l<4;l++)

    {

     rdataA[l] = SciaRegs.SCIRXBUF.bit.RXDT;

    }

    提醒您的是,您需要一定的机制去判断4帧数据的次序,比如1、2、3、4,如果处理不好,会出现2、3、4、1。

  • 谢谢大家的帮忙,我找到原因了,在程序中中断标志设置错误。