Part Number: TMS320F28P550SJ
Other Parts Discussed in Thread: C2000WARE, TMDSFSIADAPEVM, TMS320F280049C
Tool/software:
Issue:
I am working on the FSI peripheral examples shipped in this folder: C2000Ware_5_02_00_00\driverlib\f28p55x\examples\fsi.
I am trying the example: fsi_ex1_loopback_cpucontrol in external loopback mode with the TMSF28P550SJ Launchpad board and the FSI adapter TMDSFSIADAPEVM on top of it.
Internal loopback works fine with the 75MHz FSI clock speed set as follows in the fsi_ex1_loopback_cpucontrol.c file:
#define PRESCALER_VAL FSI_PRESCALE_75MHZ
When switched to external loopback mode by changing EXTERNAL_FSI_ENABLE from 0 to 1, the example fails.
The FSI_INT2 interrupt stops the program in debug mode at ESTOP in the following interrupt code:
// fsiRxInt2ISR - FSI Rx Interrupt on INT2 line
//
__interrupt void fsiRxInt2ISR(void)
{
rxEventSts = FSI_getRxEventStatus(FSIRXA_BASE);
fsiRxInt2Received = fsiRxInt2Received + 1U;
//
// Clear the interrupt flag and issue ACK
//
FSI_clearRxEvents(FSIRXA_BASE,rxEventSts);
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP7);
disableAllFSIInterrupts();
//
// INT2 line is set to fire for error events, stop immediately. Error
// is captured in rxEventSts for debug
//
ESTOP0;
}
However, when I change the FSI clock speed from 75MHz to any of the remaining clock speeds present in the device.h file, as shown in the code below,
#define FSI_PRESCALE_75MHZ 1U #define FSI_PRESCALE_37_5MHZ 2U #define FSI_PRESCALE_15MHZ 5U #define FSI_PRESCALE_7_5MHZ 10U
the external loopback mode works just fine.
What I have checked with the issue so far:
I have checked the hardware connections, and it is correct as it works for other clock speeds. I have checked the GPIO mux configurations, and they are correct as well.
I debugged the issue with CCS Debug mode as follows:
When working with 75MHz, the ping from the FSI TX module does not seem to reach the FSI RX module, and the PING Watchdog times out even before starting the data transmission. This happens at the following line in the fsi_ex1_loopback_cpucontrol.c file:
// // Now enable PING WD timer in both FSI Tx/Rx sides // Keeping reference counter for Rx little wide to ensure its not too sharp // to generate a WD timeout // FSI_enableTxPingTimer(FSITXA_BASE, txPingTimeRefCntr, txPingFrameTag); FSI_enableRxPingWatchdog(FSIRXA_BASE, rxWdTimeoutRefCntr);
After the FSI_enableTxPingTimer API call, the RX_EVT_STS register must have the value : 0x0240, i.e., PING_FRAME and FRAME_DONE must have the value 1. This means that the automatic ping transmission is setup and ping frames have reached the FSI RX block. However, at 75MHz, the register value remains at 0x0000, so when the next line in the above code runs and enable the FSI RX Ping Watchdog, it times out as no ping has been received and thereby the FSI INT2 interrupt stops the program.
Questions:
How to get around this issue?
Should I configure the skew compensation block in FSI RX module as there is a possibility that at such high speed (75MHz), even in external loopback mode with small channel-to-channel length using CAT5 cable, the FSI RX module is unable to properly latch the data with the received clock? If yes, please provide some high-level steps to do this, as FSI skew compensation examples are only available for TMS320F28004x boards.
Or is there something else that can be done?
I am also encountering the same issue with TMS320F280049C_MCU_025B Launchpad board at 50MHz FSI clock in external loopback with the FSI adapter board.


