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帧数据全部接收,所以请大家帮忙看看,是哪里设置错误。谢谢!