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.

[参考译文] TMS320F2812:F2812上的 XINTF 至28379D 上的 EMIF

Guru**** 2474130 points
Other Parts Discussed in Thread: TMS320F2812, PROFIBUS

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/880161/tms320f2812-xintf-on-f2812-to-emif-on-28379d

器件型号:TMS320F2812
Thread 中讨论的其他器件: Profibus

大家好、

我正在进行从 F2812 MUC 到 F28379D 的软件迁移。  

目前、我正在处理 EMIF 部件、以便与异步 RAM (8位)通信。
在接线下方:

正确吗?

在 F2812软件中、没有 XINTF 的配置文件。  我在 https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/282734?failure-on-Xintf-initialization 这个主题中看到 过这一点  

在 F2812器件上、复位后、XINTF 默认处于激活状态。  时序都配置为最大值(即最慢)、因为这是安全的。

因此,通常情况下,所有计时寄存器都按如下方式进行设置:

通常、对于一个写入周期、Txzcs0 = XWRLEAD + XWRACTIVE + XWRTRAIL = 347ns。
使用示波器、我发现大约为360ns、因此没关系

现在、我将 F28379D 的所有寄存器设置为与 F2812具有相同的计时:  

通常、对于写入周期、TCS3 = W_HOLD+ W_STROBE + W_SETUP= 350ns。
使用示波器、我发现大约为700ns。 为什么?

感谢您的回复。

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

    电 cc、

    您是否可以观察两次背对背访问的时间?  C28x 是可寻址的16位字、因此每个存取将生成两个8b 运算。

    EMIF 应用手册中简要介绍了此行为

    Tommy

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

    嗨、Tommy、

    是的、我认为这就是发生的情况。 那么、我如何才能继续只写入一个8b 操作呢?

    例如、 我想向地址0x3FFE 写入8位数据、并向地址0x3FFF 读取数据(8位)?

    此致

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

    您好!

    如果我已经了解了应用手册、例如、如果我想发送数据"0xA0"、那么第一个写入是"0xA0"、第二个写入是"0x00"?
    如何才能继续仅发送一个字"0xA0"?

    因为如果外部存储器查看的数据是第二次写入、则不正确(0x00而不是0xFE)

    此致、

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

    电 cc、

    C28x 地址将始终表示16位数据、因此您将始终以16位增量写入。

    表中显示的每个写入操作代表一个原子操作、该原子操作在外部存储器检测到的不同地址上运行。

    Tommy

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

    您好!

    TMS320F2812也属于 C28x 系列? 那么、F2812和 F28379D 之间的行为是相同的?

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

    是的、任何具有 C28x 处理器 的器件都将继承其指令集架构。

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

    您好!

    感谢您的回答。
    它仍然不起作用。


    我已经检查了我的硬件、没关系。 我的外部存储器是 DPRAM、而不是 SRAM。 这是问题的原因吗?
    同一软件适用于 F2812。 2812是否可以与 DPRAM 配合使用、而不是与28379D 配合使用?

    要测试的软件非常简单,我发送一个存储器上特定地址的数据,这个必须将相同的值(在不同地址上)返回给 MCU (在存储器数据表下面):

    它们以乒乓协议发送、即应用程序向模块发送电报、包括至少控制信息、并在发送下一个电报之前等待电报返回。返回电报始终包含至少状态信息。

    此致

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

    电 cc、

    只要符合标准 SRAM 接口、底层存储器实现就不重要。

    您是否已根据配置电子表格工具检查 EMIF 设置?  这将有助于大致检查寄存器。

    如果仍然存在问题、我们需要知道哪些特定信号出现错误行为(以及以何种方式)、以帮助您进一步调试。  这最终将要求对观察到的 EMIF 信号活动与 F28379D 和存储器数据表进行系统比较。

    Tommy

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

    嗨、Tommy、

    我使用的外部存储器实际上是 Profibus 模块(由 Anybus 提供)、它具有 DPRAM (我的基于2812的旧软件与此模块一起使用)。

    以下是 MCU 与 DPRAM 之间通信的快速说明:

    初始化步骤之后(请参阅数据表  hms-hmsi-168-106.pdf  第10页的步骤1“连接模块”至步骤3“初始握手”),有一个步骤称为“发送和接收电报”; 在这一步中、当我向特定寄存器(地址0x3FFE (数据表第16-17页)上的 DPRAM 发送消息(0xA0)时、这个将向另一个寄存 器( 地址0x3FFF (数据表第16-17页)上的 MCU 返回消息(0xA0)

    这是为了确保 MCU 和 DPRAM 之间的通信 正常工作。

    我的软件仅执行以下步骤:初始化步骤和通信测试。 我在    我的代码中放入一个 asm (“ESTOP0”);在 RAM 中写入之后:

    • 对于 F2812、0x3FFE 地址(控制寄存器)(我使用的 XINTF 区域0)上的数据为0xA0;0x3FFF 地址(状态寄存器)上的数据为0xA0 (来自 DPRAM 的应答)

    • 对于 F28379D、0x303FFE 地址 (控制寄存器)(我用的是 CS3异步)上的数据为0xA0;0x303FFF 地址(状态寄存器)上的数据为0x00 (DPRAM 无应答)

    在我的 EMIF 设置下面:

    extern void emif1Initialize (void);
    
    //---------------
    ///\fn void Init_EMIF (void)
    //
    ////\简要 控制 EMIF 寄存器。
    ///\param 无。
    ///\返回无。
    
    void Init_EMIF (void)
    {
    //------ 宣言----
    
    emif1Initialize();
    //
    //配置为在半速率上运行 EMIF1 (EMIF1CLK = CPU1SYSCLK /2)
    //
    EALLOW;
    ClkCfgRegs.PERCLKDIVSEL.bit.EMIF1CLKDIV = 0x1;
    EDIS;
    
    EALLOW;
    //
    //为 CPU1抓取 EMIF1
    //
    EMIF1ConfigRegs.EMIF1MSEL.ALL = 0x93A5CE71;
    
    //
    //禁用访问保护(CPU_Fetch、CPU_WR/DMA_WR)
    //
    EMIF1ConfigRegs.EMIF1ACCPRT0.ALL = 0x0;
    
    //
    //提交与保护相关的配置。 直到该位保持置位
    //无法更改 EMIF1ACCPROT0寄存器的内容。
    //
    EMIF1ConfigRegs.EMIF1COMMIT.ALL = 0x1;
    
    //
    //锁定配置,使 EMIF1COMMIT 寄存器不能
    //再更改。
    //
    EMIF1ConfigRegs.EMIF1LOCK.ALL = 0x1;
    
    //
    //配置 CS3空间的访问时序
    //
    
    Emif1Regs.ASYNC_CS3_CR.bit.ASIZE = 0; //异步设备总线宽度。 ASIZE = 0选择一个8位总线
    Emif1Regs.ASYNC_CS3_CR.bit.TA = 3; //一个异步内存访问结束到另一个异步内存访问开始之间的 EMxCLK 周期数减一个周期
    Emif1Regs.ASYNC_CS3_CR.bit.R_HOLD = 7; //读取保持宽度。
    emif1Regs.ASYNC_CS3_CR.bit.R_STROBE = 18;//读取选通持续时间周期
    Emif1Regs.ASYNC_CS3_CR.bit.R_SETUP = 7; //读取选通设置周期
    Emif1Regs.ASYNC_CS3_CR.bit.W_HOLD = 7; //写入保持宽度。
    Emif1Regs.ASYNC_CS3_CR.bit.W_STROBE = 18;//写选通持续时间周期
    Emif1Regs.ASYNC_CS3_CR.bit.W_SETUP = 7; //写选通设置周期
    emif1Regs.ASYNC_CS3_CR.bit.EW=0; //扩展等待模式启用。 EW=0禁用扩展等待模式
    emif1Regs.ASYNC_CS3_CR.bit.SS = 0; //选择选通模式。 SS = 0选择正常模式
    
    emif1Regs.Rcsr.bit.be = 0; // EMIF 端模式= 0:小端模式
    emif1Regs.Rcsr.bit.FR = 0; // EMIF 运行速率= 1:全速率
    
    EDIS;
    } 

    我可以与您分享在同一时间观察到的 EMIF 信号活动(在 RAM 中写入后立即)。

    我还与您分享带有 CS3 configuration.e2e.ti.com/.../C2000_2D00_EMIF_5F00_ConfigurationTool.xlsx 的配置电子表格工具

    此致、

    e2e.ti.com/.../hms_2D00_hmsi_2D00_168_2D00_106.pdf

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

    电 cc、

    是的、请调查信号活动、以确保它们与您的预期相符。

    此外、请继续注意、C28x 是可寻址的16位字。  C28x 16b 0x303FFF 地址不会映射到与外部8b 0x3FFF 偏移量相同的位置。

    Tommy

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

    嗨、Tommy、

    那么、它可以解释这个问题吗? 如果我写入地址0X303FFE、它与外部存储器中的地址0x3FFE 不匹配?
    但为什么它适用于 F2812?

    此致

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

    电 cc、

    您是否能够调查 EMIF 信号活动?  在您能够确定 F28379D 系统故障的根本原因之前、我不希望推测系统中的差异。

    Tommy

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

    嗨、Tommy、

    我认为我的笔记本电脑上的 EMIF 曲线在写入操作期间被获取、但我不确定是因为/we 信号始终处于高电平状态(可能是在首次读取外部存储器时)。

    周二之前我无法访问示波器、但如果我在首次写入期间获得 EMIF 信号、该信号如何帮助我?
    我必须分析哪些信号?

    此致

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

    被叫方、

    我同意 C28x 是可寻址的16位字。 但是、您为什么说外部存储器是8b-(字节)可寻址的?

    那么、我必须将我的所有地址除以2?
    C28x 上的一个地址对应于外部存储器中的2个地址? (例如:C28x 上的地址0x0030 0000对应于外部存储器中的地址0x0000和0x0001?)

    按照您所说的内容、例如、如果我要写入控制寄存器(存储器中的地址0x3FFE)、我必须写入 C28x 上的地址0x0030 1FFF?

    例如、如果它的工作方式与此类似、如何仅访问地址0x0030 1FFF 上的状态寄存器(存储器中的地址0x3FFF)、而不访问控制寄存器(存储器中的地址0x3FFE)

    此致

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

    [引用 user="electrocc">我同意 C28x 是可按16位字寻址的。 但是、您为什么说外部存储器是8b-(字节)可寻址的?

    根据我的理解,外部设备具有8b 数据总线...因此可寻址8b。

    [引用 user="electrocc">ISO 我必须将我的所有地址除以2?
    C28x 上的一个地址对应于外部存储器中的2个地址? (例如:C28x 上的地址0x0030 0000对应于外部存储器中的地址0x0000和0x0001?)

    按照您所说的内容、例如、如果我要写入控制寄存器(存储器中的地址0x3FFE)、我必须写入 C28x 上的地址0x0030 1FFF?

    是的、每个16b 存取将产生两个8b 操作。

    观察 EMIF 信号的目的是确认从 C28x 访问到外部器件的地址总线转换。 我不愿意将这一理论视为您问题的根本原因而不作确认。 您当然可以尝试使用不同的地址、以查看它们是否符合预期。

    [引用 user="electrocc"]如果其工作方式与此类似,例如,如何仅访问地址0x0030 1FFF 上的状态寄存器(存储器中的地址0x3FFF),而不访问控制寄存器(存储器中的地址0x3FFE)

    您可能可以通过将 EMIF 配置为在16b 模式下运行并仅使用每个 C28x 字的8个最低有效位来实现此目的。

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

    嗨、Tommy、

    我想将8个数据写入外部存储器,因此请按如下所示获取数据:

    (1)

    -外部内存偏移量0x3B00:数据= 0x01
    - 外部内存偏移量0x3B01:数据= 0x01
    - 外部内存偏移量0x3B02:数据= 0x01
    - 外部内存偏移量0x3B03:数据= 0x00
    外部 存储器偏移量0x3B04:数据= 0x41
    - 外部内存偏移量0x3B05:数据= 0x00
    外部 存储器偏移量0x3B06:数据= 0x01
    - 外部内存偏移量0x3B07:数据= 0x00

    按照您所说的内容、每个16b 存取产生两个8b 操作。

    我使用此(部分)代码:

    #define ABCC_parally_base_address 0x300000
    #define iDpramOffset 0x1D80
    
    UINT16 IBytes = 8;
    uint8* pabDpram;
    
    pabDpram =(uint8*)(ABCC_parally_base_address + iDpramOffset);
    
    for (iBytes = 0;iBytes < iLength;iBytes++)
    {
    *pabDpram++=(*pbSource++);
    } 

    我遇到了我所期望的问题:  

    外部存储器将看到:

    -外部存储器偏移量0x3B00 (C28x 上的地址0x301D80):数据= 0x01
    -外部存储器偏移 量0x3B01 (C28x 上的地址0x301D80):数据= 0x00

    - 外部存储器偏移量0x3B02 (C28x 上的地址0x301D81) :数据= 0x01
    - 外部存储器偏移 量0x3B03 (C28x 上的地址0x301D81) :数据= 0x00

    - 外部存储器偏移量0x3B04 (C28x 上的地址0x301D82) :数据= 0x01
    - 外部存储器偏移 量0x3B05 (C28x 上的地址0x301D82) :数据= 0x00

    - 外部存储器偏移量0x3B06 (C28x 上的地址0x301D83) :数据= 0x00
    - 外部存储器偏移 量0x3B07 (C28x 上的地址0x301D83) :数据= 0x00

    - 外部存储器偏移量0x3B08 (C28x 上的地址0x301D84) :数据= 0x41
    - 外部存储器偏移 量0x3B09 (C28x 上的地址0x301D84) :数据= 0x00

    - 外部存储器偏移量0x3B0A (C28x 上的地址0x301D85) :数据= 0x00
    - 外部存储器偏移 量0x3B0B (C28x 上的地址0x301D85) :数据= 0x00

    - 外部存储器偏移量0x3B0C (C28x 上的地址0x301D86) :数据= 0x01
    - 外部存储器偏移 量0x3B0D (C28x 上的地址0x301D86) :数据= 0x00

    - 外部存储器偏移量0x3B0E (C28x 上的地址0x301D87) :数据= 0x00
    - 外部存储器偏移 量0x3B0F (C28x 上的地址0x301D87) :数据= 0x00

    如何获得与以上(1)相同的结果?

    我需要使用字节内在函数

    为什么 F2812和 F28379D 之间存在差异? 这两个器件都属于 C28x?!

    此致

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

    电 cc、

    正如我在之前的帖子中所建议的、我认为您的主要操作应该是将 EMIF 配置为在16b 模式下运行:

    [引用 user="tlee"]您可能可以通过将 EMIF 配置为在16b 模式下运行并仅使用每个 C28x 字的8个最低有效位来实现此目的。

    请记住、您最初的提问线路使我们假设您使用的 EMIF 具有通用8位外部 RAM 来存储数据。 揭示出 EMIF 用于与外部控制器连接、因此应适当调整调试方法和解决方案。

    我怀疑 F2812 XINTF 在16b 模式下运行、每个 C28x 地址只使用较低的8b。

    Tommy

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

    Tommy、

    我已经更改了软件和接线以在16b 模式下运行。

    Emif1Regs.ASYNC_CS3_CR.bit.ASIZE = 1; //异步设备总线宽度。 ASIZE = 1选择一个16位总线 

    我  有点困惑。

    您之前告诉过我:

    C28x 16b 0x303FFF 地址不会映射到与外部8b 0x3FFF 偏移量相同的位置。

    是的、每个16b 存取将产生两个8b 操作。

    但现在,我处于16位模式;所以通常:

    • 如果我在0x303FFE 地址上发送数据、它将映射到0x3FFE 偏移?
    • 接收到的数据将是正确的,因为只使用了较低的8b (连接到我的内存 D0->D7)?



    我 观察了 EMIF 信号、一切似乎都正常。

    此致

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

    [引用 user="electrocc">我  有点困惑。

    您之前告诉过我:

    C28x 16b 0x303FFF 地址不会映射到与外部8b 0x3FFF 偏移量相同的位置。

    是的、每个16b 存取将产生两个8b 操作。

    但现在,我处于16位模式;所以通常:

    • 如果我在0x303FFE 地址上发送数据、它将映射到0x3FFE 偏移?
    • 接收到的数据将是正确的,因为只使用了较低的8b (连接到我的内存 D0->D7)?



    我 观察过 EMIF 信号、一切似乎都正常。[/QUERP]

    一切都是一致的。  在16位模式下使用 EMIF 时、您所做的是"黑客"其逻辑、即获得 C28x 到外部的1对1地址映射、但代价是失去一半的可用存储器空间(每个16位字的最高8位丢失)。

    如果将 EMIF 用于数据存储、则该方案并不理想、但它适合支持与外部控制器的通信链路。

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

    嗨、Tommy、

    现在一切都正常。

    非常感谢您的支持和解释。

    此致、