主题中讨论的其他器件: 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);
}
}