288388D-EnterCAT调试

1. 调试过程

  1. SSC生成相关文件代码
  2. SSC -》Tool -》EEPROM Programmer烧写EEPROM配置信息(重要)
  3. 将生成的代码放到CCS中运行
  4. 将XML文件放到TwinCAT3指定路径下
  5. 通过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

  1. 调试28388 cm EnterCAT功能基于f2838x_cm_echoback_solution例程
  2. 由于例程需要,将28388的外部晶振改为25 MHZ(改了硬件电路)
  3. 成功调试EC-Engineer与28388的通信测试

2020-6-17

  1. 使用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

关于主机发送测试
  1. 主机发送数据:

    uint32 p = 0x2222;
    ec_SDOwrite(1,0x10f1,0x01,FALSE,4,&p,EC_YIMROUYTCM);
    

    从机接收到的数据:

在这里插入图片描述

关键点:
  1. 主机在发送数据帧的同时,对应的从机不能一直发送数据,这样可能会将邮箱占满。

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
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值