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_ENABLEspi_cfg.chNum = 0;spi_cfg.edmaHandle = drv_mcspi_EdmaInit();spi_cfg.dmaMode = TRUE;
#endifSPI_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_ENABLEspi_cfg.chNum = 0;spi_cfg.edmaHandle = drv_mcspi_EdmaInit();spi_cfg.dmaMode = TRUE;
#endifSPI_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));}}
}
Gary Lu:
在`master_Task`,你用的是`master_cbSem`进行信号量操作,但在`master_spi_init`,你创建用的是`cmaster_bSem`
,
Joy Zhang:
这个是贴代码的时候错误,测试过程中,我用示波器观察CS、CLK都是正常的,SPI2 的D1也能看到发送的4个字节数据,数据也是正确的
,
Joy Zhang:
今天发现SPI4没有默认映射到EDMA上,所以增加了SPI4的发送和接收映射到EDMA上,如下所示
CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 70, CSL_XBAR_INST_DMA_EDMA_DREQ_58);
CSL_xbarDmaConfigure(CSL_XBAR_DMA_CPU_ID_EDMA, 71, CSL_XBAR_INST_DMA_EDMA_DREQ_59);但是结果还是一样,然后我再将SPI4更改为主机,发现SPI4做主机时DMA模式下也是无法工作,非DMA模式可以正常读写。
,
Gary Lu:
您确认一下SPI4的主机模式下的DMA配置对不对
还有你需要检查一下中断和错误处理
,
Joy Zhang:
EDMA3_RM_Handle drv_mcspi_EdmaInit(uint32_t edma3Id) {EDMA3_DRV_Result edmaResult = EDMA3_DRV_E_INVALID_PARAM;EDMA3_RM_Handle gEdmaHandle = NULL;gEdmaHandle = (EDMA3_RM_Handle)edma3init(edma3Id, &edmaResult);if (edmaResult != EDMA3_DRV_SOK){M_TraceE("EDMA SPI Initialization FAIL");}return(gEdmaHandle); }EDMA初始化调用的都是这个函数,其中SPI2的edma3id = 0, SPI4的edma3Id = 1
,
Gary Lu:
你添加一些调试确认EDMA初始化是否成功,而且检查一下EDMA和SPI4的状态和配置,
,
Gary Lu:
确认一下SPI4的EDMA映射已经生效了没
,
Joy Zhang:
测试发现,更换到已有的映射通道上就能正常读写。 我原来映射到58/59, 我将映射更改为22/23(默认SPI3 Channel 1的发送和接收)或者其他已有通道就正常了
,
Gary Lu:
应该是硬件引脚连接问题
TI中文支持网

