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.

[参考译文] TMS320F28379D:EtherCAT FOE 解决方案字节对齐问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1437459/tms320f28379d-ethercat-foe-solution-byte-alignment-issue

器件型号:TMS320F28379D
Thread 中讨论的其他器件: controlSUITE

工具与软件:

你好。 我无法在  TMS320F28379D 上正确执行 FOE。 我将使用 SSC v5.11生成代码。 我已经将 F28388在 v5.11中生成的代码与 v5.12中生成的代码进行了比较、现在似乎也存在该问题。

在生成的代码中、ecatfoe.h 中使用了此结构:

Fullscreen
1
2
3
4
5
6
7
8
/** \brief Complete FoE datagram*/
typedef struct MBX_STRUCT_PACKED_START
{
TMBXHEADER MbxHeader; /**< \brief Mailbox header*/
TFOEHEADER FoeHeader; /**< \brief FoE header*/
UINT16 Data[((MAX_MBX_DATA_SIZE)-(FOE_HEADER_SIZE)) >> 1]; /**< \brief FoE Data buffer*/
}MBX_STRUCT_PACKED_END
TFOEMBX;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

其中  
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* \brief Mailbox header
*/
typedef struct MBX_STRUCT_PACKED_START
{
UINT16 Length; /**< \brief Length*/
UINT16 Address; /**< \brief Address*/
UINT16 Flags[1]; /**< \brief Flags*/
#define MBX_OFFS_TYPE 0 /**< \brief Protocol type offset*/
#define MBX_MASK_TYPE 0x0F00 /**< \brief Protocol type mask*/
#define MBX_SHIFT_TYPE 8 /**< \brief Protocol type shift*/
#define MBX_OFFS_COUNTER 0 /**< \brief Protocol counter offset*/
#define MBX_MASK_COUNTER 0xF000 /**< \brief Protocol counter mask*/
#define MBX_SHIFT_COUNTER 12 /**< \brief Protocol counter shift*/
} MBX_STRUCT_PACKED_END TMBXHEADER;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/** \brief FoE header*/
typedef struct MBX_STRUCT_PACKED_START
{
UINT16 OpCode; /**< \brief OpCode
*
* 1 : RRQ<br>
* 2 : WRQ<br>
* 3 : DATA<br>
* 4 : ACK<br>
* 5 : ERR<br>
* 6 : BUSY*/
union MBX_STRUCT_PACKED_START
{
UINT32 Password; /**< \brief Password (used in Read request and Write request). 0 if unknown*/
UINT32 PacketNo; /**< \brief Packet number (used in DATA and ACK datagram)*/
UINT32 ErrorCode; /**< \brief Error code (used in ERR datagram)*/
struct MBX_STRUCT_PACKED_START
{
UINT16 Done; /**< \brief Done indication (used in BUSY datagram)*/
UINT16 Entire; /**< \brief Entire indication (used in BUSY datagram)*/
}MBX_STRUCT_PACKED_END
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

此 TMBXHEADER 大小为6个字节(48位)。 此标头填充为32位对齐。 这会将 TFOEHEADER (操作码)的第一个成员推到错误的地址。 从而导致所有成员的偏移不正确。

这是我在调试中看到的:

0x0002是显示在内存浏览器中的正确 FoeHeader.opcode。 但是、结构将其显示为 0x1836。

我缺少什么吗? 我想这是在工作中完成的吗?  

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

    您好!

    我们为 F2838x 器件提供了 ECAT + foe 软件示例、但不为 F2837x 器件提供该示例。  硬件方面、您是将 ET1100 器件与 f2837x 或其他组件配合使用吗?

    此致!

    Kevin

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

    尊敬的 Kevin:

    感谢您的响应。 是的、让我澄清一下。 我将  F2837x 器件与 ET1100 IC 配合使用。

    我跟着指南在  controlSUITE\development_kits\TMDSECATCNTD379D_V1.0\TMDSECATCNCD379D_EtherCAT_EtherCAT Solution_Ref 文件夹以在 SSC v5.11中启用 C28x 项目。 然后、我启用了相关的自举和 FOE 标志。 此代码就是我所执行的代码。 您可以看到、它无法  与 foe 正确对齐。

    我提到  F2838x 器件是因为在该平台的示例之后、我在代码上进行了差异。 就 foe 的工作方式而言,这种差异看起来几乎相同。 由于这两个微控制器都属于 C28x 系列、不允许进行字节打包、因此我假设他们会有这个同样的问题。  

    我的要点是、我无法使 F2837x 正常工作。 我查看 F2838x 后发现、由于它是同一系列的 CPU、因此它应该出现同样的问题。 现在、我在这里对我的无法正常工作的原因以及 F2838x 如何工作感到困惑。  

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

    我一直在深入探究这一点以确定如何解决它。 由于对齐、有关 foe 长度的大量比较没有意义、即主器件提供的长度不正确、因为 正在进行的比较包括填充 (FOE_HEADER_SIZE)。 发送方式也是发送带填充的 struct raw。 我假设这会导致偏移。。。  

    是否有任何方法可以就此问题与他人交谈、以 更好地了解 您打算支持的内容?  

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

    我已经能够按照以下配置正确发送 foe 事务:  

    我将 在 SSC v5.12中使用为 F2838x 生成的代码。 我正在使用 TMDSECATCNCD379D_EtherCAT_HAL 项目中的 Solution_Ref 文件。  

    虽然我看到一些新的复制函数可能有所帮助、但看起来不会使用这些函数。 我不知道为什么这是工作的,但它是...