在blackfin中DMA29 和core0 同时访问DDR2

你好,

我正在使用贵公司的blackfin BF609,使用过程中遇到了一个问题。在core0去读取DDR2(MT47H64M16)的同时DMA29(EPPI0)往DDR2写入的数据,问题是写入的数据会出现丢失。对于这个问题该如何解决?是否可以设置core0和DMA访问DDR2的权限或者优先级?

  • 0
    •  Analog Employees 
    on May 24, 2013 10:10 AM

    请问配置了SCB吗?除了SCB0,SCB5也配置了吗?在SCB0里,给SCB5多分配SLOT,在SCB里,多给DMA29分配SLOT。

  • 請問,

    在DDR2與PPI0(DMA29)之間:

    關於SCB0與SCB5的  SCB_ARBRn.SLOT、SCB_ARBRn.SLAVE, SCB_ARBWn.SLOT、SCB_ARBWn.SLAVE具體上要怎麼設定呢?

    ADSP-BF60x Blackfin Processor Hardware Reference 說明中,P. 2-23頁,SLAVE[7:0] slave interface 的設定範圍又為何呢?


    麻煩指導,謝謝!!

  • 0
    •  Analog Employees 
    on Mar 9, 2016 10:43 AM

    Hi Chris,

    如果没有遇到performance问题,我们可以不去在意SCB寄存器的配置。

    如果需要PPI0获得更多的总线时间,就需要修改 SCB_ARBRn和SCB_ARBWn。

    这两个寄存器和传统的寄存器的用法很不一样。

    SCB的总线仲裁采用round robin算法,并不存在优先级。要想使某一个外设获得更多的总线时间(或者带宽),就要把更多的时间片(SLOT)分配给这个外设。SCB_ARBWn.SLOT = 0, SCB_ARBWn.SLAVE = 0,就是把第0个时间片分配给SCB上的第0个Slave。如果你想把32个时间片都分配给第0个Slave,可以写32遍SCB_ARBWn,保持.SLAVE不变,.SLOT从0递增到31。

    SCB0有6个master(table 2-4),MI0是DDR(DMC)接口。SCB0_ARBW0就是配置DDR写优先级的寄存器。Table 2-5定义了SCB0 DDR的缺省时间片分配。从这个表里也可以看出Slave的ID,SI0(c0)表示Core 0的slave ID是0,而SCB5的slave ID就是5。要给SCB5更多的时间片,把SCB0_ARBW0.SLOT更多地分配给SCB0_ARBW0.SLAVE=5。比如把SLOT 0到SLOT 15都分配给SCB5,可以这样操作

    for(i = 0; i < 16; i++)

    {

    *pREG_SCB0_ARBW0 = (i << 24) | 0x05;

    }

    注意,缺省状态下每个SLOT都分配给了一个Slave。上面的语句会占用其它Slave的SLOT,如果这个Slave还会访问DDR,而且没有保留任何SLOT给它,就会出现总线错误。为了优化,可以把不用的Slave的SLOT都分配给吞吐量较高的SLAVE,吞吐量低的SLAVE分配更少的SLOT。

    Table 2-15显示了SCB5的MI0的缺省SLOT分配。如果DMA31,DMA32不用,你可以把SLOT3/4/6/7分配给DMA29/30。

    for(i = 0; i < 4; i++)

    {

    *pREG_SCB5_ARBW0 = (2*i << 24) | 0x0;

    *pREG_SCB5_ARBW0 = (2*i+1 << 24) | 0x1;

    }

  • 0
    •  Analog Employees 
    on Mar 9, 2016 10:55 AM

    There is an example project for SCB optimization.

    attachment.zip
  • Hi  Harry,

    看完你的解說,才稍微比較了解SCB,我再嘗試看看。

    謝謝你的解答與範例程式!!