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.

OMAP-L138中ARM和UPP同时访问DDR2会产生冲突吗

Other Parts Discussed in Thread: OMAP-L138

我的板子上是这样的:

       在OMAP-L138中ARM里面跑系统,通过DSP控制UPP通过EDMA将外部数据存到DDR2中,但是每次ARM读这段空间中的数据的时候发现都是0,也就是没写进去。

      后来改成DSP控制UPP通过EDMA将外部数据存到内部共享内存(128K)里面,然后ARM就可以在这里面正确的读数据了。

       以前看过几个帖子,说可能是ARM和DSP共用一个总线可能造成冲突的问题,但是不明白怎么设置,还是UPP和ARM的优先级的问题?我的寄存器PBBPR=0X20

谢谢

  • 你好,

    分配给ARM侧的操作系统,占用了多少的DDR2内存?建议你保留一部分内存,不分配给Linux OS,然后用DSP在这部分DDR2上写数据,试试看。

    ARM和DSP是共享外设的,由内部进行仲裁。

  • 你好

         我的板子上DDR2共有256M空间,给DSP的是专门分配的36M空间(2M的DSPLINK空间和34M的DSP空间),还有供内核的空间等都是按照开发板上WINCE6.0的BSP的地址分配的。

         现在的问题是DSP控制的UPP往DSP专用的那34M空间写数,之后ARM去读发现全是0,而不往那个空间写,往L138的共享内存上写,ARM就可以读出来。不知道是UPP与ARM冲突了还是DSP与ARM冲突了?

  • 你好,

    DSP控制的UPP往DSP专用的那34M空间写数,你可以在DSP端用打印函数查看一下,写的是否正确?应该是已经写上去了。可能是Linux端读DSP专用的那34M空间出的问题。

  • 你好,

        谢谢你的答复。

        目前问题已经得到解决。我参考TI英文论坛上的一个帖子《uPP Problem after receiving first package

    》,发现我的问题跟他的很类似,然后我按照Joe Coombs 的提示对cache进行了修改,然后就好了。

       但是关于这个还是不是很明白,为什么UPP有自己的DMA,就要在读数的时候关闭cache呢?这两者有什么冲突?麻烦哪位能不能简单的介绍一下这两者的关系。谢谢!

  • 你好,

    请看 2.4 Coherence

    www.ti.com/.../sprug82a.pdf

  • 请教xunliang ma

           我现在遇到这么一个问题:我的板子是这样的,FPGA采样AD数据,通过upp接口传送给OMAP-L138的DSP,DSP完成相关运算后,将结果通过dsplink发送给ARM。

           我用ccs仿真连接到OMAP-L138加载DSP的.out程序,upp可以准确接收FPGA发来的数据,但DSP的.out程序通过ARM加载(ARM跑Linux系统),感觉upp接口没有工作,没有接收到upp数据,upp的EOWI中断也没有响应,请问你遇到过类似问题没有?是不是ARM和DSP抢占upp接口?DSP中我用的bsl中的upp_init()接口初始化的,请问还需要初始化别的寄存器什么吗?谢谢!

  • 我也遇到过类似的问题,就是感觉每次UPP采出来的数据好像都是0。后来发现是cache更新的问题,也就是说DSP核读取存储器中的数据跟UPP中的DMA访问存储器会有冲突,就如我上面所说的一样。

    DSP读取的是cache中的数,cache中的数是从存储器中获得的,如果cache不更新的话,它里面的数永远只是第一次获得的数,那么即使DMA不断的从FPGA中采集数据,DSP也获得不到最新的数据。所以cache更新要打开。

  • 请教xunliang ma

          cache更新打开怎么做?

  • 开发板里面自带的一些例子程序里面有,具体的我也不知道,我是搞硬件的,跟软件工程师说了这个后,他就知道怎么做了。

  • 请教xunliang ma:

          我尝试调用了cslCache中的一些接口,还是没能解决我的问题,你能否帮忙问一下你们的软件工程师如何解决的?非常感谢!我的email:lh_zou@163.com

  •    如果打开了cache,要读取UPP采集的数据的话,需要先刷新下cache,可以用dsplink下hal_cache.h头文件里的HAL_cacheInv()函数刷新,dsplink带的dsp例子程序readwrite里有使用此函数。HAL_cacheInv()函数其实是调用了BIOS里的BCACHE模块,直接用BACHE模块里的函数也可以。

  • 这个问题解决了,非常感谢!现在DSP ccs仿真的时候upp接口接收数据完全OK

    不知道你们有没有通过ARM 调用PROC模块接口启动DSP的程序?DSP单独ccs仿真是好的,但我用ARM启动DSP的时候,DSP还是接收不到upp接口的数据

  • 请教xunliang ma:

          请问你的邮箱多少?或者能否发封邮件到我的邮箱,想联系你讨论下合作。

  • 请教Liuhua Zou:

        你好,我们的设计跟你的很相似,请问如何响应EOWI中断呢?中断处理程序写好了,但是不知道如何让它和中断事件联系起来。还有,你最后是通过更新cache来解决DSP读取内存的问题的吗?请问是如何更新的?谢谢!

  • 您好:

              我不能发帖子啊,“如果您有问题需要解答, 请点击此链接去发表新帖子”是灰色的,不能点击啊?

             请问omap-L138的C674X调用DSPLIB(dsp67x.lib)库中的FFT函数void DSPF_sp_cfftr2_dit(float * x, float * w, short n)、void DSPF_sp_cfftr4_dif(float * x, float * w, short n) 这两个函数有什么区别?另外形参中的参数都代表什么含义?我要做256点的FFT,该如何定义这三个参数?运算结果存到哪个指针地址呢?

    另外DSPF_sp_icfftr2_dit()怎么用呢?谢谢了!