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.

28027f launchpad sci fifo 中断

Other Parts Discussed in Thread: CONTROLSUITE

不是道是不是配置有无,发送端给过来的数据无法触发fifo接收中断,发送已验证ok,但是接收一直有问题,以下为部分代码:

void scia_fifo_init()
{

SciaRegs.SCICCR.all=0x0007;

SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
SciaRegs.SCIFFTX.all=0xC021;
SciaRegs.SCIFFRX.all=0xC022;
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCICTL1.all=0x0023;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
SciaRegs.SCIFFRX.bit.RXFFIENA=1;

}

void scia_loopback_init()
{
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
int16 BAUDRATE=SCI_PRD;

SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all =0x0003;

SciaRegs.SCIHBAUD =BAUDRATE>>8;
SciaRegs.SCILBAUD =BAUDRATE;
SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset

}

interrupt void sciaRxFifoIsr(void)
{

Uint16 i;
for(i=Scia_Rx_Cnt;i<(2+Scia_Rx_Cnt);i++)
{
if(i!=Scia_RxBL)
Scia_RxBUF[i]=SciaRegs.SCIRXBUF.all; // Read data
}
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag

PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
Scia_Rx_Cnt+=2;
if(Scia_Rx_Cnt>=Scia_RxBL)
{
COM1Rx_CheckSum();
}

}

void COM1Rx_CheckSum(void)
{
int i;
unsigned char checksum;
for(i=0;i<Scia_RxBL-1;i++)
{
checksum+=Scia_RxBUF[i];
}
if(checksum==Scia_RxBUF[Scia_RxBL-1])
{
Scia_Rece_Complete=1;
Scia_Dataprocess();
}
else
{
Scia_Rece_Complete=0;
}
Scia_Rx_Cnt=0;
}

void Scia_Dataprocess(void)
{
Scia_Requestrpm=Scia_RxBUF[6];
Scia_Actualrpm=Scia_Requestrpm*30;
}

  • 检查一下GPIO引脚配置,另外确定PIE级别有使能接收中断。

    另外参考controlSUITE例程进行排查:C:\ti\controlSUITE\device_support\f2802x\v230\f2802x_examples_structs\scia_loopback_interrupts

    Eric

  • gpio引脚配置应该没啥问题,而且我的发送数据已经被成功接收,以下是我的main函数代码,不知道pie级的中断设置是否正确


    InitGpio();
    UART_Simulation_GPIO_Init();

    InitSysCtrl();

    InitSciGpio();

    // Disable and clear all CPU interrupts:
    DINT;

    InitPieCtrl();

    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

    EALLOW; // This is needed to write to EALLOW protected registers
    PieVectTable.SCIRXINTA = &sciaRxFifoIsr;
    PieVectTable.SCITXINTA = &sciaTxFifoIsr;
    EDIS; // This is needed to disable write to EALLOW protected registers
    //
    InitCpuTimers(); // For this example, only initialize the Cpu Timers

    EnableInterrupts();

    scia_fifo_init(); // Initialize the SCI FIFO
    scia_loopback_init(); // Initalize SCI for digital loop back

    CPUTimer_Userset(&CpuTimer0,10,100);
    EALLOW; // This is needed to write to EALLOW protected registers
    PieVectTable.TINT0 = &cpu_timer0_isr;
    PieVectTable.TINT1 = &cpu_timer1_isr;
    PieVectTable.TINT2 = &cpu_timer2_isr;
    EDIS; // This is needed to disable write to EALLOW protected registers

    PieCtrlRegs.PIEIER1.bit.INTx7=1;
    // Enable interrupts required for this example
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
    PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, INT1
    PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE Group 9, INT2
    IER = 0x100; // Enable CPU INT
    // EINT;



    IER |= M_INT1;
    IER |= M_INT13;
    IER |= M_INT14;

    EINT; // Enable Global interrupt INTM
    ERTM; // Enable Global realtime interrupt DBGM


    CpuTimer0Regs.PRD.all = mSec1;
    CpuTimer1Regs.PRD.all = mSec5;
    CpuTimer2Regs.PRD.all = mSec1000;

    Scia_Rx_Init();
    for(;;)
    {

    if(Scia_Txwait>=500)
    {
    Scia_Txwait=0;
    scia_xmit_sendchar();

    GPIO_UART1_SendChar();
    }
    }

  • PIE级别有使能接收中断应该怎样设置?

  • PIE中断我看到你已经打开了,你有试一下controlSUITE中的例程吗?另外注意就是进中断有FIFO的级别的,你设置是SciaRegs.SCIFFRX.all=0x0022,就表示只有接收超过2个数据,才会进中断。

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
    PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, INT1
    PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE Group 9, INT2
    IER = 0x100; // Enable CPU INT

  • 接收的数据是12字节,每次开中断我处理两个字节,12个字节处理完计算checksum,就是不知道问题出在哪里

    interrupt void sciaRxFifoIsr(void)
    {

    Uint16 i;
    for(i=Scia_Rx_Cnt;i<(2+Scia_Rx_Cnt);i++)
    {
    if(i!=Scia_RxBL)
    Scia_RxBUF[i]=SciaRegs.SCIRXBUF.all; // Read data
    }
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag

    PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
    Scia_Rx_Cnt+=2;
    if(Scia_Rx_Cnt>=Scia_RxBL)
    {
    COM1Rx_CheckSum();
    }

  • 我看不出代码有什么问题。

    你用串口助手调试一下,往它发数据,然后再中断那儿设断点,观察串口中断标志位和PIE中断标志位的变化。

    Eric