Thread 中讨论的其他器件: controlSUITE
工具与软件:
你好。 我无法在 TMS320F28379D 上正确执行 FOE。 我将使用 SSC v5.11生成代码。 我已经将 F28388在 v5.11中生成的代码与 v5.12中生成的代码进行了比较、现在似乎也存在该问题。
在生成的代码中、ecatfoe.h 中使用了此结构:
/** \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;
/**
* \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;
/** \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
Busy; /**< \brief Busy variable*/
}MBX_STRUCT_PACKED_END
Cmd; /**< \brief Command field*/
}MBX_STRUCT_PACKED_END
TFOEHEADER;此 TMBXHEADER 大小为6个字节(48位)。 此标头填充为32位对齐。 这会将 TFOEHEADER (操作码)的第一个成员推到错误的地址。 从而导致所有成员的偏移不正确。
这是我在调试中看到的:

0x0002是显示在内存浏览器中的正确 FoeHeader.opcode。 但是、结构将其显示为 0x1836。
我缺少什么吗? 我想这是在工作中完成的吗?