Renesas 官方 EtherCAT CiA402 示例配置 (RZN2_EtherCAT_CiA402_CR52)
来源: Renesas 官方 EtherCAT CiA402 示例工程(RZN2 评估套件)
目标平台: RZN2 (Cortex-R52)
工具: SSC Tool (Slave Stack Code Tool)
整理日期: 2026-06-13
目录
- SlaveInformation(从站信息)
- Generic(通用配置)
- Hardware(硬件配置)
- EtherCAT State Machine(状态机配置)
- Synchronisation(同步配置)
- Application(应用层配置)
- ProcessData(过程数据配置)
- Mailbox(邮箱配置)
- 附录A:ESC 内存布局
- 附录B:ESC_16BIT_ACCESS 与 ESC_32BIT_ACCESS 配置分析
1. SlaveInformation(从站信息)
| 参数名称 | 值 | 说明 |
|---|---|---|
| VENDOR_ID | 0x00000766 | 厂商ID(Renesas Electronics Corp.) |
| VENDOR_NAME | Renesas Electronics Corp. | 厂商名称 |
| VENDOR_IMAGE | 424DE600... | 厂商Logo位图数据 |
| GROUP_NAME | Renesas RZ/N2 Group | 设备组名称 |
| GROUP_IMAGE | 424D0802... | 设备组Logo位图数据 |
| DEVICE_IMAGE | 424D0802... | 设备Logo位图数据 |
| PRODUCT_CODE | 0x00000914 | 产品代码 |
| REVISION_NUMBER | 0x00000300 | 版本号(v3.00) |
| SERIAL_NUMBER | 0x00000000 | 序列号 |
| DEVICE_PROFILE_TYPE | 0x00000192 | 设备协议类型(CiA402 伺服驱动) |
| DEVICE_NAME | Renesas EtherCAT RZN2 CiA402 | 设备名称 |
| DEVICE_HW_VERSION | 1.0 | 硬件版本 |
| DEVICE_SW_VERSION | 4.00 | 软件版本 |
2. Generic(通用配置)
| 参数名称 | 值 | 说明 |
|---|---|---|
| SYSTEM_HEADER_FILE | (空) | 系统头文件路径 |
| EXPLICIT_DEVICE_ID | 1 | 显式设备ID支持 |
| ESC_SM_WD_SUPPORTED | 1 | ESC状态机看门狗支持 |
| STATIC_OBJECT_DIC | 0 | 动态对象字典 |
| ESC_EEPROM_ACCESS_SUPPORT | 1 | EEPROM访问支持 |
3. Hardware(硬件配置)
| 参数名称 | 值 | 说明 |
|---|---|---|
| HW_ACCESS_FILE | #include "renesashw.h" | Renesas硬件访问层头文件 |
| MEMORY_UNIT_16BIT | 0 | 非16位存储单元 |
| ESC_16BIT_ACCESS | 0 | ESC 16位寄存器访问禁用 |
| ESC_32BIT_ACCESS | 0 | ESC 32位寄存器访问禁用 |
| MBX_16BIT_ACCESS | 0 | 邮箱16位访问禁用 |
| UC_SET_ECAT_LED | 1 | MCU控制EtherCAT RUN/ERR LED |
| ESC_SUPPORT_ECAT_LED | 0 | ESC硬件不直接驱动LED |
| ESC_EEPROM_EMULATION | 0 | 不使用EEPROM仿真 |
| CREATE_EEPROM_CONTENT | 0 | 不生成EEPROM内容文件 |
| ESC_EEPROM_SIZE | 0x800 | EEPROM容量2KB |
注意: 该Hardware节点显示的是精简参数列表(Renesas定制版SSC Tool),与标准SSC Tool的完整参数列表不同。其中
ESC_16BIT_ACCESS和ESC_32BIT_ACCESS均为 0 的原因详见 附录B。
4. EtherCAT State Machine(状态机配置)
| 参数名称 | 值 | 说明 |
|---|---|---|
| BOOTSTRAPMODE_SUPPORTED | 0 | 不支持Bootstrap模式(无FoE固件更新) |
| OP_PD_REQUIRED | 1 | OP状态需要有效过程数据 |
| PREOPTIMEOUT | 0x7D0 | Pre-OP超时 2000ms |
| SAFEOP2OPTIMEOUT | 0x2328 | Safe-OP到OP超时 9000ms |
| CHECK_SM_PARAM_ALIGNMENT | 0 | 不检查SM参数对齐 |
5. Synchronisation(同步配置)
| 参数名称 | 值 | 说明 |
|---|---|---|
| AL_EVENT_ENABLED | 1 | AL事件中断使能 |
| DC_SUPPORTED | 1 | 分布式时钟支持 |
| ECAT_TIMER_INT | 0 | 无EtherCAT定时器中断 |
| MIN_PD_CYCLE_TIME | 0x7A120 | 最小PDO周期 500μs |
| MAX_PD_CYCLE_TIME | 0xC3500000 | 最大PDO周期 ~3.28s |
| PD_OUTPUT_DELAY_TIME | 0x0 | 输出延迟 0ns |
| PD_OUTPUT_CALC_AND_COPY_TIME | 0x0 | 输出计算拷贝时间 0ns |
| PD_INPUT_CALC_AND_COPY_TIME | 0x0 | 输入计算拷贝时间 0ns |
| PD_INPUT_DELAY_TIME | 0x0 | 输入延迟 0ns |
6. Application(应用层配置)
| 参数名称 | 值 | 说明 |
|---|---|---|
| TEST_APPLICATION_REDUCED_MEMORY | (空/未显示) | 减少测试应用内存占用 |
| CiA402_SAMPLE_APPLICATION | 1 | 启用CiA402示例应用 |
| SAMPLE_APPLICATION | 0 | 不启用标准示例应用 |
| SAMPLE_APPLICATION_INTERFACE | 0 | 不启用示例应用接口 |
| BOOTLOADER_SAMPLE | 0 | 不启用Bootloader示例 |
| APPLICATION_FILE | #include "sampleappl.h" | 应用层头文件 |
| USE_DEFAULT_MAIN | 0 | 不使用默认测试主函数 |
7. ProcessData(过程数据配置)
| 参数名称 | 值 | 说明 |
|---|---|---|
| MIN_PD_WRITE_ADDRESS | 0x1000 | 输出数据最小地址(SM2) |
| DEF_PD_WRITE_ADDRESS | 0x1200 | 输出数据默认地址(SM2) |
| MAX_PD_WRITE_ADDRESS | 0x2FFF | 输出数据最大地址 |
| MIN_PD_READ_ADDRESS | 0x1000 | 输入数据最小地址(SM3) |
| DEF_PD_READ_ADDRESS | 0x1500 | 输入数据默认地址(SM3) |
| MAX_PD_READ_ADDRESS | 0x2FFF | 输入数据最大地址 |
| MAX_PD_INPUT_SIZE | 0x0100 | 最大输入数据 256字节 |
| MAX_PD_OUTPUT_SIZE | 0x0100 | 最大输出数据 256字节 |
8. Mailbox(邮箱配置)
8.1 协议支持
| 参数名称 | 值 | 说明 |
|---|---|---|
| MAILBOX_QUEUE | 1 | 邮箱队列支持 |
| AOE_SUPPORTED | 0 | 不支持ADS over EtherCAT |
| COE_SUPPORTED | 1 | 支持CANopen over EtherCAT |
| COMPLETE_ACCESS_SUPPORTED | 1 | 支持SDO完全访问 |
| SEGMENTED_SDO_SUPPORTED | 1 | 支持分段SDO传输 |
| SDO_RES_INTERFACE | 1 | SDO响应接口 |
| BACKUP_PARAMETER_SUPPORTED | 0 | 不支持备份参数 |
| STORE_BACKUP_PARAMETER_IMMEDIATELY | 0 | 不立即存储备份参数 |
| DIAGNOSIS_SUPPORTED | 0 | 不支持诊断消息 |
| MAX_DIAG_MSG | 0x14 | 最大诊断消息20条 |
| EMERGENCY_SUPPORTED | 0 | 不支持紧急消息 |
| MAX_EMERGENCIES | 0x1 | 最大紧急消息1条 |
| VOE_SUPPORTED | 0 | 不支持Vendor over EtherCAT |
| SOE_SUPPORTED | 0 | 不支持Servo over EtherCAT |
| EOE_SUPPORTED | 0 | 不支持Ethernet over EtherCAT |
| STATIC_ETHERNET_BUFFER | 0 | 非静态以太网缓冲区 |
| FOE_SUPPORTED | 0 | 不支持File over EtherCAT |
8.2 缓冲区配置
| 参数名称 | 值 | 说明 |
|---|---|---|
| DEF_MBX_SIZE | 0x0100 | 默认邮箱大小 256字节 |
| MAX_MBX_SIZE | 0x0100 | 最大邮箱大小 256字节 |
| MIN_MBX_WRITE_ADDRESS | 0x1000 | 邮箱输出最小地址(SM0) |
| DEF_MBX_WRITE_ADDRESS | 0x1000 | 邮箱输出默认地址(SM0) |
| MAX_MBX_WRITE_ADDRESS | 0x2FFF | 邮箱输出最大地址 |
| MIN_MBX_READ_ADDRESS | 0x1000 | 邮箱输入最小地址(SM1) |
| DEF_MBX_READ_ADDRESS | 0x1100 | 邮箱输入默认地址(SM1) |
| MAX_MBX_READ_ADDRESS | 0x2FFF | 邮箱输入最大地址 |
附录A:ESC 内存布局
0x1000 ~ 0x10FF SM0 邮箱输出 (Master→Slave) 256字节
0x1100 ~ 0x11FF SM1 邮箱输入 (Slave→Master) 256字节
0x1200 ~ ... SM2 过程数据输出 (PDO Output) 默认起始
0x1500 ~ ... SM3 过程数据输入 (PDO Input) 默认起始
附录B:ESC_16BIT_ACCESS 与 ESC_32BIT_ACCESS 配置分析
B.1 问题的提出
在 3. Hardware(硬件配置) 中,ESC_16BIT_ACCESS 和 ESC_32BIT_ACCESS 都配置为 0,即禁用了 16 位和 32 位的 ESC 寄存器访问。直觉上,32 位访问应该比 8 位逐字节访问更高效,为什么 Renesas 官方示例要禁用它们?
B.2 SSC 配置参数的作用
ESC_16BIT_ACCESS 和 ESC_32BIT_ACCESS 是 Beckhoff SSC Tool 生成的配置参数,影响 SSC 核心层 如何访问 ESC DPRAM:
| 参数 | 作用 |
|---|---|
ESC_16BIT_ACCESS = 1 | SSC 核心层以 16 位宽度直接访问 ESC 寄存器/DPRAM |
ESC_32BIT_ACCESS = 1 | SSC 核心层以 32 位宽度直接访问 ESC 寄存器/DPRAM |
| 两者都为 0 | SSC 核心层仅使用字节级 HW_EscRead()/HW_EscWrite() 进行所有数据传输 |
当两者都为 0 时,SSC 的通用读/写宏最终展开为 ESCMEMCPY,即标准 memcpy:
HW_EscRead(pData, Address, Len) → memcpy(pData, &pEsc[Address], Len)
HW_EscWrite(pData, Address, Len) → memcpy(&pEsc[Address], pData, Len)
B.3 Renesas 硬件访问层的设计
关键文件:renesashw.h
Renesas 在 renesashw.h 中设计了两组互相独立的宏:
第一组:通用访问宏(供 SSC 核心层调用)
#define ESC_MEM_ADDR UINT8 // 以字节为最小寻址单元
#define ESC_MEM_SHIFT 0 // 地址偏移 = 地址本身(无需右移)
// 读:memcpy(pData, &pEsc[Address], Len)
#define HW_EscRead(pData, Address, Len) ESCMEMCPY(...)
// 写:memcpy(&pEsc[Address], pData, Len)
#define HW_EscWrite(pData, Address, Len) ESCMEMCPY(...)
当 ESC_16BIT_ACCESS = 0 且 ESC_32BIT_ACCESS = 0 时,SSC 核心层的所有数据路径都走这两个宏 → 最终是 memcpy。
第二组:专用寄存器访问宏(供特定场景直接调用)
// 16 位读:将 pEsc 强制转为 UINT16*,地址除以 2(16 位对齐)
#define HW_EscReadWord(WordValue, Address) \
((WordValue) = (((UINT16 *) pEsc)[((Address) >> 1)]))
// 32 位读:将 pEsc 强制转为 UINT32*,地址除以 4(32 位对齐)
#define HW_EscReadDWord(DWordValue, Address) \
((DWordValue) = (UINT32) (((UINT32 *) pEsc)[(Address >> 2)]))
// 对应的 16/32 位写宏同理
#define HW_EscWriteWord(WordValue, Address) ...
#define HW_EscWriteDWord(DWordValue, Address) ...
// 直接读取 AL Event 寄存器(16 位对齐寄存器,地址偏移已硬编码)
#define HW_GetALEventRegister() \
((((UINT16 ESCMEM *) pEsc)[((ESC_AL_EVENT_OFFSET) >> 1)]))
关键结论: 这两组宏完全独立。即使
ESC_16BIT_ACCESS = 0,HW_EscReadWord()仍然可以正常工作 —— 因为它是直接在renesashw.h中定义的,不归 SSC 代码生成器管。
B.4 RZ/N2 的 ESC 硬件连接方式
在 rm_ethercat_ssc_port.c:720-728 中:
UINT16 HW_Init(void)
{
pEsc = (MEM_ADDR ESCMEM *) p_instance_ctrl->p_reg;
// ^^^^^^^^^^^^^^^^^^
// p_reg = (R_ESC_Type *) R_ESC_BASE — ESC 硬件寄存器基地址(直接内存映射)
return 0;
}
RZ/N2 的 ESC(EtherCAT Slave Controller)集成在芯片内部,ESC DPRAM 直接映射到 MCU 的物理地址空间。这意味着:
pEsc就是一个普通的 C 指针,指向 ESC DPRAM 在内存中的起始位置memcpy直接走 MCU 内部总线访问 ESC DPRAM,无需任何 SPI/并行总线中转- 与通过 SPI 连接的外部 ESC 芯片完全不同,不存在总线宽度限制
B.5 两者均配置为 0 的原因
| 层面 | 解释 |
|---|---|
| 安全性 | 字节级 memcpy 无对齐要求,在 Cortex-R52 上绝不会产生 alignment fault;如果启用 32 位访问,SSC 核心层可能对非 4 字节对齐的 ESC 地址发起 32 位读/写,导致硬件异常 |
| 兼容性 | 不是所有 ESC 寄存器地址都是 16 位或 32 位对齐的。ESC DPRAM 本身就是字节寻址,使用 memcpy 无需关心对齐 |
| 架构特点 | RZ/N2 的 ESC 通过内部总线 memory-mapped,memcpy 性能已足够;不像某些外部 ESC 需要通过 SPI 逐字节读取,此时才需要更宽的访问来弥补总线开销 |
| 职责分离 | 通用数据路径走 HW_EscRead/HW_EscWrite → memcpy(安全、兼容);需要高效读取特定对齐寄存器时,单独使用 HW_EscReadWord / HW_EscReadDWord(如 AL Event 寄存器始终是 16 位对齐的) |
B.6 反直觉的一点
表面上看,配置 ESC_32BIT_ACCESS = 1 似乎能提升吞吐量。但在 RZ/N2 平台上:
- SSC 核心层不知道具体哪些 ESC 地址是对齐的,统一使用 32 位访问有风险
ESC_16BIT_ACCESS和ESC_32BIT_ACCESS两个标志互相排斥,不能同时启用 —— 当 ESC 寄存器有 8/16/32 位混合对齐时,单一宽度无法覆盖所有场景- 实际性能瓶颈不在 DPRAM 的读写宽度,而在 EtherCAT 总线的帧周期(通常 500μs ~ 1ms)
Renesas 选择 「通用路径用 memcpy 保安全,热路径用专用宏提效率」 的策略,两个 SSC 标志全部置 0 是最合理的工程决策。


343

被折叠的 条评论
为什么被折叠?



