Hello. I've never used MPU and cache before, so i dont know how to solve problem.
I'am working with LPSPI and receiving data form external flash:
base->TCR |= LPSPI_TCR_TXMSK(isTxMask); // start transmission
while (!(base->SR & LPSPI_SR_FCF_MASK)) {}; // waiting for frame transfer has completed
this code doesnot work properly. Some times it works and some time it doesnot. It hangs and i cant even stop the debugger. If i disable icache before waiting it works, but delays are significant.
This works:
base->TCR |= LPSPI_TCR_TXMSK(isTxMask);
if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)){SCB_DisableICache();}
while (!(base->SR & LPSPI_SR_FCF_MASK)) {};
SCB_EnableICache();
Does anybody can explain me, what i am doing wrong?
已解决! 转到解答。
Thank you Crist for your answer.
Your advice does not help.
I dont know why simple while loop does not work somtimes. Looking for another flag helped me:
while (!(base->SR & LPSPI_SR_RDF_MASK)) {};
Hi,
I saw that you said: "If i disable icache before waiting it works, but delays are significant." Does this mean if you add a delay loop,
also can fix your issue? if that, i think that you can test __DSB() __ISB() instead, without the SCB_DisableIcache();
Regards,
Crist
Thank you Crist for your answer.
Your advice does not help.
I dont know why simple while loop does not work somtimes. Looking for another flag helped me:
while (!(base->SR & LPSPI_SR_RDF_MASK)) {};