Other Parts Discussed in Thread: C2000WARE, SFRA
Dear Team,
We have our custom board using TMS320F28384D, We are receiving data from an external HMI through SCIA_BASE using FIFO RX ISR.
If the frame match it is working properly. otherwise if frame mismatch program get struck and we restart the board.
for example
WORKING properly:
This is our Frame In an array of 0 to 16
001 002 015 000 000 000 000 000 000 000 000 000 000 000 000 000 018
002 002 015 000 000 000 000 000 000 000 000 000 000 000 000 000 018
Not Working(Program stuck)
000 000 00 000 000 000 000 000 000 000 000 000 000 000 000 000 000
000
FF
123
Please find below snippier code..
void initSCIAFIFO()
{
Interrupt_register(INT_SCIA_RX, sciaRXFIFOISR);
SCI_setConfig(SCIA_BASE, DEVICE_LSPCLK_FREQ,115200, (SCI_CONFIG_WLEN_8 |
SCI_CONFIG_STOP_ONE |
SCI_CONFIG_PAR_NONE));
SCI_enableModule(SCIA_BASE);
SCI_resetChannels(SCIA_BASE);
SCI_enableFIFO(SCIA_BASE);
Interrupt_enable(INT_SCIA_RX);
SCI_enableInterrupt(SCIA_BASE, SCI_INT_RXFF );
SCI_disableInterrupt(SCIA_BASE, SCI_INT_RXERR);
SCI_setFIFOInterruptLevel(SCIA_BASE, SCI_FIFO_TX1, SCI_FIFO_RX1);
SCI_performSoftwareReset(SCIA_BASE);
SCI_resetRxFIFO(SCIA_BASE);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}
//
// sciaRXFIFOISR - SCIA Receive FIFO ISR
//
__interrupt void sciaRXFIFOISR(void)
{
postTransmission1();
Recipe==6 ?SCI_readCharArray(SCIA_BASE,( uint16_t *) (Display_RX_Buf),86): SCI_readCharArray(SCIA_BASE,( uint16_t *) (Display_RX_Buf),16);
Recipe =Display_RX_Buf[1];
if((Display_RX_Buf[0]==Spid[1] && Spid[1]!=0)||(Display_RX_Buf[0]==Spid[2] && Spid[2]!=0)||(Display_RX_Buf[0]==Spid[3] && Spid[3]!=0)||(Display_RX_Buf[0]==Spid[4] && Spid[4]!=0))
{
Check_Setting();
}
SCI_resetRxFIFO(SCIA_BASE); //clear RxFIFO
SCI_resetTxFIFO(SCIA_BASE); //clear TxFIFO
SCI_clearOverflowStatus(SCIA_BASE); // Clear overflowstatus
SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXFF|SCI_INT_RXERR); // Clear Interrupt RX status
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9); // Clear interrupt
}
For mismatch frame we implemented below code to clear interrupt and base and Receiver buffer variable(Display_RX_Buf[1])..i.e if function code in Display_RX_Buf mismatch we clear interrupt.
but still the program gets struck. kindly guide us for this problem.. thanks in advance for your guidance..
if((Display_RX_Buf[1]==0 && Display_RX_Buf[0]==0)||( Display_RX_Buf[0]>=20 && Display_RX_Buf[1]>=20) )
{
SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_RXFF|SCI_INT_RXERR); // Clear Interrupt RX status
SCI_resetRxFIFO(SCIA_BASE);
Reset_Display_TX_Buf();
SCI_resetTxFIFO(SCIA_BASE);
SCI_clearOverflowStatus(SCIA_BASE); // Clear overflowstatus
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
Reset_Display_RX_Buf();
}
Rgds
Sunil Raj






