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