Part Number:TMS320F28388D
aPdOutputData数组用来存储主站下发的数据,EtherCAT的数据是小端模式的:
以我现在使用的CSV/CSP模式为例,RxPDO通道绑定关系为:
index6040是状态字对象索引,数据位宽16bit;index607A是TargetPosition对象索引,数据位宽32bit;index60FF是TargetVelocity对象索引,数据位宽32bit;index6060是模式对象索引,数据位宽8bit
按照小端模式,接收到的数据在内存中的顺序应该为:
Byte1 状态字【0】
Byte2 状态字【1】
Byte3 TargetPosition【0】
Byte4 TargetPosition【1】
Byte5 TargetPosition【2】
Byte6 TargetPosition【3】
Byte7 TargetPosition【0】
Byte8 TargetPosition【1】
Byte9 TargetPosition【2】
Byte10 TargetPosition【3】
Byte11 模式 【0】
APPL_OutputMapping函数处理数据时也确实调用了SWAPWORD、SWAPDWORD函数:
SWAPWORD:(函数定义是从网上找的)
SWAPDWORD:(函数定义是从网上找的)
经过SWAP函数的处理,相应的对象可以得到正确的数值。
但是在调试过程中,我看到了如下所示的现象:
我设定的TargetPosition数值是500000,即0x0007 A120
问题1.发现在调用SWAPDWORD函数前,TargetPosition在内存中的顺序已经被排好,这是为什么;
问题2.这个调试界面里,没有使用SWAPDWORD函数,发现TargetPosition对象也能得到500000,即0x0007 A120数值,这是为什么呢?
我理解的经过swap函数处理后,数据在内存中的顺序应该为:
Byte1 状态字【1】
Byte2 状态字【0】
Byte3 TargetPosition【3】
Byte4 TargetPosition【2】
Byte5 TargetPosition【1】
Byte6 TargetPosition【0】
Byte7 TargetPosition【3】
Byte8 TargetPosition【2】
Byte9 TargetPosition【1】
Byte10 TargetPosition【0】
Byte11 模式 【0】
如果将这些数据以Uint16的形式通过进程间通讯传递给C28,我理解的顺序是这样的:
Word1 状态字【1】状态字【0】
Word2 TargetPosition【3】TargetPosition【2】—–> 0x0007
Word3 TargetPosition【1】TargetPosition【0】—–> 0xA120
Word4 TargetPosition【3】TargetPosition【2】
Word5 TargetPosition【1】TargetPosition【0】
但是从调试结果看,C28侧却是这样的数据顺序:
即
Word2 TargetPosition【3】TargetPosition【2】—–> 0xA120
Word3 TargetPosition【1】TargetPosition【0】—–> 0x0007
问题3. 请问这是为什么
Susan Ren:
感谢您对TI产品的关注!为更加有效地解决您的问题,由于问题比较复杂,我需要询问更了解这款芯片的TI资深工程师,再为您解答,一旦得到回复会立即回复给您。
,
user78960159:
好 谢谢
,
Susan Ren:
我不能很清楚地查看您的图片,所以我不能理解所有的细节。我认为以下的一些事情会让事情明了化。
请标记SWAPWORD宏在ecatslv.h这个文件里只是为了返回同样的值。它实际上似乎并没有做任何事情,见下文:
#ifndef SWAPWORD#defineSWAPWORD(x)(x) /**< \brief Macro to swap a WORD*/ #endif我不能确定这个代码以这种方式被写入。记住这个SW桩和样例代码是由Beckhoff被写入的,不是TI,所以你可以去问他们如果你想进一步了解的话。