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.

DM6437 - SPI slave mode problem

I am programming on using SPI function, the master device is DM368 chip and slave is DM6437.
I configured the SPI word length as 8bit and set CLKGDV = 1.

The master device sends the bytes from 0x01 to 0x03 by a for loop.
The received result of DM6437(slave) is correct if master's data rate 1 Mbit / Sec.

The DM6437 on the input data is strange. A byte of data is coming, but The DM368 has three bytes(0x01, 0x02, 0x3) of data output.
In addition, the data are coming in different values​​.

 

My SPI initial function :

void DM6437_SPI_Slave_Init( )
{
     Uint32 j, tmp, spcr, srgr, mcr, xcr, rcr, pcr;

     spcr = 0x00000000u;  //mcbsp0ModuleRegs->SPCR = 0x00000000u;
     mcr  = 0x00000000u;  //mcbsp0ModuleRegs->MCR  = 0x00000000u;
     xcr  = 0x00000000u;
     rcr  = 0x00000000u;
     srgr = 0x00000000u;
     pcr  = 0x00000000u;

     pcr = pcr   | (CSL_MCBSP_PCR_CLKXM_MASK)
            | (CSL_MCBSP_PCR_CLKXP_FALLING << CSL_MCBSP_PCR_CLKXP_SHIFT)
            | (CSL_MCBSP_PCR_CLKRP_FALLING << CSL_MCBSP_PCR_CLKRP_SHIFT)
            | (CSL_MCBSP_PCR_FSXP_MASK)
            | (CSL_MCBSP_PCR_FSRP_MASK);

     rcr = rcr   | (0u << CSL_MCBSP_RCR_RDATDLY_SHIFT)
           | (0u << CSL_MCBSP_RCR_RFRLEN1_SHIFT)
           | (CSL_MCBSP_RCR_RCOMPAND_8BITLSB << CSL_MCBSP_RCR_RCOMPAND_SHIFT)
           | (CSL_MCBSP_RCR_RWDLEN1_8BIT << CSL_MCBSP_RCR_RWDLEN1_SHIFT);

     xcr = xcr   | (0u << CSL_MCBSP_XCR_XDATDLY_SHIFT)
           | (0u << CSL_MCBSP_XCR_XFRLEN1_SHIFT)
           | (CSL_MCBSP_XCR_XCOMPAND_8BITLSB << CSL_MCBSP_XCR_XCOMPAND_SHIFT)
           | (CSL_MCBSP_XCR_XWDLEN1_8BIT << CSL_MCBSP_XCR_XWDLEN1_SHIFT);

     srgr = srgr | (CSL_MCBSP_SRGR_GSYNC_FREE << CSL_MCBSP_SRGR_GSYNC_SHIFT)
           | (CSL_MCBSP_SRGR_CLKSP_FALLING << CSL_MCBSP_SRGR_CLKSP_SHIFT)
           | (CSL_MCBSP_SRGR_CLKSM_INTERNAL << CSL_MCBSP_SRGR_CLKSM_SHIFT)
           | (0x01u << CSL_MCBSP_SRGR_CLKGDV_SHIFT);

     spcr = (spcr & (~CSL_MCBSP_SPCR_CLKSTP_MASK)
            & (~CSL_MCBSP_SPCR_XRST_MASK)
            & (~CSL_MCBSP_SPCR_RRST_MASK));

     MCBSP0_MCR = mcr;
     MCBSP0_PCR = pcr;
     MCBSP0_XCR = xcr;
     MCBSP0_RCR = rcr;
     MCBSP0_SRGR = srgr;
     MCBSP0_SPCR = spcr;

     //setup pin muxing in order to view signals on pins
     tmp = sysModuleRegs->PINMUX1 & (~CSL_SYS_PINMUX1_SPBK0_MASK);
     tmp |= (1u << CSL_SYS_PINMUX1_SPBK0_SHIFT);
     SYS_PINMUX1 = tmp;

     //Wait two CLKSRG clocks. This is to ensure proper synchronization internally.
     asm("\tnop 5");

     MCBSP0_SPCR = (MCBSP0_SPCR & (~CSL_MCBSP_SPCR_CLKSTP_MASK))
             | (CSL_MCBSP_SPCR_CLKSTP_NODELAY << CSL_MCBSP_SPCR_CLKSTP_SHIFT);

     MCBSP0_SPCR |= CSL_MCBSP_SPCR_FREE_MASK;
     for(j=0;j<20;++j) { }
     MCBSP0_SPCR |= CSL_MCBSP_SPCR_GRST_MASK;
     for(j=0;j<20;++j) { }
     MCBSP0_SPCR |= CSL_MCBSP_SPCR_FRST_MASK;
     for(j=0;j<20;++j) { }
     MCBSP0_SPCR |= CSL_MCBSP_SPCR_RRST_MASK;
     for(j=0;j<20;++j){ }
     MCBSP0_SPCR |= CSL_MCBSP_SPCR_XRST_MASK;
     for(j=0;j<20;++j){ }
     asm("\tnop 5");
}

unsigned long SPIReceive()
{
     int i;
     unsigned long Recv;

     for (i=0; i<3; i++)
     {
          // poll receiver is ready
          while(CSL_FEXT(mcbsp0ModuleRegs->SPCR, MCBSP_SPCR_RRDY)
                                   != CSL_MCBSP_SPCR_RRDY_YES);

          // read receive register
          Recv = mcbsp0ModuleRegs->DRR;
          LOG_printf(&trace, "receive data = 0x%08x ", Recv);
     }
     return (Recv);
}

 

The Connection of the hardware was done as follows.

  DM365                                    DM6437
 SPI_MISO ------------- AXR0[1]/DX0/GP[104]
 SPI_SIMO ------------- AFSR0/DR0/GP[100]
 SPI_SCLK ------------ ACLKR0/CLKX0/GP[99]
 SPI_CS0  ------------- AXR0[2]/FSX0/GP[103]

The following figure the value of output from dm368 output on an oscilloscope, and that will be captured.


      Yellow - SPI_MISO
      Green  - SPI_SIMO
      Blue     - SPI_SCLK
      Red      - SPI_CS0