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.

How to use DM3730 SPI transfer with DMA

Other Parts Discussed in Thread: DM3730, OMAP3530

Hi all:

we're using WinCE demo images(NK_demo.bin) of BSP_WINCE_ARM_A8_01_01_00_patch_01 on the DM3730 EVM board,

Open "SPI1:",

configuration is like this:

     DWORD dwConfig = MCSPI_PHA_ODD_EDGES |
      MCSPI_POL_ACTIVEHIGH |
      MCSPI_CHCONF_CLKD(6) |
      MCSPI_CSPOLARITY_ACTIVELOW |
      MCSPI_CHCONF_WL(32) |
      MCSPI_CHCONF_TRM_TXRX|
      MCSPI_CHCONF_DPE0 |
      (MCSPI_CHCONF_DMAR_ENABLE|MCSPI_CHCONF_DMAW_ENABLE);

Transfer data:

        dwSize = 16;
        pInBuffer = new BYTE[dwSize];
        pOutBuffer = new BYTE[dwSize];

        memset( pOutBuffer, 0xEC, dwSize );

        if( pInBuffer && pOutBuffer && m_hSPIDriver )
        {
            if( !DeviceIoControl( m_hSPIDriver,
                        IOCTL_SPI_WRITEREAD,
                        pInBuffer,
                        dwSize,
                        pOutBuffer,
                        dwSize,
                        NULL,
                        NULL ) )
            {
                MessageBox( _T("IOCTL_SPI_WRITEREAD failed") );
            }
        }
        else
        {
            MessageBox( _T("IOCTL_SPI_WRITEREAD failed") );
        }

Results:

because of DMA interrupt timeout, we got WinCE RETAILMSG:

--Rx->CCR      : 0x050840CC
CLNK_CTRL: 0x0000000A
CICR     : 0x00000020
CSR      : 0x00000000
CSDP     : 0x00000002
CEN      : 0x00000004
CFN      : 0x00000001
CSSA     : 0x0000003C
CDSA     : 0x8CA3A000
CSEI     : 0x00000000
CSFI     : 0x00000000
CDEI     : 0x00000000
CDFI     : 0x00000000
CSAC     : 0x61CB0998
CDAC     : 0x8CA3A000
CCEN     : 0x00DE097D
CCFN     : 0x000092AA
COLOR    : 0x00000000

Please advise how to use  DM3730 SPI transfer with DMA?

  • Using the same method, there's no such error on 3530 platform, with OS image build with BSP 6.15.00(bspsource_omapwince_06_15_00)

  • Is this on the EVM board? What device are you writing / reading from? Have you tried it without DMA to make sure it works

     

    thanks

    Atul

  • Hi Atul,

    On DM3730 EVM board, we can read/write _T("SPI1:") without DMA using the DEMO image.

    On our OMAP3530 custom board, we can read/write with/without DMA using the image build with BSP 6.15.00(bspsource_omapwince_06_15_00).

    Regards,

    Jack

  • Hi Atul,

    So far, I have found a bug in A80102 BSP,

    in PLATFORM\COMMON\SRC\SOC\COMMON_TI_V1\COMMON_TI\SPI\spi.c

    the value "pDevice->dwPort" is update from registry, where "MCSPI1" is 1,

    but in "PLATFORM\COMMON\SRC\SOC\COMMON_TI_V1\COMMON_TI\SPI\dma_init.c"

    DWORD   dwSyncMasksTX[MCSPI_MAX_PORTS][MCSPI_MAX_CHANNELS]=
    {
        SDMA_REQ_SPI1_TX0, SDMA_REQ_SPI1_TX1, SDMA_REQ_SPI1_TX2, SDMA_REQ_SPI1_TX3,
        SDMA_REQ_SPI2_TX0, SDMA_REQ_SPI2_TX1, 0,                 0,
        SDMA_REQ_SPI3_TX0, SDMA_REQ_SPI3_TX1, 0,                 0,
        SDMA_REQ_SPI4_TX0, 0,                 0,                 0,
    };

    DWORD   dwSyncMasksRX[MCSPI_MAX_PORTS][MCSPI_MAX_CHANNELS]=
    {
        SDMA_REQ_SPI1_RX0, SDMA_REQ_SPI1_RX1, SDMA_REQ_SPI1_RX2, SDMA_REQ_SPI1_RX3,
        SDMA_REQ_SPI2_RX0, SDMA_REQ_SPI2_RX1, 0,                 0,
        SDMA_REQ_SPI3_RX0, SDMA_REQ_SPI3_RX1, 0,                 0,
        SDMA_REQ_SPI4_RX0, 0,                 0,                 0,
    };

    dwSyncMask = dwSyncMasksRX[pInstance->pDevice->dwPort][pInstance->address];

    this will cause MCSPI1 use MCSPI2's DMA request line! however, even if I fix this bug, I still faild with DMA timeout error.

    Regards,

    jack

  • Thanks for pointing it out. We will investigate this further - what peripheral are you using for this experiment in EVM? Is it TSC?

     

    Atul

  • Hi,

    I found an issue with sDMA setup. Basically the RX source address is not configured properly. This is because  "MemBase" is not initialized .

    Please try the highlighted change in spi.c

    static const DEVICE_REGISTRY_PARAM g_deviceRegParams[] = {
       {
            L"MemBase", PARAM_MULTIDWORD, TRUE, offset(SPI_DEVICE, memBase),
            fieldsize(SPI_DEVICE, memBase), NULL
        }, {
            L"MemLen", PARAM_MULTIDWORD, TRUE, offset(SPI_DEVICE, memLen),
            fieldsize(SPI_DEVICE, memLen), NULL
        }, {

            L"Port", PARAM_DWORD, TRUE, offset(SPI_DEVICE, dwPort),
            fieldsize(SPI_DEVICE, dwPort), (VOID*)NULL
        }, {
            L"Timeout", PARAM_DWORD, FALSE, offset(SPI_DEVICE, timeout),
            fieldsize(SPI_DEVICE, timeout), (VOID*)500
        }, {
            L"TxBufferSize", PARAM_DWORD, FALSE, offset(SPI_DEVICE, dwTxBufferSize),
            fieldsize(SPI_DEVICE, dwTxBufferSize), (VOID*)0x4000
        }, {
            L"RxBufferSize", PARAM_DWORD, FALSE, offset(SPI_DEVICE, dwRxBufferSize),
            fieldsize(SPI_DEVICE, dwRxBufferSize), (VOID*)0x4000
        }, {
            L"DVFSAsyncEventName", PARAM_DWORD, FALSE, offset(SPI_DEVICE, szDVFSAsyncEventName),
            fieldsize(SPI_DEVICE, szDVFSAsyncEventName), (VOID*)NULL
        }, {
            L"ActivityTimeout", PARAM_DWORD, FALSE, offset(SPI_DEVICE, nActivityTimeout),
            fieldsize(SPI_DEVICE, nActivityTimeout), (VOID*)TIMERTHREAD_TIMEOUT
        }
    };

    Thanks,

    Tao