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.

[参考译文] RM57L843:MIB-SPI 和最后一个传输组 TG 的问题

Guru**** 2553260 points
Other Parts Discussed in Thread: RM57L843, TCAN4550

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/870653/rm57l843-mib-spi-and-issue-with-last-transfer-group-tg

器件型号:RM57L843
主题中讨论的其他器件: TCAN4550

您好!

客户正在将 TCAN4550与 RM57L843配合使用、并正在使用多个缓冲器设置多个 TG。 TG 配置为单次触发模式。 我们发现最后一个 TG 指向第一个 TG、但即使将 TG 配置为 OneShot、MIB-SPI 也不会停止并循环返回到第一个 TG 等。

作为一种权变措施、客户实施的虚拟 TG 从未启用或启动。 上一个 TG 指向虚拟 TG。 通过此操作、OneShot 序列 TGs 将在最后一个序列停止。

这是已知问题还是行为?

权变措施是否正确?

谢谢、

-Gunter

P.S.下面是 MIB-SPI 配置的代码片段作为参考:


/*如果使用*/,则配置多缓冲区

if (settings->useMib){

   spiDataCtx[bus].useMib= true;

 

   spiReg ->MIBSPIE |= SPI_MIBSPIE_ENABLE;

 

   /*等待多缓冲 RAM 的自动初始化完成*/

   uint32_t 超时= SPI_BUFINIT_ACTIVE_TIMEOUT;

   while ((spiReg ->FLG & SPI_FLG_BUFINTACTIVE)&&(--timeout >0)){

       /*等待*/

   }

 

   if ((spiReg ->FLG & SPI_FLG_BUFINTACTIVE)&&(超时= 0)){

       返回 DEX_ERR_TIMEOUT;

   }

 

   spiDataCtx[bus].numTG = settings->mibSettings->numTG;

 

   /*配置传输组*/

   uint8_t bufferCount = 0;

   对于(uint8_t TG = 0;TG < settings->mibSettings->numTG;++TG){

       uint32_t OneShot =(settings->mibSettings->tgConfigs[TG].OneShot)

                               ? SPI_TGCTRL_OneShot_enable

                               :SPI_TGCTRL_OneShot_disable;

       uint32_t preset =(settings->mibSettings->tgConfigs[TG].potinterReset)

                               ? SPI_TGCTRL_PRSP_ENABLE

                               :SPI_TGCTRL_PRST_DISABLE;

       uint32_t trigEvt =(uint32_t)(settings->mibSettings->tgConfigs[TG].triggerEvent << SPI_TGCTRL_TRIG_EVT_SHIFT);

       uint32_t TRIGSrc =(uint32_t)(settings->mibSettings->tgConfigs[TG].triggerSource << SPI_TGCTRL_TRIG_SRC_SHIFT);

       uint32_t startBuf =(uint32_t)(bufferCount << SPI_TGCTRL_PSTACT_SHIFT);

 

       bufferCount = bufferCount + settings->mibSettings->tgConfigs[TG].numBuffers;

 

       spiReg->TGCTRL[TG]= OneShot |预设| trigEvt | trigSrc | startBuf;

   }

 

   /*为最后一个 TG 缓冲区设置结束指针*/

   spiReg ->LTGPEND =(uint32_t)((bufferCount - 1)<< SPI_LTGPEND_LPEND_SHIFT);

 

   MibSpiRam_t * mibRam = SpiGetMibRam (spiReg);

   bufferCount        = 0;

 

   /*配置多缓冲 RAM */

   对于(uint8_t TG = 0;TG < settings->mibSettings->numTG;++TG){

       对于(uint8_t buf = 0;buf < settings->mibSettings->tgConfigs[TG].numBuffers;++buf){

           /*为此缓冲区配置 RAM 设置*/

           mibRam->TX[bufferCount + buf].control =(uint16_t) SPI_TX_RAM_BUFMODE_CONTINUX|

                                                   (uint16_t) SPI_TX_RAM_WDEL_DISABLE      |

                                                   (uint16_t) SPI_TX_RAM_DFSEL_0           |

                                                   (uint16_t) SpiGetCSNR (settings->chipSelect);

 

           if (buf =settings->mibSettings->tgConfigs[TG].numBuffers - 1){

               /*在最后一个缓冲区中释放芯片选择并解除锁定*/

               mibRam->TX[bufferCount + buf].control |=(uint16_t) SPI_TX_RAM_CSHOLD_disable;

               mibRam->TX[bufferCount + buf].control |=(uint16_t) SPI_TX_RAM_LOCK_DISABLE;

           }否则{

               /*保持芯片选择激活和锁定操作*/

               mibRam->TX[bufferCount + buf].control |=(uint16_t) SPI_TX_RAM_CSHOLD_enable;

               mibRam->TX[bufferCount + buf].control |=(uint16_t) SPI_TX_RAM_LOCK_ENABLE;

           }

       }

 

       bufferCount = bufferCount + settings->mibSettings->tgConfigs[TG].numBuffers;

   }

 

   对于(uint8_t TG = 0;TG < settings->mibSettings->numTG;++TG){

       /*将 TG 完成和挂起中断设置为 LEVEL/INT 0 */

       spiReg ->TGITLVCR |=(uint32_t)((1 << TG)<< SPI_TGITLVST_COMPLETE_SHIFT);

       spiReg ->TGITLVCR ||(uint32_t)((1 << TG)<< SPI_TGITLVST_SUSPEND _SHIFT);

 

       /*启用 TG 完成和挂起中断*/

       spiReg ->TGITENST |=(uint32_t)((1 << TG)<< SPI_TGITENST_COMPLETE_SHIFT);

       spiReg ->TGITENST ||(uint32_t)((1 << TG)<< SPI_TGITENST_SUSPEND _SHIFT);

   }

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

    您好!

    我以前没有看到这个问题。 我将查看您的 MibSPI 配置。

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

    您好 QJ、

    如果您有更多更新、请告知我们。

    谢谢、

    -Gunter

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

    您好 Gunter、

    我不完全理解您的代码。 如果 TGxCTRL 寄存器中的 ONESHOTx 被置位、则传输只执行一次。 在执行另一个传输之前、必须重新启用 TG。

    您能否在这个组传输完成后检查 TGENA 位是否被清除(禁用)? 并仔细检查是否为所有 TGxCTRL 设置了 OneShot 位。