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.
工具/软件:Code Composer Studio
现在、我将使用28377d 和 ET1100来开发 ECAT 伺服。 我们使用8位 异步 µController 接口在28377和 ET1100之间传输数据。 至于 EMIF、我的配置如下(参考 TI 的演示项目"PDI_hal_test_app"):
EMIF1Regs.ASYNC_CS2_CR.ALL = (EMIF_ASYNC_ASIZE_8 |// 8位存储器
//接口
EMIF_ASYNC_TA_1 |//周转时间
EMIF_ASYNC_RHOLD_4 |//读取保持时间
EMIF_ASYNC_RSTROBE_10 |//读取选通时间
EMIF_ASYNC_RSETUP_6 |//读取设置时间
EMIF_ASYNC_whold_2 |//写入保持时间
EMIF_ASYNC_WSTROBE_8 |//写选通时间
EMIF_ASYNC_WSETUP_4 |//写入设置时间
EMIF_ASYNC_EW_ENABLE |//扩展等待
EMIF_ASYNC_SS_DISABLE //选通选择模式
);
现在的问题是:当以直流模式运行且 TwinCAT 作为 ECAT 主站时、TwinCAT 每20秒发送0x1b 错误。 PDI 错误寄存器0x30d 的值为 alwas 0xff 而不是0。 我已向 ETG 寻求帮助。 将看门狗从读取 ET1100寄存器0x440更改为仅使用28377自己的计时器的软件看门狗后、再也没有0x1b 错误(0x1b 表示同步管理器看门狗错误或超时)。 这意味着 PDI 界面出现错误、导致从 ET1100错误读取0x440。 如果忽略此错误、PDO 和 SDO 等其他东西都正常工作。
实际上、如果我 完全使用以下 TI 演示项目"PDI_hal_test_app" EMIF 配置、当 ECAT 主站将从器件的状态从 PREOP 更改为 OP 时、通常会出现另一个问题、错误提示为"Read status 0x04、status 0x08 Expected "、然后从器件的状态进入 SAFEOP ERR。 两个 EMIF 配置的不同之处在于、我在每个 EMIF 读取级中添加了两个 CLK。 这可能会确保 PDI 的读取操作更加稳定。 但我不确定我猜的是不是对的。 如果我添加4个或更多读取 CLK、ECAT 伺服从器件将始终处于初始化 ERR 状态。 因此、我真的很困惑 EMIF 配置。 可以给我一些建议和帮助吗? 非常感谢。
EMIF1Regs.ASYNC_CS2_CR.ALL = (EMIF_ASYNC_ASIZE_8 |// 8位存储器
EMIF_ASYNC_TA_1 |//周转时间
EMIF_ASYNC_RHOLD_2 |//读取保持时间
EMIF_ASYNC_RSTROBE_8 |//读取选通时间
EMIF_ASYNC_RSETUP_4 |//读取设置时间
EMIF_ASYNC_whold_2 |//写入保持时间
EMIF_ASYNC_WSTROBE_8 |//写选通时间
EMIF_ASYNC_WSETUP_4 |//写入设置时间
EMIF_ASYNC_EW_ENABLE |//扩展等待
EMIF_ASYNC_SS_DISABLE //选通选择模式
);
2.此外、我发现 EMIF 写入操作比 EMIF 读取操作慢得多。 也就是说 、*XMEM_ps++=*pTxData++花费大约21us、而读取操作花费大约300ns/byte。 我不确定这是否与0x1b 错误有关。 谢谢你。
您好!
在0x1b 错误(SM WDOG 超时)上:-如果您看到从站堆栈检测到 WDOG 错误的次数等于 WDOG 计数器寄存器的值,则可能需要增加主站的默认看门狗超时。 但是、如果您看到从站堆栈正在检测 WDOG 状态错误、而看门狗错误计数器(0x442或0x443)未递增、则这是 PDI 的问题。 尝试将 RSTROBE 增大到56 (560ns 是 ET1100数据表中规定的绝对最长时间)并进行检查。 运行后、尝试递减 RSTROBE 并找到最佳值。
请告诉我它是怎么发生的。 在 PDI 示例中配置的 EMIF 时序/设置用于演示、用户必须提供最终适用于其硬件的功能、因此如果您必须更改设置、这是可以的。
修复后、我们可以讨论读取/写入周期。 我可以根据需要与团队中的其他 EMIF 专家联系。
希望这对您有所帮助。
此致
Santosh Athuru
您好!
感谢你的答复。 如果我将 RSTROBE 增大到56、从器件将始终保持 INI ERR 状态。 当 RSTROBE 为10时、我在 TwinCAT 中读取0x442、该值始终为0。 虽然0x30d (PDI/CRC ERR)始终为0xff、但即使我写入0来对其进行复位、它也会很快返回到0xff。
至于我更改演示的 EMIF 配置、我是说如果我不更改它、则会出现超时错误(预期为0x08并读取0x04、从器件落入 SAFEOP ERR、而不是 OP)、因此我猜 EMIF 配置肯定会有一些错误。 但如何更改它、我不清楚。 谢谢你。
顺便说一下、EMIF 在基于200MHz 的时钟下运行。 即 、ClkCfgRegs.PERCLKDIVSEL.bit.EMIF1CLKDIV = 0x0;
此致
Yanpo、Li
Yanpo、
我们能否首先确保您具有正确的 EMIF 配置、并且可以读取 ET1100寄存器(例如:0x140)以及写入和读取 ET1100的 RAM 位置? 您可以尝试100MHz 的 EMIFCLK 吗?
您的 EEPROM 是否针对8位微控制器异步访问进行了正确配置?
PDI 错误肯定意味着您的 EMIF 配置或用于 EMIF 配置的 GPIO 有问题。 您是否总是遇到此错误计数器问题、或者在您更改 EMIF 配置时出现此问题。 我正在尝试了解您是否在项目中拥有到目前为止没有错误的 PDI 访问权限?
此致
Santosh Athuru
您好!
[引用]至于8位 EMIF、实际上每个读取操作仍然是16位、可能是因为 TI 的基本变量长度是16位。 因此、当我读取一个16位数据时、我必须读取两次同一地址。 下面是一个读取示例。 至于写入操作、每个16位数据我只需要写入一次。 我不确定这是否正常。[/引述]
是的、C28x 是16位处理器。 通过 EMIF 进行读/写操作时、如果外部存储器为8位、那么对于16位访问、EMIF 将把它拆分为2个8位访问并执行读/写操作。 您不必为此进行两次访问。
此致、
Vivek Singh
Yanpo、
[引用 user4435347]\n 我已从 TwinCAT 读取0x140、其值为0x0e09。 我现在还将 emifclk 更改为100MHz。 实际上、如果 TwinCAT 以非直流模式运行、则没有0x1b 错误。 所有 PDO 和 SDO 都能正常工作。 因此、我认为至少在大多数工作时间、EMIF 工作正常。 只有在某些情况下才会失败。
我已经尝试了至少十种不同的配置。 但没有错误、都无法正常工作。 某些配置0x1b 错误大约每1分钟发生一次、某些错误大约每半分钟发生一次。 谢谢。[/引述]
参考上述内容、当读取寄存器0x140时、您是否也尝试写入 DPRAM 位置? 因此、使用此 EMIF 配置时、您没有 PDI 错误。
只有启用 DCX 时出现问题您看到看门狗超时错误? 在本例中、您还会看到 WDOG 计数器递增吗? 您是否排除了任何 TwinCAT 配置问题? 您是否尝试提高从节点的 TwinCAT 的 SM WDOG 超时值?
我希望您排除任何其他可能的错误、并确认从节点(TwinCAT 读取0x1B)正在检测 WDOG 超时、而 WDOG 错误计数器在我们怀疑 EMIF 配置之前不会递增。
在转到"如何在 HAL API 中处理字节与16位字"之前、我们可以解决这个问题吗?
此致
Santosh Athuru
此致
桑托什