strange question about MPC5744p DMA

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

strange question about MPC5744p DMA

ソリューションへジャンプ
2,863件の閲覧回数
fyw
Contributor IV

i use dma transfer data from source --> destination,the program lists below.(See appendix for detailed code)

 

the question was caused by "dly = destination[10];   "

if there is no read of destination[], for example  use "dly = 100" instead of " dly = destination[10];   "    this program will work well

about dly = destination[X];  if X< 8  it seems that the first 8 data of   destination[] cannot be update by dma 

                                           if X>=8  it seems that the last 8 data of   destination[] cannot be update by dma  (PS: i am not try every index)

Thank you very much!

 

uint32_t source[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};  
uint32_t destination[16]={0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};

__attribute__ ((section(".text")))

int main(void)
{
uint32_t k,counter = 0;
uint32_t dly;

xcptn_xmpl ();              /* Configure and Enable Interrupts */

CLK_Init();
AIPS_0_Init();
DMA_0_Init();

for(;;)
{

       dly = destination[10];   /*this will cause strange phenomenon*/    

        for(k=0;k<dly;k++);

 

     //SoftTrig DMA
  DMA_0.TCD[0].CSR.B.START = 1u;
  while(DMA_0.TCD[0].CSR.B.DONE == 0u){};
  DMA_0.TCD[0].CSR.B.DONE = 0u;

        for(k=0;k<100000;k++);

        /*update the source data */
        for(k=0;k<16;k++)
        {
         source[k] = counter;
        }
        counter++;

}

return 0;

}

Original Attachment has been moved to: Example_Base.c.zip

ラベル(1)
0 件の賞賛
返信
1 解決策
2,127件の閲覧回数
fyw
Contributor IV

i find "disable dcache" before for(;;) can solve this problem

i wander why?  Is there any document about how to use cache?  Thank you very much!

void dcache_disable(void)
{
   register uint32_t val;

   E200CORE_SPR_GET(val,E200CORE_L1CSR0); /* L1CSR0 */
   val &= ~E200CORE_L1CSR0_CE;
   /* Memory Synchronize */
   E200CORE_SYNC();
   /* Instruction Synchronize */
   E200CORE_ISYNC();
   E200CORE_SPR_SET(E200CORE_L1CSR0,val);
   /* Instruction Synchronize */
   E200CORE_ISYNC();
}

元の投稿で解決策を見る

0 件の賞賛
返信
6 返答(返信)
2,128件の閲覧回数
fyw
Contributor IV

i find "disable dcache" before for(;;) can solve this problem

i wander why?  Is there any document about how to use cache?  Thank you very much!

void dcache_disable(void)
{
   register uint32_t val;

   E200CORE_SPR_GET(val,E200CORE_L1CSR0); /* L1CSR0 */
   val &= ~E200CORE_L1CSR0_CE;
   /* Memory Synchronize */
   E200CORE_SYNC();
   /* Instruction Synchronize */
   E200CORE_ISYNC();
   E200CORE_SPR_SET(E200CORE_L1CSR0,val);
   /* Instruction Synchronize */
   E200CORE_ISYNC();
}

0 件の賞賛
返信
2,127件の閲覧回数
martin_kovar
NXP Employee
NXP Employee

Hi,

using cache together with DMA causes this issue. Explanation is fairly simple. When some lines of RAM are cached, debugger reads this lines via core and it finds the data at first in cache. When there is cache hit (line of RAM is present in cache), data are read from cache memory instead of RAM memory. But DMA writes data directly to the RAM. This causes inconsistencies between data in RAM and cache. There are different data in RAM and different data in cache.

You should mark the part of RAM, which is used for DMA transfers as non-cacheable.

Please look at the following document, which could be helpful for you:

e200 Core Training relevant to MPC55xx and MPC56xx device family

Regards,

Martin

0 件の賞賛
返信
2,127件の閲覧回数
fyw
Contributor IV

"You should mark the part of RAM, which is used for DMA transfers as non-cacheable."

------------- Is this configure SMPU_RGDn_WORD3.CI bit?  Thank you!

捕获.PNG

0 件の賞賛
返信
2,127件の閲覧回数
martin_kovar
NXP Employee
NXP Employee

Hi,

yes, this is the correct way.

Regards,

Martin

0 件の賞賛
返信
2,127件の閲覧回数
fyw
Contributor IV

i read the smpu chapter and find that it mentioned the "master n"  i wonder what is the "master n"?  thank you very much!

捕获.PNG

which(below) is the "master n"?

1.PNG

0 件の賞賛
返信
2,127件の閲覧回数
martin_kovar
NXP Employee
NXP Employee

Hi,

the n means the logical master ID. For example master 2 is DMA, master 3 is FlexRay and so on, see table 7-12

Regards,

Martin

0 件の賞賛
返信