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.

[参考译文] AM6442:使用 BCDMA 向 SPI TX 传输单字节

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1252605/am6442-single-byte-transfer-to-spi-tx-using-bcdma

器件型号:AM6442

您好、TI!

我试图使用 BCDMA 向 SPI 发送单字节数据,但收到传输失败错误。 创建了指向 MCSPI1_CH0_TX 的 TR 15描述符作为 TRD 的目标地址。

ptr->daddr  = 0x20110138U;  

我尝试的序列如下所示:

1) TR 初始化:

静态 void App_udmaTrpdInit (UDMA_ChHandle chHandle、
uint32_t chIdx、
uint8_t * trpdMem、
const void *destBuf、
const void * srcBuf、
uint32_t 长度)
{
CSL_UdmapTR15 *ptr;
uint32_t cqRingNum = uDMA_chGetCqRingNum (chHandle);

/*使 TRPD 具有 TR15 TR 类型*/
UdmaUtils_makeTrpdTr15 (trpdMem、1U、cqRingNum);

/*设置 TR */
PTR = UdmaUtils_getTrpdTr15Pointer (trpdMem、0U);
ptr->flags = CSL_FMK (UDMAP_TR_FLAGS_TYPE、CSL_UDMAP_TR_FLAGS_TYPE_4D_BLOCK_MOVE_repacking_INDIRECTION);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_STATIC、0U);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_EOL、CSL_UDMAP_TR_FLAGS_EOL_MATCH_SOL_EOL);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_EVENT_SIZE、CSL_UDMAP_TR_FLAGS_EVENT_SIZE);
if (0u == chIdx)
{
ptr->flags |= CSL_FMK (UDMAP_TR_FLAGS_TRIGGER0、CSL_UDMAP_TR_FLAGS_TRIGGERONE);

否则
{
/*为通道1设置全局触发*/
ptr->flags |= CSL_FMK (UDMAP_TR_FLAGS_TRIGGER0、CSL_UDMAP_TR_FLAGS_TRIGGER0);

ptr->flags |= CSL_FMK (UDMAP_TR_FLAGS_TRIGGER0_TYPE、CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_trigger1、CSL_UDMAP_TR_FLAGS_TRIGGER_NONE);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_trigger1_TYPE、CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_CMD_ID、0x25U);/*这将在 TR 响应中返回*/
ptr->flags |= CSL_FMK (UDMAP_TR_FLAGS_SA_INDIRECT、0U);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_DA_INDIRECT、0U);
ptr->flags |= CSL_FMK (uDMAP_TR_FLAGS_EOP、1U);
ptr->icnt0 = 1U;//acNT
ptr->icnt1 = 1U;// BCNT
ptr->icnt2 = 1U;// CCNT
// ptr->icnt3 = 1U;
ptr->DIM1=1U;//SBIDX 应为4
// ptr->dim2 =(ptr->icnt0 * ptr->icnt1);//SCINDX
// ptr->dim3 =(ptr->icnt0 * ptr->icnt1 * ptr->icnt2);
ptr->addr =(uint64_t) udma_defaultVirtToPhyFxn (srcBuf、0U、NULL);//源地址
ptr->fmtflags = 0x00000000U;/*线性寻址,每个字节*/
ptr->dicnt0 = 1U;// ACNT
ptr->dicnt1 = 1U;// BCNT
ptr->dicnt2 = 1U;// CCNT
// ptr->dicnt3 = 1U;
ptr->dim1 = 0u;//DBINDX 应为1
// ptr->ddim2 =(ptr->dicnt0 * ptr->dicnt1);//DCINDX
// ptr->ddim3 =(ptr->dicnt0 * ptr->dicnt1 * ptr->dicnt2);
ptr->daddr = 0x20110138U;  //目标地址

/*执行高速缓存写回*/
CacheP_WB (trpdMem、udma_test_TRPD_size、CacheP_TYPE_ALLD);

返回;

2) 排队和取消排队:

trpdMem =&gUdmaTestTrpdMem[0U];
trpdMemPhy =(uint64_t) udma_defaultVirtToPhyFxn (trpdMem、0U、NULL);
RetVal = udma_ringQueueRaw (udma_chGetFqRingHandle (chHandle0)、trpdMemPhy);
DebugP_ASSERT (uDMA_SOK == RetVal);


while (1)
{
   SPI0_CHCONFG = 0X281523E1;  
   SPI0_CHCNTRL = 0x00000101; // SPI1_CH0通道启用
   ClockP_usleep (100);
   RetVal = udma_ringDueRaw (udma_chGetCqRingHandle (chHandle0)、&pDesc);
   if (udma_sok == RetVal)
   {
    /*检查 TR 响应状态*/
    CacheP_inv (trpdMem、udma_test_trpd_size、CacheP_TYPE_ALLD);
    trRespStatus = UdmaUtils_getTrpdTr15Response (trpdMem、1U、0U);
    DebugP_ASSERT (CSL_UDMAP_TR_RESPONSE _STATUS_COMPLETE = trRespStatus);
   中断;
   }

谢谢、此致
Anjan.

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

    您好 Anjan、

    请确认您用于控制 SPI 的内核以及在该内核上运行的软件。

    此致、

    尼克

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

    您好、Nick。

    实际上、我正尝试根据我们的要求验证 AM6442处理器。 我在 AM64入门套件上运行示例项目。

    目前我的代码在 R5_0内核上运行。 我曾引用 SDK 中提供的 udma_memcpy_polling 示例。

    请确认您用来控制 SPI
    的内核


    我的计划是在 MCSPI 上启用 FIFO 逻辑、并使用 BCDMA 将全局中断配置到 BCDMA 传输批量数据。  

    为此、我最初尝试使用 BCDMA 将 TR->Dadd 指向 SPI_TX 寄存器以验证直接发送一个字节的数据。

    我本来就知道我们不能通过 BCDMA 把批量数据发送到 SPI、但是一个字节发送应该可以正常工作吗?

    谢谢、此致
    Anjan.

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

    您好 Anjan、

    我将把您的主题重新分配给更熟悉 R5F 的团队成员。 如果您在几个工作日内没有收到回复、请 Ping 该主题。 他们可能需要与我们硬件团队的某个成员讨论"批量数据与1字节"问题。

    此致、

    尼克

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

    您好 Anjan、

    问题:为了更精确、您需要使用 SDK 示例工程  udma_memcpy_polling ,要使用 DMA 将一个字节的数据发送到 SPI 引脚,正确吗?

    其他后续问题:

    1.您是否正在使用 AM64x SK/AM64x GP EVM?

    2.您正在使用哪个 SDK 版本?

    是否使用 SBL/SPL 进行 SOC 初始化?

    一旦你澄清了以上,我可以计划的步骤,并将处理它。

    此致、

    瓦伊布哈夫

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

    您好、Vaibhav、

    使用 AM64X SK 的 IM。

    1. 您是否正在使用 AM64x SK/AM64x GP EVM?

    已尝试使用"mcu_plus_sdk_am64x_08_05_00_24"和"mcu_plus_SDK_am64x_08_06_00_45"。

    您使用的是哪个 SDK 版本?

    IM 不会从 SDK 执行任何外部 SOC 初始化导入工程并直接在 SK 上运行该工程。

    您是否正在使用 SBL/SPL 进行 SOC 初始化?

    谢谢、此致
    Anjan.

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

    Anjan、您好、

    您正在使用哪个 SDK 版本?

    IM 不会从 SDK 执行任何外部 SOC 初始化导入工程并直接在 SK 上运行该工程。

    [/报价]

    如果您不进行任何初始化、加载内核的方法是怎样的?

    是否使用 CCS GEL 脚本执行 SoC 初始化?

    BR Vaibhav

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

    您好、Vaibhav、

    是的。

    您是否使用 CCS GEL 脚本进行 SoC 初始化?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Anjan、您好、

    请允许我稍后再给您回复。

    我将介绍 udma_memcpy_polling 的工作、并介绍我对它的看法。

    此致、

    瓦伊布哈夫  

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

    您好、Vaibhav、

    有任何关于这一点的更新吗?

    谢谢
    Anjan.

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

    Anjan、您好、

    问题:因此为了更精确地使用 SDK 示例项目  udma_memcpy_polling ,要使用 DMA 将一个字节的数据发送到 SPI 引脚,正确吗?

    您能评论一下吗?

    此致、

    瓦伊布哈夫

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

    您好、Vaibhav、

    确切地说、我想通过 BCDMA 将一个字节的数据传输到 SPI。

    此 SDK 示例使用 BCDMA。

    问题:因此为了更精确地使用 SDK 示例项目  udma_memcpy_polling ,要使用 DMA 将一个字节的数据发送到 SPI 引脚,正确吗?

    谢谢
    Anjan.

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

    Anjan、您好、

    您能将项目文件发送给我吗?

    这样、我可以很好地检查您的代码、而不是在这里以您所说的文本格式查看您的代码。

    此致、

    瓦伊布哈夫