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.

F2812 McBSP as an SPI Slave issue

Hi Sir,

I used F2812 McBSP as an SPI Slave. F2812 receive data from ADC device  per 3600/sec. When F2812 receive 3600 times , F2812 will  transmit 1 command data to ADC device. sometime the F2812 can't detect McbspaRegs.SPCR2.bit.XRDY = 1

TX : polling

RX: interrupt

 

initial setting:

void InitMcBSP(void)
{    //int    i;

//*************** RESET MCBSP
   McbspaRegs.SPCR2.bit.FRST=0; // Frame Sync generator reset
   McbspaRegs.SPCR2.bit.GRST=0; // Sample Rate generator Reset
   McbspaRegs.SPCR2.bit.XRST=0; // Transmitter reset
   McbspaRegs.SPCR1.bit.RRST=0; // Receiver reset

//*************** Initialise McBSP Registers
   // McBSP register settings for Digital loop back
   McbspaRegs.SPCR2.all=0x0000; // XRST =0, XINTM=00b, GRST=0, FRST=0
   McbspaRegs.SPCR1.all=0x0000; // RRST =0, RINTM=00b, CLKSTOP =00b; DLB disabled
   McbspaRegs.RCR2.all=0x0005;    // Single phase; receive frame length2, word length=>don't care; 1-bit delay
   McbspaRegs.RCR1.all=0x0040;    // Receive frame length1:1 word, receive word length:16bits
   McbspaRegs.XCR2.all=0x0005;    // Single phase; transmit frame length2, word length=>don't care; 1-bit delay
   McbspaRegs.XCR1.all=0x0040;    // Transmit frame length1:1 word, Transmit word length:16bits
   
   McbspaRegs.SRGR2.all=0x2000;
   McbspaRegs.SRGR1.all=0x0001; 
   McbspaRegs.MCR2.all=0x0000;
   McbspaRegs.MCR1.all=0x0000;
   McbspaRegs.PCR.all=0x0800;  
 
   McbspaRegs.MFFTX.all=0x4021;
   McbspaRegs.MFFRX.all=0x002d;
   McbspaRegs.MFFCT.all=0x0000;
   McbspaRegs.MFFINT.all=0x0000;
   McbspaRegs.MFFST.all=0x000;

//************** Enable FIFO
   McbspaRegs.MFFTX.bit.TXFIFO_RESET=1;
   McbspaRegs.MFFRX.bit.RXFIFO_RESET=1;
  
//************* Enable Sample rate generator
   McbspaRegs.SPCR2.bit.GRST=1;
   delay_loop(); 
   
//************ Enable TX/RX INT in nonFIFO mode
  // McbspaRegs.MFFINT.bit.XINT=1;
   //McbspaRegs.MFFINT.bit.RINT=1;

//************ Enable TX/RX unit
   McbspaRegs.SPCR2.bit.XRST=1;     
   McbspaRegs.SPCR1.bit.RRST=1;
  
}
//=============================================

McBSP write program

void McBSP_write16(unsigned int mcbspdata)
{    int    i;

    for (i=0; i<5; i++)
    {    McbspaRegs.DXR1.all= mcbspdata;      
          while (McbspaRegs.SPCR2.bit.XRDY != 1);   ---> F2812 sometime will HALT here
          asm("    nop");    
          asm("    nop");    
          asm("    nop");    
    }

}

======================================================

when F2812 HALT CCS watch window