1. 调试过程
- SSC生成相关文件代码
- SSC -》Tool -》EEPROM Programmer烧写EEPROM配置信息(重要)
- 将生成的代码放到CCS中运行
- 将XML文件放到TwinCAT3指定路径下
- 通过TwinCAT3进行调试
COE对象字典初始化
读取超4字节字典数据
TI论坛-TIDM-DELFINO-ETHERCAT: Application of the CiA402 profile
2. 如何更改28388 CIA402 例程中运动模式
例如:csv—>(csv,csp)
2.1 修改TwinCAT3里面的XML
2.2 修改DSP中的代码
3. 如何手动链接设备和虚拟轴变量
也可以参考别的设备的参数配置(如EL9800)
4. CIA402真实位置
其实6196891是包含整数和小数部分的
调试记录
2020-6-16
- 调试28388 cm EnterCAT功能基于f2838x_cm_echoback_solution例程
- 由于例程需要,将28388的外部晶振改为25 MHZ(改了硬件电路)
- 成功调试EC-Engineer与28388的通信测试
2020-6-17
使用TwinCAT进行了写EEPROM操作,但之后,就无法进入OP模式了,shit!
经查明:关键不在EEPROM,而是在于我的xml文件错误,用的不是例程对应的xml
今日份总结:
1. 经调试发现:
- 当处于FREE RUN模式,并且从机进入OP状态时,APPL_OutputMapping()和APPL_InputMapping()会一直被调用。那么此时Master(上位机)和Slave之间相当于开启了数据更新事件触发PDO
2. sTxPDOassign的初始化过程
3. 发现CPU1的例程这个地方return了
//
// Wait for ESCSS memory initialization to complete
//
if(ESCSS_getMemoryInitDoneStatusBlocking(ESC_SS_BASE, memoryTimeOut) !=
ESCSS_API_SUCCESS)
{
return(ESC_HW_INIT_FAIL);
}
4. PDO_InputMapping()出现的位置
2020 -6-24
从机发送自定义EnterCAT数据帧
关于读取
void ECAT_Main(void)
void MBX_CheckAndCopyMailbox(){
HW_EscReadMbxMem()
}
/* if(psRepeatMbx->Data[0] == 0x1111){
if(psRepeatMbx->Data[1] == 0x2222){
if(psRepeatMbx->Data[2] == 0x3333){
{
int i = 0;
}
}
}
}*/
if ( result != 0 )
{
/* Mailbox error response: type 0 (mailbox service protocol) */
pMbx->MbxHeader.Length = 4;
pMbx->MbxHeader.Flags[MBX_OFFS_TYPE] &= ~MBX_MASK_TYPE;
pMbx->Data[0] = SWAPWORD(MBXSERVICE_MBXERRORCMD);
pMbx->Data[1] = SWAPWORD(result);
MBX_MailboxSendReq(pMbx, 0);
}
说明:
关于EnterCAT例程中的相关寄存器可以参考:ethercat_esc_datasheet_sec2_registers_2i9.pdf
目标: 希望通过EnterCAT网络建立两个从机之间的通信,从而控制两个从机进行CANOpen通信模拟。
目前可以通过一个从机发送自定义数据帧,并在抓包工具中截取到。
重点在于另外一个从机是否也能收到数据?
如何测试这个疑问?
一个从机一直发送数据,另一个从机进行仿真查看,看程序中是否能捕获到。由于EnterCAT的数据收发都是硬件自动完成,所以关于此数据是否接收,程序上是否需要做一些改动?可以参考PDO结束部分
关键参数:
aPdOutputData
aPdInputData
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uuFNkIsk-1631600349078)(.\pictures\send发送函数.jpg)]
从机发送自定义EnterCAT数据帧
通过MBX_MailboxSendReq()方法发送的数据帧,最终会被放置到ESC memory中,需要等待EnterCAT主站发送的EnterCAT Datagrams 到来的时候被带走
// // Write data buffer into ESC memory // ESC_writeBlockISR(pData, address, len);
从机发送的数据帧
EC-Engineer对象字典读写操作
例如:对1002进行读操作时,DSP中收到的数据帧
从机发送的数据帧
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yUi2HRtm-1631600349089)(.\pictures\c1c080b632981b24e4ac7c68d21dd23.png)]
关键参数:
u16EscAddrReceiveMbx 0x1000
u16EscAddrSendMbx 0x1018
UINT16 aPdOutputData[(MAX_PD_OUTPUT_SIZE>>1)];
UINT16 aPdInputData[(MAX_PD_INPUT_SIZE>>1)];
PROTO BOOL bReceiveMbxIsLocked; /**< \brief Receive mailbox is locked (MBoxOut, default SM0)*/
PROTO BOOL bSendMbxIsFull; /**< \brief Send mailbox is full (MBoxIn, default SM1)*/
PROTO BOOL bMbxRunning; /**< \brief Mailbox running (At least PreOP state)*/
PROTO BOOL bMbxRepeatToggle; /**< \brief Mailbox repeat toggle*/
PROTO UINT16 u16SendMbxSize; /**< \brief Send mailbox size (default SM1)*/
PROTO UINT16 u16ReceiveMbxSize; /**< \brief Receive mailbox size (default SM0)*/
PROTO UINT16 u16EscAddrReceiveMbx; /**< \brief Receive mailbox address (default SM0)*/
PROTO UINT16 u16EscAddrSendMbx; /**< \brief Send mailbox address (default SM1)*/
PROTO UINT8 u8MbxWriteCounter; /**< \brief Write mailbox counter*/
PROTO UINT8 u8MbxReadCounter; /**< \brief Read mailbox counter*/
PROTO UINT8 u8MailboxSendReqStored; /**< \brief Mailbox send request stored*/
PROTO TMBX MBXMEM * psWriteMbx; /**< \brief Pointer to write mailbox buffer*/
PROTO TMBX MBXMEM * psReadMbx; /**< \brief Pointer to read mailbox buffer*/
PROTO TMBX MBXMEM * psRepeatMbx; /**< \brief Pointer to repeat mailbox buffer*/
PROTO TMBX MBXMEM * psStoreMbx; /**< \brief Pointer to store mailbox buffer*/
PROTO TMBXQUEUE MBXMEM sMbxSendQueue; /**< \brief Send mailbox queue*/
PROTO TMBXQUEUE MBXMEM sMbxReceiveQueue; /**< \brief Receive mailbox queue*/
/** Ethercat registers */
enum
{
ECT_REG_TYPE = 0x0000,
ECT_REG_PORTDES = 0x0007,
ECT_REG_ESCSUP = 0x0008,
ECT_REG_STADR = 0x0010,
ECT_REG_ALIAS = 0x0012,
ECT_REG_DLCTL = 0x0100,
ECT_REG_DLPORT = 0x0101,
ECT_REG_DLALIAS = 0x0103,
ECT_REG_DLSTAT = 0x0110,
ECT_REG_ALCTL = 0x0120,
ECT_REG_ALSTAT = 0x0130,
ECT_REG_ALSTATCODE = 0x0134,
ECT_REG_PDICTL = 0x0140,
ECT_REG_IRQMASK = 0x0200,
ECT_REG_RXERR = 0x0300,
ECT_REG_FRXERR = 0x0308,
ECT_REG_EPUECNT = 0x030C,
ECT_REG_PECNT = 0x030D,
ECT_REG_PECODE = 0x030E,
ECT_REG_LLCNT = 0x0310,
ECT_REG_WDCNT = 0x0442,
ECT_REG_EEPCFG = 0x0500,
ECT_REG_EEPCTL = 0x0502,
ECT_REG_EEPSTAT = 0x0502,
ECT_REG_EEPADR = 0x0504,
ECT_REG_EEPDAT = 0x0508,
ECT_REG_FMMU0 = 0x0600,
ECT_REG_FMMU1 = ECT_REG_FMMU0 + 0x10,
ECT_REG_FMMU2 = ECT_REG_FMMU1 + 0x10,
ECT_REG_FMMU3 = ECT_REG_FMMU2 + 0x10,
ECT_REG_SM0 = 0x0800,
ECT_REG_SM1 = ECT_REG_SM0 + 0x08,
ECT_REG_SM2 = ECT_REG_SM1 + 0x08,
ECT_REG_SM3 = ECT_REG_SM2 + 0x08,
ECT_REG_SM0STAT = ECT_REG_SM0 + 0x05,
ECT_REG_SM1STAT = ECT_REG_SM1 + 0x05,
ECT_REG_SM1ACT = ECT_REG_SM1 + 0x06,
ECT_REG_SM1CONTR = ECT_REG_SM1 + 0x07,
ECT_REG_DCTIME0 = 0x0900,
ECT_REG_DCTIME1 = 0x0904,
ECT_REG_DCTIME2 = 0x0908,
ECT_REG_DCTIME3 = 0x090C,
ECT_REG_DCSYSTIME = 0x0910,
ECT_REG_DCSOF = 0x0918,
ECT_REG_DCSYSOFFSET = 0x0920,
ECT_REG_DCSYSDELAY = 0x0928,
ECT_REG_DCSYSDIFF = 0x092C,
ECT_REG_DCSPEEDCNT = 0x0930,
ECT_REG_DCTIMEFILT = 0x0934,
ECT_REG_DCCUC = 0x0980,
ECT_REG_DCSYNCACT = 0x0981,
ECT_REG_DCSTART0 = 0x0990,
ECT_REG_DCCYCLE0 = 0x09A0,
ECT_REG_DCCYCLE1 = 0x09A4
};
2020-7-7
关于主机发送测试
主机发送数据:
uint32 p = 0x2222; ec_SDOwrite(1,0x10f1,0x01,FALSE,4,&p,EC_YIMROUYTCM);
从机接收到的数据:
关键点:
- 主机在发送数据帧的同时,对应的从机不能一直发送数据,这样可能会将邮箱占满。
EnterCAT Master发送SDO Write测试
SDO_Write补充:
从机接收的数据帧
SDO_Read测试
注意:
在读取的同时,不能有写操作(从机不能一直发送数据),否则读取会不成功!!!!!!
ec_FPRD数据读取测试
从机数据发送:
#if SLAVE2_ENABLE if (MBX_MailboxSendReq((TMBX MBXMEM *) pMbx2, COE_SERVICE) != 0 && isSend == false) { /* we store the CoE mailbox service to send it later (in COE_ContinueInd) when the mailbox is read */ pCoeSendStored = (TMBX MBXMEM *) pMbx2; isSend = true; }#endif