27. HPM Ethercat转Can之网关

27.1. 依赖SDK1.10.0

27.2. 概述

本例程使用HPM6E系列芯片的Ethercat通信及Can通信功能,并基于ETG的5001.5000 ethercat转can协议,实现Ethercat通信转can通信功能。

特点:

  1. 基于ETG的5001.5000 ethercat转can协议,协议内容参考《ETG5001_3_V0i1i2_S_D_MDP_Gateways》的5000协议

  2. 支持设置Can参数

  3. 支持触发和循环发送两种模式

  4. 支持整帧或以字节方式发送或接收报文

  5. 支持远程帧 标准帧 远程帧

  6. 支持USB SH 命令行

  7. 支持module slot方式,动态修改PDO映射

27.3. 例程说明

27.3.1. 环境

27.3.1.1. SDK版本

V1.10.0

27.3.1.2. BOARD

HPM6E00EVK

27.3.2. 软件配置

27.3.2.1. A. SSC代码生成

  • 新建SSC项目,选择Gateway2 SSC_new

  • 如果没有Gateway2配置,依次点击Tool->Options->Configurations,并导入software/apps/ecat/gateway_apps_config.xml SSC_config

  • 依次点击Tool->Application->Import,导入software/apps/ecat/gateway_apps.xlsx SSC_import

  • 生成SSC代码,依次点击Project->Create new Slave Files,生成代码,同时生成gateway_apps.xml文件。Source Folder:hpm_apps\apps\gateway_ecat2can\software\apps\ecat\Src
    SSC_create

注:可以直接使用gateway_apps.esp,该文件已经配置好相关参数,可以直接生成代码。

27.3.2.2. B. 生成工程

  • 通过HPM SDK Project Generator生成segger工程 SSC_project

27.3.3. TwinCAT做主机使用说明

  • TwinCAT在OP状态 TwinCat_OP 按照5001.5000协议,RxMessage_1为接收标准can帧,TxMessage_1为发送标准can帧,RxMessage1_1为接收扩展can帧,TxMessage1_1为发送扩展can帧。

  • 发送标准CAN帧,需要写入TxMessage_1,如发送 1 2 3 4 5 6 7 8 标准CAN帧 id=0 TwinCat_Send_Can

  • 接收标准CAN帧,需要读取RxMessage_1 TwinCat_Recv_Can

  • 通过Trigger方式发送 当写入TxMessage_1后,通过主站写0x8000索引的32子索引的bit4为1,代表TriggerMode,bit2每写一次1,即可触发发送。 Trigger_Mode

  • 通过Cycle方式发送 当写入TxMessage_1后,通过主站写0x8000索引的32子索引的bit4为0,代表CycleMode,根据37子索引的值确定循环发送时间,即可循环发送。 Cycle_Mode

  • 设置Can参数 通过主站写0xF800索引的2子索引设置Can波特率 Can_Param 注:设置COE需要先将从设备切换到PREOP状态。 值与波特率对应关系

            switch (ParameterSet0xF800.Baudrate)
            {
                case 0: //1M
                mq_msg.param = 1000000;
                break;
                case 1: //800k
                mq_msg.param = 800000;
                break;
                case 2: //500k
                mq_msg.param = 500000;
                break;
                case 3: //250k
                mq_msg.param = 250000;
                break;
                case 4: //125k
                mq_msg.param = 125000;
                break;
                case 5: //100k
                mq_msg.param = 100000;
                break;
                case 6: //50k
                mq_msg.param = 50000;
                break;
                case 7: //20k
                mq_msg.param = 20000;
                break;
                case 8: //10k
                mq_msg.param = 10000;
                break;
                case 255: //defined in bustiming register
                mq_msg.param = 255;
                break;
                default:
                mq_msg.param = 1000000;
                break;
            }