主题中讨论的其他器件: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
您能给我指导吗