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.

[参考译文] TMS320F28384D:访问 EMIF 32位地址

Guru**** 1630180 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1327685/tms320f28384d-accessing-emif-32bit-address

器件型号:TMS320F28384D

尊敬的先生:

我们正在开发 基于 C2000 28384D 的控制器,并     使用  ASRC 模式 32位数据宽度配置的 EMIF 接口访问 FPGA 寄存器和存储器。   

对于 地址 ,我们已连接  A0...A12  和 Data D31..D0。

访问 是 通过 CS3完成的  (例如、   地址范围从 0x300000开始...)。

我们正在看到 一些 改变的地址 , 这是不清楚的我们  . 如果我们   只能访问32位(使用 DMA/CPU ) ,我们预期  到下一个地址的访问 将是+1

(我们 正在探测  来自 A0...A12的地址总线)

例如   

*(long *) 0x300000=0;  // A0...A12  全0  

*(long *) 0x300001=1;  //A0 =1 、a1..a12 全部0

*(long *) 0x300002=2;  //A0 =0 、A1 =1 、A2..A12=0

...

但 上述情况 不是 真的 (这是通过 DMA 在32位模式测试,并使用 CPU ) ,我们看到一些 移位  如下图所示 ,它看起来像, 为了访问 下一个地址 ,我们需要添加 +2

*(long *) 0x300000=0;  // A0...A12  全0  

*(long *) 0x300002=1;  //A0 =1 、a1..a12 全部0

*(long *) 0x300004=2;  //A0 =0 、A1 =1 、A2..A12=0

这是 它应该 工作的方式吗?  我假设  我 作为4Kx32位 存储器访问 FPGA 时 、每个 地址 将被+1间隔  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Eyal、

    但 上述情况 不 正确 (这是通过 DMA 在32位模式测试,并使用 CPU), 我们看到一些 ***  如下所示,它看起来像, 为了访问 下一个地址,我们 需要添加 +2[/报价]

    需要说明的是、这些地址 值在 GPIO 引脚上列出了 EMIF 地址值、还是正在查看 DMA 对存储器中值的访问?  如果后者是后者、您能解释一下您的 DMA 配置或演示如何将其设置为通过 EMIF 访问存储器吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Omer ,

    我正在探测实际的 GPIO (A0、A1、...)  和 CS

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eyal:

    好的、那么 DMA 正在访问 EMIF 并使用上面显示的地址、这些地址递增2。 这似乎不是由 EMIF 引起的、而是由 DMA 引起的。 您能展示一下您的 DMA 设置吗? 访问的字可能会超出您的预期、这可能 就是地址引脚递增2的原因。

    此外、您可以通过禁用 DMA 并尝试一次仅访问一个 EMIF 地址来验证情况是否如此。 如果这按预期工作、则差异可能来自 DMA 配置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我 尝试过 两种 scnerio  

    直接访问   (为了 强制 32位地址,我甚至 使用了   __BYTE_PERIPLE_32(volatile unsigned long *)0x300200)=my32;  ,这 将确保 访问确实是32位 的,但它产生相同的,只增量+2 导致 地址 变化  

    我的意思是访问    0x300200 和 0x300201 将得到 相同的结果 。

    使用 DMA 时  ,同样的问题  (数据大小 = 32位 )   仅 设置 dst step =2  会导致 写入 不同的地址 (dst step =1 ,不正确)

    我 在参考中看到了  以下  对 DMA 的解释,我猜 它 对于直接访问来说是相同的

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的意思是访问    0x300200 和 0x300201 将产生 相同的结果 。

    抱歉、我意识到这听起来可能有些琐碎、但您能否重复检查 EMIF 地址 位的 GPIO 引脚是否正确? 如果访问奇数地址没有出现在地址引脚上、则这 可能是原因之一。 您还可以通过 尝试访问从0x1到0x800的每个地址来验证这一点、方法是向左移动该位(即0x1、0x2、0x4、0x8...0x800)、查看 A0之外的任何位是否具有异常行为。 同时、我将与另一位专家联系、以了解在32位模式下使用 EMIF 时是否预计会出现这种行为。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您还能提供 EMIF 与外部器件之间的连接图吗? 类似于下图的内容(尽管适合您的案例的正确器件是32位 ASRAM):

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面  是  A0的引脚... A12  因为我  只访问32位 我不 使用  BA0和 BA1

    奇数和偶数 提供保存 结果  、例如   0x300200 和 0x300201  (即一个 0x300202 和0x300203)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    C2000 EMIF 与 FPGA/ASRAM 之间的方案连接 如 上所述 ,我遵循  下面描述的 EMIF 指南行  

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Eyal、

    下面  是  A0的引脚... A12  因为我  只访问32位 我不 使用  BA0和 BA1

    奇数和偶数 提供保存 结果  、例如   0x300200 和 0x300201  (即一个 0x300202 和0x300203)

    [/报价]

    抱歉、您的回答不清楚。 您是否尝试访问地址 0x1、0x2、0x4、0x8...0x800以确保每个地址引脚 A+被切换? 我知道 A0似乎没有产生影响、我要确定的是您是否设置了正确的连接。 如果访问0x0和0x1会在地址线路上输出0x0、这会使我认为地址线路未正确连接。 由于我看不到您的硬件设置、 因此我要求您读取这些地址的引脚。

    您显示了参考手册中有关 GPIO 连接的表格、该表格是正确的、但 请 尝试访问 地址、以确保每个相应的地址引脚被切换。 尤其是对于 GPIO41和 GPIO52、地址引脚的错位问题应出现在这两个引脚之一。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我可以      通过  访问  1<<(Ai+1) 、例如 切换 A0 1<<(0+1)     =2  、切换 A1 1<<(1+1)=4、使任何地址位切换               切换 A2 1<<(2+1)=8、等 切换 Ai  1<<(I+1)

    我可以 访问  ASRAM 中的整个地址空间 、写入和读取都是有效的 ……可以 看到、当 DSP 访问 它时、需要 +2   

    已仔细检查所有连接  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Eyal、

    您能否共享您的 EMIF 配置代码? 我会看一下、看看我是否可以与另一位专家找到对此的解释。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eyal:

    我与其他一些专家交谈过、 根据他们的解释、0x300200和0x300201访问同一地址是合理的; 原因是、即使外部存储器可能是32位的、但 C28存储器仅为16位、因此需要进行两次单独的读取来读取32位数据的上半部分和下半部分。  对于我之前发表的文章可能引起的任何混淆、我深表歉意。如果我了解了其他信息、我会告诉您、但目前这似乎是基于器件内存宽度的预期行为。