AnsweredAssumed Answered

i.MX28 SPI Slave on Windows CE

Question asked by salvatorepenna on Feb 21, 2013
Latest reply on May 19, 2013 by salvatorepenna
Branched to a new discussion

HI,

I have some problem to let SPI  ( SSP2 )  to work in slave mode on i.MX28 board under Windows CE 6.0

I have an SPI device that send data at ~4 MHz, and I see the data and the clock on the correct Pin when the SS goes down.

 

 

I try to configure the SPI in slave mode and I try to  poll the FIFO_EMPTY bit of the SSP_STATUS register and then read the actual data from the SSP_DATA register.

 

 

Unfortunately I the FIFO_EMPTY is always set, so I can't read anything...

Here are the register configuration:

SSP: SSP_CTRL0        = 0x2b000000

SSP: SSP_CTRL1        = 0x9f1

SSP: SSP_TIMING       = 0xffff0800

SSP: SSP_XFER_SIZE    = 0x1

 

 

the status register contains always:

SSP: SSP_STATUS       = 0xe0000020  

 

 

This is the portion of code that I use for the SPITransfer:

 

  HW_SSP_CTRL0_CLR(m_Index,BM_SSP_CTRL0_SFTRST | BM_SSP_CTRL0_CLKGATE);

  HW_SSP_DATA_WR (m_Index, 0xFFFFFFFF);

 

  HW_SSP_CTRL1_SET(m_Index, BM_SSP_CTRL1_SLAVE_MODE);

  HW_SSP_CTRL1_SET(m_Index, BM_SSP_CTRL1_SLAVE_OUT_DISABLE);

  HW_SSP_CTRL0_SET(m_Index,BM_SSP_CTRL0_READ);

  HW_SSP_CTRL0_SET(m_Index,BM_SSP_CTRL0_DATA_XFER);

  HW_SSP_XFER_SIZE_WR(m_Index,1);

 

 

  HW_SSP_CTRL0_SET(m_Index,BM_SSP_CTRL0_RUN);

 

 

  count = 10000;

  while(( ( HW_SSP_CTRL0_RD(m_Index) & BM_SSP_CTRL0_RUN)  == 0 ) && count--)

  continue;

 

 

  if (count <= 0) {

  RETAILMSG (1, (L"SPI:>> Timeout on Line \r\n"));

  break;

  }

 

 

  count = 100000;

  while (count-- && ((HW_SSP_STATUS_RD(m_Index) & BM_SSP_STATUS_FIFO_EMPTY) != 0))

  continue;

 

 

  if (count <= 0) {

  RETAILMSG (1, (L"SPI:>> Timeout on RX FIFO \r\n"));

  break;

  }

 

 

  tmp = (UINT16)(HW_SSP_DATA_RD(m_Index) & 0xFFFF);

 

 

Any suggestions / help ?

 

Thanks in advance !!!

 

 

Outcomes