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.

[参考译文] TMS320C28346:C28346 /WR 信号与数据总线不同步。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/604582/tms320c28346-c28346-wr-signal-is-not-synchronous-with-data-bus

器件型号:TMS320C28346

 您好,

我的客户使用 C28346。

使用 EMIF 访问 CPLD 时出现问题。

问题是 /WR 信号与数据总线不同步。

它希望将0x37写入 CPLD。

但实际上,它会将旧数据0x27写入 CPLD。

将"NOP"添加到故障代码后、结果是正确的。

问题1:导致/WR 信号与数据总线不同步的原因是什么?

问题2: 正确的解决方案是什么?

谢谢、

此致、

Simen

------ ----------------------------------------------------

 寄存器 sPWM_CTL buy_PWM_CTL;                     

   寄存器 sPWM_COUNTER buy_PWM_CNT;             

  int PWM_CNT;

 

  buff _pwm_CTL.word = CpldRegs.PWM_CTL.word;

  缓冲器_pwm_CTL.Bits。CNT_HOLD = 1;

  CpldRegs.PWM_CTL.word = buw_PWM_CTL.word;           <--写入 保持=1到位于0x20000E 地址的 CPLD

  buff _pwm_cnt.word = CpldRegs.pwm_counter.word;

  PWM_CNT =缓冲器_pwm_CNT.Bits、PWM_CNTR;

  缓冲器_PWM_CTL.Bits。CNT_HOLD = 0;

  CpldRegs.PWM_CTL.word =缓冲器_pwm_CTL.word;

 --------------------------------------------------

故障代码波形:(保持未成功,寄存器0x0E WR 0x37)

------ ----------------------------------------------------

 寄存器 sPWM_CTL buy_PWM_CTL;                                                                

   寄存器 sPWM_COUNTER buy_PWM_CNT;                                                        

  int PWM_CNT;

 

  buff _pwm_CTL.word = CpldRegs.PWM_CTL.word;

  缓冲器_pwm_CTL.Bits。CNT_HOLD = 1;

  CpldRegs.PWM_CTL.word =缓冲器_pwm_CTL.word;

  asm (" NOP");

  CpldRegs.PWM_CTL.word = buw_PWM_CTL.word;           <--写入 保持=1到位于0x20000E 地址的 CPLD,并且它成功

  asm (" NOP");

  asm (" NOP");

  asm (" NOP");   

   

   buff _pwm_cnt.word = CpldRegs.pwm_counter.word;

  PWM_CNT =缓冲器_pwm_CNT.Bits、PWM_CNTR;

  

   缓冲器_PWM_CTL.Bits。CNT_HOLD = 0;

  CpldRegs.PWM_CTL.word =缓冲器_pwm_CTL.word;

  asm (" NOP");

  CpldRegs.PWM_CTL.word =缓冲器_pwm_CTL.word;

    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能告诉 XINTF 时序配置还是与 XINTF 设置共享代码吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vivek、

    XINTF 设置如下所示。
    谢谢、

    此致、
    Simen
    ----------------------------------------
    空 InitXintf (空)

    EALLOW;
    // XTIMCLK = SYSCLKOUT/1
    XintfRegs.XINTCNF2.bit.XTIMCLK = 0;
    //无写入缓冲
    XintfRegs.XINTCNF2.bit.WRBUFF = 0;
    // XCLKOUT 被启用
    XintfRegs.XINTCNF2.bit.CLKOFF = 0;
    // XCLKOUT=XTIMCLK/2
    XintfRegs.XINTCNF2.bit.CLKMODE = 1;

    // XINT 设置
    //配置 XINT1
    XIntruptRegs.XINT1CR.bit.Polarity = 1; //上升沿中断
    XIntruptRegs.XINT2CR.bit.Polarity = 1; //上升沿中断

    //启用 XINT1和 XINT2
    XIntruptRegs.XINT1CR.bit.ENABLE = 1; //启用 XINT1
    XIntruptRegs.XINT2CR.bit.ENABLE = 1; //启用 XINT2

    XintfRegs.XTIMING6.bit.XWRLEAD=3;
    XintfRegs.XTIMING6.bit.XWRACTIVE = 7;
    XintfRegs.XTIMING6.bit.XWRTRAIL = 1;
    //区域读取时序
    XintfRegs.XTIMING6.bit.XRDLEAD=3;
    XintfRegs.XTIMING6.bit.XRDACTIVE = 7;
    XintfRegs.XTIMING6.bit.XRDTRAIL = 1;

    //不要将所有区域的读取/写入提前期/活动/跟踪计时加倍
    XintfRegs.XTIMING6.bit.X2TIMING=1;

    //区域不会对 XREADY 信号进行采样
    XintfRegs.XTIMING6.bit.USEREADY=1;
    XintfRegs.XTIMING6.bit.READYMODE = 1;

    XintfRegs.XTIMING6.bit.XSIZE = 3;

    XintfRegs.XTIMING7.bit.XWRLEAD=3;
    XintfRegs.XTIMING7.bit.XWRACTIVE = 7;
    XintfRegs.XTIMING7.bit.XWRTRAIL = 3;
    //区域读取时序
    XintfRegs.XTIMING7.bit.XRDLEAD=2;
    XintfRegs.XTIMING7.bit.XRDACTIVE = 6;
    XintfRegs.XTIMING7.bit.XRDTRAIL = 0;

    //不要将所有区域的读取/写入提前期/活动/跟踪计时加倍
    XintfRegs.XTIMING7.bit.X2TIMING=0;

    //区域不会对 XREADY 信号进行采样
    XintfRegs.XTIMING7.bit.USEREADY=0;
    XintfRegs.XTIMING7.bit.READYMODE = 0;

    XintfRegs.XTIMING7.bit.XSIZE = 3;
    EDIS;

    //强制流水线清空以确保写入
    //返回前发生最后配置的寄存器。
    asm (" RPT #7 || NOP");
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    锡门、

    在此代码中、您有以下行-

    //区域不会对 XREADY 信号进行采样
    XintfRegs.XTIMING6.bit.USEREADY=1;
    XintfRegs.XTIMING6.bit.READYMODE = 1;

    注释指出、对于 Zone6、将不会对 XREADY 进行采样、但 USEREADY 被设置为"1"。 这需要纠正。

    此外、XWTRAIL 的值应为2而不是"1"。 您能看到这些更改是否会产生任何影响。

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

    地址0x20000E 是 XINTF7、而不是 XINTF6。
    谢谢、

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

    你是对的。 这看起来很奇怪。 看起来它与 CPU 流水线有关、因此我们需要汇编指令来处理工作代码和非工作代码。 您能提供相同的功能。 此外、在工作情况下(当您有 NOP 时)、您有两次写入。 请删除其中一个写操作(在 NOP 之前)并查看它是否仍然有效并为该代码提供汇编。

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

    您好、Vivek、

    以下是工作代码和非工作代码的汇编说明:

    FAIL1-编码和波形

    红色文本1:将 HOLD=1写入位于0x20000E 地址的 CPLD

    @文本2:数据应为0x37 μ s (reg 14)、 而不是0x27。

    故障2 -代码和波形

    红色文本1:添加 一个"NOP"、然后将 HOLD=1写入0x20000E 地址处的 CPLD

    @文本2:数据应为0x37 μ s (reg 14)、 而不是0x27。

    通过代码和波形

    红色文本1: 然后将 HOLD=1 写入两次、地址为0x20000E

    红色文本2:首次写入 μ@(reg 14)数据为0x27。

    红色文本3:等待 "NOP",然后再次向@(reg 14)写入"0x37",并通过测试。

    此致、

    Simen

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

    你(们)好、Vivek

    添加客户其他信息、

    1.故障3代码写入/读取时序错误。

     预期代码: WRITE reg 14=> Read reg 19=> WRITE reg 14=> Read reg 10。

     波形 结果: 读取寄存器19 =>写入 寄存器14 =>写入 寄存器14 =>读取寄存器10

    故障4代码对写入和等待16个"NOP"延迟无效。

      但它可以在写入两次时工作。

    --------------------------------------------------

    故障3 -编码和波形

    故障4 -代码和波形

    此致、

    Simen

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

    您好、Simen、

    很抱歉耽误你的回答。 预期结果来自 FAIL-3代码。 Reg14和 Reg19是不同的地址、因此由于 CPU 流水线的原因、运行顺序会发生变化。 在 CPU 流水线 WR 是最后一个相位、因此即使 WR 之后有 RD、RD 也可以在 WR 之前执行。 以下是 CPU 流水线(有关更多详细信息、请参阅 CPU 用户指南) -

    关于其他问题,我们仍然不知道为什么会发生这种情况。

    您是否可以提供此问题的 CCS 示例工程、我可以使用它在此处复制此问题?

    您还在使用任何编译器优化吗? 是否可以禁用优化并查看它是否可以在没有优化的情况下工作?

    其他要尝试的是对 reg14执行写操作后,是否还可以向 reg14添加"读" 以查看您得到的值是多少?

    此致、

    Vivek Singh  

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

    您好、Vivek、

    由于 CPU 流水线=>、预计会产生 FAIL-3代码的结果
    1.如何遵循某些规则来避免这种结果?
    因为我们通常需要按特定顺序使用 r/w XINTF、但是操作序列的变化会产生很大的麻烦。
    2.按管道更改的操作序列仅发生在 XINTF 中? 内部存储器访问是否正常?

    谢谢

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

    [引用]因为我们通常需要按特定顺序使用 r/w XINTF、但操作顺序的变化会影响大问题。 [/报价]

    序列变化不应对功能产生任何影响。 这样做是为了提高性能。 与本例类似、reg19和写入 reg14是独立操作(不同的寄存器)、因此 reg19在 reg14功率之前被读取。 如果它被写入 reg14、然后重新回读 reg14、那么顺序将不会改变。

    [引述] 2. 只在 XINTF 中发生了按流水线更改的操作序列? 内部存储器访问是否正常? [/报价]

    这不限于 XINTF。 它适用于所有未受流水线保护的地址空间(例如、内部 RAM)。 所有外设空间都受到流水线保护、因此外设寄存器访问将遵循顺序。 此信息可在器件的存储器映射中找到。

    此致、

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

    我理解您的解释。 但是、因为我们将 XINTF 与 CPLD 一起使用。 由于 CPLD 规范、"写入寄存器14/读取 寄存器19"的序列不能更改。 我在写入 reg14后添加3 NOP 可以使订单正确。 这种情况是否有更好的解决方案?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Justin、

    您需要为此在代码中插入 NOP。

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

    其他选项是为此使用 XINTF"区域0"空间、该空间受到保护、因此不会更改序列。

    对于原始故障、您是否有我可以使用的示例项目?

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

    如果我们使用插入 NOP 来解决序列更改问题。 我们应该插入多少 NOP?
    关于原始故障、您能否提供您的电子邮件地址? 我将向您发送项目。
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您将需要三个 NOP。

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

    我已经向您发送了项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vivek、

    收到我们的项目后,您有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Vivek、

    客户已解决此问题。
    谢谢、
    ----------------------------------------
    Justin 检查是否有3个"NOP"可能导致 CPLD 错误工作。
    它通过了测试。


    此致、
    Simen