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.

[参考译文] AM2634-Q1:SPI DMA 数据传输时间计算

Guru**** 1794070 points
Other Parts Discussed in Thread: AM2634
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1394485/am2634-q1-spi-dma-data-transfer-time-calculation

器件型号:AM2634-Q1
主题中讨论的其他器件:AM2634

工具与软件:

尊敬的团队:

我正在通过带回调的 DMA 模式下使用 AM2634的 SPI、当我发送11字节的数据时、它需要107us、当我增加数据大小100字节的传输时间将增加888usec、但根据我的理解、DMA 不应该花费太多的时间来传输数据。 这应该是 DMA 到数据传输的暗示  

这是我的代码

/*
* SPI_MATSER_SLAVE.c
*
创建日期: 2024年6月12日
*作者:斯瓦蒂
*/

#include
#include
#include "ti_drivers_config.h"
#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"
#include

#define APP_MCSPI_MSGSIZE (11U)
#define APP_MCSPI_TRANSFER_LOOPCOUNT (11U)

uint8_t gMcspiTxBuffer[APP_MCSPI_MSGSIZE]__attribute__((aligned (CacheP_CACHELINE_ALIGN)));
uint8_t gMcspiRxBuffer[APP_MCSPI_MSGSIZE]__attribute__(aligned (CacheP_CACHELINE_ALIGN));

Volatile bool transferComplete = false;

void spiTxCallback (MCSPI_Handle handle、MCSPI_Transaction *事务);
void spiRxCallback (MCSPI_Handle handle、MCSPI_Transaction *事务);

void spiTxCallback (MCSPI_Handle handle、MCSPI_Transaction *事务)

DebugP_LOG ("已调用传输回调。\r\n");
transferComplete = true;
}

void spiRxCallback (MCSPI_Handle handle、MCSPI_Transaction *事务)

DebugP_LOG ("已调用接收回调。\r\n");
transferComplete = true;
}

void * mcspi_transmit_receive_continuous (void * args)

uint32_t i、j;
MCSPI_Transaction spiTransaction;
uint32_t startTimeInUSecs、elapsedTimeInUsecs;

// Drivers_open();
Board_driversOpen();

DebugP_LOG ("[MCSPI]传输和接收示例已启动...\r\n");

/* Memfill buffers */
对于(I = 0U;I < APP_MCSPI_MSGSIZE;I++)

gMcspiTxBuffer[i]='a';
gMcspiRxBuffer[i]= 0U;
}

/*写回缓冲区*/
CacheP_WB (&gMcspiTxBuffer[0U]、sizeof (gMcspiTxBuffer)、CacheP_TYPE_ALLD);
CacheP_WB (&gMcspiRxBuffer[0U]、sizeof (gMcspiRxBuffer)、CacheP_TYPE_ALLD);

/*打印传输的数据*/
DebugP_LOG ("Transmitted data on SPI0:\r\n");
对于(I = 0U;I < APP_MCSPI_MSGSIZE;I++)

DebugP_LOG ("%c "、gMcspiTxBuffer[i]);
}
DebugP_log ("\r\n");

/*在 SPI0上启动传输(传输)*/
MCSPI_Transaction 初始化(&spiTransaction);
spiTransaction.channel = gConfigMcspi0ChCfg[0].chNum;//确保通道编号正确
spiTransaction.dataSize = 8;
spiTransaction .csDisable = true;
spiTransaction .count = APP_MCSPI_MSGSIZE;
spiTransaction .txBuf =(void *) gMcspiTxBuffer;
spiTransaction.rxBuf = NULL;
spiTransaction .args = NULL;
// spiTransaction。transferCallbackFxn = spiTxCallback;
// spiTransaction .dmaEnable = true;//为该事务启用 DMA

startTimeInUSecs = ClockP_getTimeUsec ();
对于(j = 0U;j < APP_MCSPI_TRANSFER_LOOPCOUNT;j++)

transferComplete = false;
if (MCSPI_transfer (gMcspiHandle[CONFIG_MCSPI0]、&spiTransaction)!= SystemP_SUCCESS){
DebugP_ASSERT (false);/* MCSPI 传输失败!! */
}
while (!transferComplete);//等待传输完成
}
elapsedTimeInUsecs = ClockP_getTimeUsec()- startTimeInUsecs;

debugP_log (------------------------------------------------------- \r\n");
DebugP_LOG ("McSPI 时钟%d Hz\r\n"、gConfigMcspi0ChCfg[0U].bitrate);//验证比特率设置是否正确
debugP_log (------------------------------------------------------- \r\n");
DebugP_LOG ("数据宽度\tData 长度\tTransfer Time (micro sec)\r\n");
DebugP_log ("%u\t\t\t%u\t\t\t%5.2f\r\n"、spiTransaction。dataSize、APP_MCSPI_MSGSIZE、
(Float32)(elapsedTimeInUsecs /(uint32_t) APP_MCSPI_TRANSFER_LOOPCOUNT));
debugP_log (------------------------------------------------------- \r\n");

/*在 SPI1上启动接收*/
MCSPI_Transaction 初始化(&spiTransaction);
spiTransaction.channel = gConfigMcspi1ChCfg[0].chNum;
spiTransaction .dataSize = 8;//根据您的要求调整数据大小
spiTransaction .csDisable = false;
spiTransaction .count = APP_MCSPI_MSGSIZE;
spiTransaction.txBuf = NULL;//将 txBuf 设置为 NULL 以进行接收
spiTransaction .rxBuf =(void *) gMcspiRxBuffer;//指定接收缓冲区
spiTransaction .args = NULL;
// spiTransaction。transferCallbackFxn = spiRxCallback;
// spiTransaction .dmaEnable = true;//为该事务启用 DMA

transferComplete = false;
if (MCSPI_transfer (gMcspiHandle[CONFIG_MCSPI1]、&spiTransaction)!= SystemP_SUCCESS){
DebugP_LOG ("SPI1传输失败\r\n");
其他{
while (!transferComplete);//等待传输完成

/*使高速缓存无效*/
CacheP_inv (&gMcspiRxBuffer[0U]、sizeof (gMcspiRxBuffer)、CacheP_TYPE_ALLD);

DebugP_LOG ("SPI1:\r\n"上接收到的数据);
对于(j = 0U;j < APP_MCSPI_MSGSIZE;j++)

DebugP_LOG ("%c "、gMcspiRxBuffer[j]);
}
DebugP_log ("\r\n");
}

Board_driversClose ();
// Drivers_close();

返回 NULL;
}

这是我的 SPI 配置 SPI0和 SPI1、适用于使用1MHz 频率的 SPI


您能给我指导吗