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.

[参考译文] CCS/TCI6638K2K:在多个内核上同时使用 EDMA3

Guru**** 2606725 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/652737/ccs-tci6638k2k-edma3-using-simultaneously-at-multiple-cores

器件型号:TCI6638K2K

工具/软件:Code Composer Studio

您好!

我的应用是 SPI 至 EDMA、  

•通过 EDMA3进行 SPI 数据传输(写入)。 EDMA 实例4,阴影区域0。
•EDMA Event trigger by GPIO 23 pin event trigger,GPIO_INT23 事件 num 为7,因此 DMA Channel Num 7。
•SPI 功能 GPIO 引脚、

 CS       28.
 CLK     29.
 MOSI   30.
 MISO   31.

•事件队列 num 为0、因此传输控制(TC)= 0。
•参数 RAM num 为2。
•在选项,ENBLE - TCINT (传输兼容代码中断),AB 同步,静态。
•EDMA 源- TxData 缓冲器(SPI 输出数据)
   目的_ GPIO_OUT_DATA 寄存器。
•EDMA TPCC_IPR 中断调用 ISR 函数。

•将 EDMA 传输完成代码中断的中断映射到主机中断 、并 在中断上升时调用 ISR (回调)函数。

•EDMA 通道完成中断的二次事件作为输入进入 CIC0模块、EMDMACC_4_TC_0_INT=212。

EDMA 初始化函数:-

ui32HostIntr = 9;

/*特定于器件的 API,用于打开 CPINTC 实例并返回所有后续调用中使用的句柄*/
hCpintcHandle = CSL_CPINTC_open (CSL_CIC);

/*禁用所有主机中断。*/
CSL_CPINTC_DisableAllHostInterrupt (hCpintcHandle);

/*在 CPINTC 模块中配置无嵌套支持*/
CSL_CPINTC_setNestingMode (hCpintcHandle、CPINTC_NO_Nesting);

/*清除 GPINT23系统中断编号7 */
CSL_CPINTC_clearSysInterrupt (hCpintcHandle、GPIO_INT23);

/*将系统中断映射到通道*/
CSL_CPINTC_mapSystemIntraToChannel (hCpintcHandle、GPIO_INT23、channel);
CSL_CPINTC_mapChannelToHostInterrupt (hCpintcHandle、channel、ui32HostIntr);
CSL_CPINTC_enableHostInterrupt (hCpintcHandle、ui32HostIntr);

/*在 CIC2上启用 GPINT23系统中断编号7 *
CSL_CPINTC_enableSysInterrupt (hCpintcHandle、GPIO_INT23);
/*启用主机中断*/
CSL_CPINTC_enableHostInterrupt (hCpintcHandle、ui32HostIntr);

CSL_CPINTC_enableAllHostInterrupt (hCpintcHandle);


/*模块初始化*/
if (CSL_edma3Init (&hContext)!= CSL_Sok)

System_printf ("错误:EDMA 模块初始化失败\n");
退出(1);

/*模块级别打开*/
hEdma_SPI = CSL_edma3Open (&stEdmaObj、CSL_EMDMACC_4、NULL、EStatus);
if ((hEdma_SPI == NULL)||(EStatus!= CSL_Sok))

System_printf ("错误:EDMA 模块打开失败\n");
退出(1);

/*启用在 DRAE/DRAEH 中传递的参数中指定的位。 *
stDraeAttr.region = CSL_EDMA3_REGION;
stDraeAttr.drae = 1 <<通道;
stDraeAttr.draeh = 0x00;
CSL_edma3 HwControl (hEdma_SPI、CSL_EDMA3_CMD_DMAREGION_ENABLE、&stDraeAttr);

/*信道打开*/
stChAttr.regionNum = CSL_EDMA3_REGION;
stChAttr.chaNum =通道;
EStatus = 0;
hChannel = CSL_edma3ChannelOpen (&stChObj、CSL_EMDMACC_4、&stChAttr、&EStatus);
if ((hChannel =NULL)||(EStatus!=CSL_SOK)){
System_printf ("错误:无法打开 EDMA 通道:%d\n"、通道);
退出(1);

/*设置 EDMA 事件队列0 */
EStatus = CSL_edma3 HwChannelSetupQue (hChannel、CSL_EDMA3_Q_0);

/*为此通道设置的参数*/
EStatus = CSL_edma3HwChannelSetupParam (hChannel、Param_NUM);
/*获取参数集的句柄*/
hParam = CSL_edma3GetParamHandle (hChannel、param_NUM、&E);
if ((hParam =NULL)||(EStatus!=CSL_Sok))

System_printf ("Error: EDMA get parameter entry failed for 2.\n").
退出(1);

    我能够通过一个内核上的 EDMA 代码使用 SPI 进行 SPI 读取和写入。 但 EDMA 不能在多个内核上同时工作、这意味着通过 EDMA 的 SPI 无法在多个内核上同时读取和写入。

•SPI 读取和写入成功,当 SPI 通过 EDMA 代码在 core0和 core2上进行测试时,具有相同的 EDMA 初始化函数(相同的通道),

•在 具有相同 EDMA 初始化功能(相同通道)的 core0和 core2上、通过 EDMA 代码的 SPI 无法同时工作。 当我同时在 core0和 core2处测试 SPI 至 EDMA 代码时、

在 core0.- SPI 读取和写入 成功 、并且 EDMA TPCC_IPR 中断调用 ISR funion。

但 SPI 读取和写入失败、并且 EdmaTPCC_IPR 中断未调用 ISR 函数。

我有一些疑问

-在多个内核中,是否可以在 同一通道中使用相同的 EDMA 初始化函数和 EDMA 初始化函数?

-如何同时在多个内核上通过 EDMA API 使用 SPI?

我们需要 在多个内核上同时通过 EDMA API 实现 SPI。 请指导我。

此致、

Bhavani。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已通知 RTOS 团队。 他们将直接在此处发布反馈。

    在平均时间请求共享中、您使用的是哪个 SDK 版本。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SPI 和 EDMA3都是全局资源-这意味着它们不在任何芯片处理器的范围内。  我建议使用主/从配置、其中单个内核初始化 SPI 和 EDMA3。 EDMA3的初始化会分配中断、然后可以启用各个从内核来接收所需的传输完成中断。  当然、中断不应由多个内核处理。

    另一种可能是让主内核处理所有 SPI 接收事件、然后让主内核检查数据并使用某种类型的 IPC 事件(例如导航器推送/弹出)将事件解压到其他内核。

    Dave