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)); } } }