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.

AM5708: SPI4 SLAVE 模式下,接收不到任何数据

Part Number: AM5708

AM5708,SPI2做master ,SPI4做Slave,SPI4一直接收,SPI2每隔1秒发送4个字节,SPI4无法接收到任何数据。

代码如下:创建2个线程,一个线程SPI2发送,另一个线程SPI4接收,采用DMA方式。

用示波器可以观察到发送的4个字节,CS、CLK也是正常的。

void master_spi_init(void)
{
    SPI_HWAttrs spi_cfg;
    MCSPI_Params mcspiParams;
    SemaphoreP_Params cbSemParams;

    SPI_socGetInitCfg(1, &spi_cfg);
    spi_cfg.enableIntr = false;
#ifdef SPI_DMA_ENABLE
    spi_cfg.chNum = 0;
    spi_cfg.edmaHandle = drv_mcspi_EdmaInit();
    spi_cfg.dmaMode = TRUE;
#endif
    SPI_socSetInitCfg(1, &spi_cfg);

    MCSPI_Params_init(&mcspiParams);
    mcspiParams.mode = pmcspi->spi_mode;
    mcspiParams.frameFormat = SPI_POL0_PHA1;
    mcspiParams.transferMode = SPI_MODE_CALLBACK;
    mcspiParams.bitRate = 10000000;
    mcspiParams.dataSize = 8;
    if(mcspiParams.transferMode == SPI_MODE_CALLBACK)
    {
        SPI_osalSemParamsInit(&cbSemParams);
        cbSemParams.mode = SemaphoreP_Mode_BINARY;
        master_cbSem = SPI_osalCreateBlockingLock(0, &cbSemParams);
    }
    mcspiParams.transferCallbackFxn = callback;
    master_handle = MCSPI_open(1, 0, &mcspiParams);
}

void master_Task(UArg a0, UArg a1)
{
    SPI_Transaction transaction;
    master_spi_init();
    while(1)
    {
        master_tx_buffer[0] = 0x00;
        master_tx_buffer[1] = 0x55;
        master_tx_buffer[2] = 0xAA;
        master_tx_buffer[3] = 0xFF;
        memset(master_rx_buffer, 0, sizeof(master_rx_buffer));
        transaction.txBuf = master_tx_buffer;
        transaction.rxBuf = master_rx_buffer;
        transaction.count = 4;
        CacheP_wb((void *)master_tx_buffer, transaction.count);
        MCSPI_transfer(master_handle, 0, &transaction);
        if(SPI_osalPendLock(master_cbSem, SPI_WAIT_FOREVER) == SemaphoreP_OK)
        {
            CacheP_Inv((void *)master_rx_buffer, sizeof(master_rx_buffer));
        }
        Task_sleep(1000);
    }
}

void slave_spi_init(void)
{
    SPI_HWAttrs spi_cfg;
    MCSPI_Params mcspiParams;
    SemaphoreP_Params cbSemParams;

    SPI_socGetInitCfg(3, &spi_cfg);
    spi_cfg.enableIntr = false;
#ifdef SPI_DMA_ENABLE
    spi_cfg.chNum = 0;
    spi_cfg.edmaHandle = drv_mcspi_EdmaInit();
    spi_cfg.dmaMode = TRUE;
#endif
    SPI_socSetInitCfg(3, &spi_cfg);

    MCSPI_Params_init(&mcspiParams);
    mcspiParams.mode = SPI_SLAVE;
    mcspiParams.frameFormat = SPI_POL0_PHA1;
    mcspiParams.transferMode = SPI_MODE_CALLBACK;
    mcspiParams.bitRate = 10000000;
    mcspiParams.dataSize = 8;
    if(mcspiParams.transferMode == SPI_MODE_CALLBACK)
    {
        SPI_osalSemParamsInit(&cbSemParams);
        cbSemParams.mode = SemaphoreP_Mode_BINARY;
        slave_cbSem = SPI_osalCreateBlockingLock(0, &cbSemParams);
    }
    mcspiParams.transferCallbackFxn = callback;
    slave_handle = MCSPI_open(3, 0, &mcspiParams);
}

void slave_Task(UArg a0, UArg a1)
{
    SPI_Transaction transaction;
    slave_spi_init();
    while(1)
    {
        transaction.txBuf = slave_tx_buffer;
        transaction.rxBuf = slave_rx_buffer;
        transaction.count = 4;
        CacheP_wb((void *)slave_tx_buffer, transaction.count);
        MCSPI_transfer(slave_handle, 0, &transaction);
        if(SPI_osalPendLock(slave_cbSem, SPI_WAIT_FOREVER) == SemaphoreP_OK)
        {
            CacheP_Inv((void *)slave_tx_buffer, sizeof(slave_tx_buffer));
        }
    }
}