HPM(先辑) ESC相关配置
原理图


使用官方HPM Pinmux Tool工具,进入ENET_PHY->ESC->勾选ENET_PHY
地址: HPM Pinmux Tool
生成代码如下:
c
void init_pins(void)
{
/* =========================================================================
* 1. ESC0 SMI 管理总线 (MDC / MDIO)
* ========================================================================= */
HPM_IOC->PAD[IOC_PAD_PA30].FUNC_CTL = IOC_PA30_FUNC_CTL_ESC0_MDIO;
HPM_IOC->PAD[IOC_PAD_PA31].FUNC_CTL = IOC_PA31_FUNC_CTL_ESC0_MDC;
/* =========================================================================
* 2. ESC0 硬件控制 / LED 指示灯输出
* ========================================================================= */
HPM_IOC->PAD[IOC_PAD_PA25].FUNC_CTL = IOC_PA25_FUNC_CTL_ESC0_CTR_0; /* ECAT_PHY1_LED1 */
HPM_IOC->PAD[IOC_PAD_PA28].FUNC_CTL = IOC_PA28_FUNC_CTL_ESC0_CTR_1; /* ECAT_PHY0_LED1 */
/* =========================================================================
* 3. 内部 EPHY 模拟接口 (模拟输入/输出,设为 ANALOG_MASK 由物理层接管)
* ========================================================================= */
/* PHY1 物理层管脚 */
HPM_IOC->PAD[IOC_PAD_PA16].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_RXN */
HPM_IOC->PAD[IOC_PAD_PA17].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_RXP */
HPM_IOC->PAD[IOC_PAD_PA18].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_TXN */
HPM_IOC->PAD[IOC_PAD_PA19].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_TXP */
HPM_IOC->PAD[IOC_PAD_PA24].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_RB 偏置电阻 */
HPM_IOC->PAD[IOC_PAD_PA26].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_LED0 (硬件直驱) */
/* PHY0 物理层管脚 */
HPM_IOC->PAD[IOC_PAD_PA20].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_RXN */
HPM_IOC->PAD[IOC_PAD_PA21].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_RXP */
HPM_IOC->PAD[IOC_PAD_PA22].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_TXN */
HPM_IOC->PAD[IOC_PAD_PA23].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_TXP */
HPM_IOC->PAD[IOC_PAD_PA27].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_RB 偏置电阻 */
HPM_IOC->PAD[IOC_PAD_PA29].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_LED0 (硬件直驱) */
/* =========================================================================
* 4. 芯片内部 MAC <-> EPHY 虚拟互联总线: Port 0 (PV 虚拟引脚组)
* ========================================================================= */
HPM_IOC->PAD[IOC_PAD_PV00].FUNC_CTL = IOC_PV00_FUNC_CTL_ESC0_P0_RXDV;
HPM_IOC->PAD[IOC_PAD_PV01].FUNC_CTL = IOC_PV01_FUNC_CTL_ESC0_P0_RXD_0;
HPM_IOC->PAD[IOC_PAD_PV02].FUNC_CTL = IOC_PV02_FUNC_CTL_ESC0_P0_RXD_1;
HPM_IOC->PAD[IOC_PAD_PV03].FUNC_CTL = IOC_PV03_FUNC_CTL_ESC0_P0_RXD_2;
HPM_IOC->PAD[IOC_PAD_PV04].FUNC_CTL = IOC_PV04_FUNC_CTL_ESC0_P0_RXD_3;
HPM_IOC->PAD[IOC_PAD_PV05].FUNC_CTL = IOC_PV05_FUNC_CTL_ESC0_P0_RXCK;
HPM_IOC->PAD[IOC_PAD_PV06].FUNC_CTL = IOC_PV06_FUNC_CTL_ESC0_P0_TXCK;
HPM_IOC->PAD[IOC_PAD_PV07].FUNC_CTL = IOC_PV07_FUNC_CTL_ESC0_P0_TXD_0;
HPM_IOC->PAD[IOC_PAD_PV08].FUNC_CTL = IOC_PV08_FUNC_CTL_ESC0_P0_TXD_1;
HPM_IOC->PAD[IOC_PAD_PV09].FUNC_CTL = IOC_PV09_FUNC_CTL_ESC0_P0_TXD_2;
HPM_IOC->PAD[IOC_PAD_PV10].FUNC_CTL = IOC_PV10_FUNC_CTL_ESC0_P0_TXD_3;
HPM_IOC->PAD[IOC_PAD_PV11].FUNC_CTL = IOC_PV11_FUNC_CTL_ESC0_P0_TXEN;
HPM_IOC->PAD[IOC_PAD_PV12].FUNC_CTL = IOC_PV12_FUNC_CTL_GPIO_V_12;
HPM_IOC->PAD[IOC_PAD_PV15].FUNC_CTL = IOC_PV15_FUNC_CTL_ESC0_P0_RXER;
/* =========================================================================
* 5. 芯片内部 MAC <-> EPHY 虚拟互联总线: Port 1 (PW 虚拟引脚组)
* ========================================================================= */
HPM_IOC->PAD[IOC_PAD_PW00].FUNC_CTL = IOC_PW00_FUNC_CTL_ESC0_P1_RXDV;
HPM_IOC->PAD[IOC_PAD_PW01].FUNC_CTL = IOC_PW01_FUNC_CTL_ESC0_P1_RXD_0;
HPM_IOC->PAD[IOC_PAD_PW02].FUNC_CTL = IOC_PW02_FUNC_CTL_ESC0_P1_RXD_1;
HPM_IOC->PAD[IOC_PAD_PW03].FUNC_CTL = IOC_PW03_FUNC_CTL_ESC0_P1_RXD_2;
HPM_IOC->PAD[IOC_PAD_PW04].FUNC_CTL = IOC_PW04_FUNC_CTL_ESC0_P1_RXD_3;
HPM_IOC->PAD[IOC_PAD_PW05].FUNC_CTL = IOC_PW05_FUNC_CTL_ESC0_P1_RXCK;
HPM_IOC->PAD[IOC_PAD_PW06].FUNC_CTL = IOC_PW06_FUNC_CTL_ESC0_P1_TXCK;
HPM_IOC->PAD[IOC_PAD_PW07].FUNC_CTL = IOC_PW07_FUNC_CTL_ESC0_P1_TXD_0;
HPM_IOC->PAD[IOC_PAD_PW08].FUNC_CTL = IOC_PW08_FUNC_CTL_ESC0_P1_TXD_1;
HPM_IOC->PAD[IOC_PAD_PW09].FUNC_CTL = IOC_PW09_FUNC_CTL_ESC0_P1_TXD_2;
HPM_IOC->PAD[IOC_PAD_PW10].FUNC_CTL = IOC_PW10_FUNC_CTL_ESC0_P1_TXD_3;
HPM_IOC->PAD[IOC_PAD_PW11].FUNC_CTL = IOC_PW11_FUNC_CTL_ESC0_P1_TXEN;
HPM_IOC->PAD[IOC_PAD_PW12].FUNC_CTL = IOC_PW12_FUNC_CTL_GPIO_W_12;
HPM_IOC->PAD[IOC_PAD_PW15].FUNC_CTL = IOC_PW15_FUNC_CTL_ESC0_P1_RXER;
HPM_IOC->PAD[IOC_PAD_PW20].FUNC_CTL = IOC_PW20_FUNC_CTL_ESC0_REFCK;
HPM_IOC->PAD[IOC_PAD_PW21].FUNC_CTL = IOC_PW21_FUNC_CTL_ESC0_REFCK;
}
这段生成的代码整体上符合 HPM5E3Y 启用内置 EPHY 的路由逻辑,但有两处细节需要根据你的原理图进行手动调整。(可以不修改)
内置虚拟引脚与 FIXME 注释
● PVxx 与 PWxx 引脚:这是芯片内部 MAC(ESC0)与内置 EPHY 通信的虚拟数字走线。工具自动将 RX/TX 等信号映射到这些内部引脚上,属于正常且必要的配置,直接保留即可。
● FIXME (PV12 / PW12):这通常对应内置 PHY 的 Link/Interrupt 状态引脚。SDK 底层的 EPHY 驱动或 EtherCAT 协议栈会自行处理内部信号,可以直接忽略此警告注释,无需额外编写 GPIOM 代码。
模拟管脚 (ANALOG_MASK) 状态
● 正确的模拟引脚:代码将 PA16~PA23(网口差分信号)和 PA24、PA27(偏置电阻 RB)配置为 ANALOG_MASK 是完全正确的,这会让引脚交由内部模拟 PHY 模块直接接管。
● 错误的 LED 引脚:代码中误将 PA26 和 PA29 也配置成了 ANALOG_MASK。在的原理图中,它们分别对应 ECAT_PHY1_LED0 和 ECAT_PHY0_LED0。驱动 LED 需要数字高低电平,因此它们不能配置为模拟引脚。
修正方案 请在代码中直接删除以下两行:
c
HPM_IOC->PAD[IOC_PAD_PA29].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
HPM_IOC->PAD[IOC_PAD_PA26].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
全部代码如下:
c
void init_pins(void)
{
/* 1. ESC 硬件外设与总线引脚 */
HPM_IOC->PAD[IOC_PAD_PA31].FUNC_CTL = IOC_PA31_FUNC_CTL_ESC0_MDC;
HPM_IOC->PAD[IOC_PAD_PA30].FUNC_CTL = IOC_PA30_FUNC_CTL_ESC0_MDIO;
HPM_IOC->PAD[IOC_PAD_PA25].FUNC_CTL = IOC_PA25_FUNC_CTL_ESC0_CTR_0; /* ECAT_PHY1_LED1 (保持硬件控制) */
HPM_IOC->PAD[IOC_PAD_PA28].FUNC_CTL = IOC_PA28_FUNC_CTL_ESC0_CTR_1; /* ECAT_PHY0_LED1 (保持硬件控制) */
/* 2. LED0 控制引脚 (从 ANALOG 修正为 GPIO 模式) */
HPM_IOC->PAD[IOC_PAD_PA26].FUNC_CTL = IOC_PA26_FUNC_CTL_GPIO_A_26; /* ECAT_PHY1_LED0 */
HPM_IOC->PAD[IOC_PAD_PA29].FUNC_CTL = IOC_PA29_FUNC_CTL_GPIO_A_29; /* ECAT_PHY0_LED0 */
/* 3. 内置 EPHY 模拟引脚与偏置电阻引脚 */
HPM_IOC->PAD[IOC_PAD_PA16].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_RXN */
HPM_IOC->PAD[IOC_PAD_PA17].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_RXP */
HPM_IOC->PAD[IOC_PAD_PA18].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_TXN */
HPM_IOC->PAD[IOC_PAD_PA19].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_TXP */
HPM_IOC->PAD[IOC_PAD_PA20].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_RXN */
HPM_IOC->PAD[IOC_PAD_PA21].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_RXP */
HPM_IOC->PAD[IOC_PAD_PA22].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_TXN */
HPM_IOC->PAD[IOC_PAD_PA23].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_TXP */
HPM_IOC->PAD[IOC_PAD_PA24].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY1_RB 偏置电阻 */
HPM_IOC->PAD[IOC_PAD_PA27].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK; /* ECAT_PHY0_RB 偏置电阻 */
/* 4. 芯片内部 MAC-EPHY 数字走线 (PV/PW 虚拟引脚,保持系统默认映射) */
HPM_IOC->PAD[IOC_PAD_PV00].FUNC_CTL = IOC_PV00_FUNC_CTL_ESC0_P0_RXDV;
HPM_IOC->PAD[IOC_PAD_PV01].FUNC_CTL = IOC_PV01_FUNC_CTL_ESC0_P0_RXD_0;
HPM_IOC->PAD[IOC_PAD_PV02].FUNC_CTL = IOC_PV02_FUNC_CTL_ESC0_P0_RXD_1;
HPM_IOC->PAD[IOC_PAD_PV03].FUNC_CTL = IOC_PV03_FUNC_CTL_ESC0_P0_RXD_2;
HPM_IOC->PAD[IOC_PAD_PV04].FUNC_CTL = IOC_PV04_FUNC_CTL_ESC0_P0_RXD_3;
HPM_IOC->PAD[IOC_PAD_PV05].FUNC_CTL = IOC_PV05_FUNC_CTL_ESC0_P0_RXCK;
HPM_IOC->PAD[IOC_PAD_PV06].FUNC_CTL = IOC_PV06_FUNC_CTL_ESC0_P0_TXCK;
HPM_IOC->PAD[IOC_PAD_PV07].FUNC_CTL = IOC_PV07_FUNC_CTL_ESC0_P0_TXD_0;
HPM_IOC->PAD[IOC_PAD_PV08].FUNC_CTL = IOC_PV08_FUNC_CTL_ESC0_P0_TXD_1;
HPM_IOC->PAD[IOC_PAD_PV09].FUNC_CTL = IOC_PV09_FUNC_CTL_ESC0_P0_TXD_2;
HPM_IOC->PAD[IOC_PAD_PV10].FUNC_CTL = IOC_PV10_FUNC_CTL_ESC0_P0_TXD_3;
HPM_IOC->PAD[IOC_PAD_PV11].FUNC_CTL = IOC_PV11_FUNC_CTL_ESC0_P0_TXEN;
HPM_IOC->PAD[IOC_PAD_PV12].FUNC_CTL = IOC_PV12_FUNC_CTL_GPIO_V_12;
HPM_IOC->PAD[IOC_PAD_PV15].FUNC_CTL = IOC_PV15_FUNC_CTL_ESC0_P0_RXER;
HPM_IOC->PAD[IOC_PAD_PW00].FUNC_CTL = IOC_PW00_FUNC_CTL_ESC0_P1_RXDV;
HPM_IOC->PAD[IOC_PAD_PW01].FUNC_CTL = IOC_PW01_FUNC_CTL_ESC0_P1_RXD_0;
HPM_IOC->PAD[IOC_PAD_PW02].FUNC_CTL = IOC_PW02_FUNC_CTL_ESC0_P1_RXD_1;
HPM_IOC->PAD[IOC_PAD_PW03].FUNC_CTL = IOC_PW03_FUNC_CTL_ESC0_P1_RXD_2;
HPM_IOC->PAD[IOC_PAD_PW04].FUNC_CTL = IOC_PW04_FUNC_CTL_ESC0_P1_RXD_3;
HPM_IOC->PAD[IOC_PAD_PW05].FUNC_CTL = IOC_PW05_FUNC_CTL_ESC0_P1_RXCK;
HPM_IOC->PAD[IOC_PAD_PW06].FUNC_CTL = IOC_PW06_FUNC_CTL_ESC0_P1_TXCK;
HPM_IOC->PAD[IOC_PAD_PW07].FUNC_CTL = IOC_PW07_FUNC_CTL_ESC0_P1_TXD_0;
HPM_IOC->PAD[IOC_PAD_PW08].FUNC_CTL = IOC_PW08_FUNC_CTL_ESC0_P1_TXD_1;
HPM_IOC->PAD[IOC_PAD_PW09].FUNC_CTL = IOC_PW09_FUNC_CTL_ESC0_P1_TXD_2;
HPM_IOC->PAD[IOC_PAD_PW10].FUNC_CTL = IOC_PW10_FUNC_CTL_ESC0_P1_TXD_3;
HPM_IOC->PAD[IOC_PAD_PW11].FUNC_CTL = IOC_PW11_FUNC_CTL_ESC0_P1_TXEN;
HPM_IOC->PAD[IOC_PAD_PW12].FUNC_CTL = IOC_PW12_FUNC_CTL_GPIO_W_12;
HPM_IOC->PAD[IOC_PAD_PW15].FUNC_CTL = IOC_PW15_FUNC_CTL_ESC0_P1_RXER;
HPM_IOC->PAD[IOC_PAD_PW20].FUNC_CTL = IOC_PW20_FUNC_CTL_ESC0_REFCK;
HPM_IOC->PAD[IOC_PAD_PW21].FUNC_CTL = IOC_PW21_FUNC_CTL_ESC0_REFCK;
}
board.h配置修改如下:
c
/* EtherCAT definitions */
/* ECAT PORT0 must support */
#define BOARD_ECAT_SUPPORT_PORT1 (1)
#define BOARD_ECAT_SUPPORT_PORT2 (0) /*hlp 1 require expansion board */
#define BOARD_ECAT_SUPPORT_RUN_ERROR_LED (0) /* board not supports RUN/ERROR led */
/* invert esc port link signal, require low level for linkup */
#define BOARD_ECAT_PORT0_LINK_INVERT false /* depend on hardware */
#define BOARD_ECAT_PORT1_LINK_INVERT false /* depend on hardware */
#define BOARD_ECAT_PORT2_LINK_INVERT false /* depend on hardware */
#define BOARD_ECAT_PHY0_RESET_GPIO HPM_GPIO0
#define BOARD_ECAT_PHY0_RESET_GPIO_PORT_INDEX GPIO_DO_GPIOV //GPIO_DO_GPIOB
#define BOARD_ECAT_PHY0_RESET_PIN_INDEX (12) //24
#define BOARD_ECAT_PHY1_RESET_GPIO HPM_GPIO0
#define BOARD_ECAT_PHY1_RESET_GPIO_PORT_INDEX GPIO_DO_GPIOW //GPIO_DO_GPIOB
#define BOARD_ECAT_PHY1_RESET_PIN_INDEX (12) //24
#define BOARD_ECAT_PHY2_RESET_GPIO HPM_GPIO0
#define BOARD_ECAT_PHY2_RESET_GPIO_PORT_INDEX GPIO_DO_GPIOB
#define BOARD_ECAT_PHY2_RESET_PIN_INDEX (24)
#define BOARD_ECAT_PHY_RESET_LEVEL (0)
#define BOARD_ECAT_IN1_GPIO HPM_GPIO0
#define BOARD_ECAT_IN1_GPIO_PORT_INDEX GPIO_DO_GPIOD
#define BOARD_ECAT_IN1_GPIO_PIN_INDEX (6U)
#define BOARD_ECAT_IN2_GPIO HPM_GPIO0
#define BOARD_ECAT_IN2_GPIO_PORT_INDEX GPIO_DO_GPIOD
#define BOARD_ECAT_IN2_GPIO_PIN_INDEX (12U)
#define BOARD_ECAT_OUT1_GPIO HPM_GPIO0
#define BOARD_ECAT_OUT1_GPIO_PORT_INDEX GPIO_DO_GPIOC
#define BOARD_ECAT_OUT1_GPIO_PIN_INDEX (24U)
#define BOARD_ECAT_OUT2_GPIO HPM_GPIO0
#define BOARD_ECAT_OUT2_GPIO_PORT_INDEX GPIO_DO_GPIOC
#define BOARD_ECAT_OUT2_GPIO_PIN_INDEX (23)
#define BOARD_ECAT_OUT_ON_LEVEL (1)
/**
* Macro Definitions Must Match Pin Configuration in pinmux.c
*
* The `BOARD_ECAT_NMII_LINKn_CTRL_INDEX` macro must equal
* the `y` value in the pin's `IOC_PXxx_FUNC_CTL_ESC0_CTR_y` function assignment.
*
* Example:
* - Signal: ECAT_NMII_LINK0
* - Pin: PC20
* - pinmux.c: `IOC_PC20_FUNC_CTL_ESC0_CTR_2` // Note the value '2'
* - Macro: `#define BOARD_ECAT_NMII_LINK0_CTRL_INDEX 2` // Must also be '2'
*/
#define BOARD_ECAT_NMII_LINK0_CTRL_INDEX 1 //2
#define BOARD_ECAT_NMII_LINK1_CTRL_INDEX 0 //5
#define BOARD_ECAT_NMII_LINK2_CTRL_INDEX 6
/* ECAT PHY address definition */
#define BOARD_ECAT_PHY_ADDR_OFFSET (0U) //1
#define BOARD_ECAT_PORT0_PHY_ADDR (0U) /* actual PHY address = BOARD_ECAT_PHY_ADDR_OFFSET + BOARD_ECAT_PORT0_PHY_ADDR */
#define BOARD_ECAT_PORT1_PHY_ADDR (1U) /* actual PHY address = BOARD_ECAT_PHY_ADDR_OFFSET + BOARD_ECAT_PORT1_PHY_ADDR */
#define BOARD_ECAT_PORT2_PHY_ADDR (2U) /* actual PHY address = BOARD_ECAT_PHY_ADDR_OFFSET + BOARD_ECAT_PORT2_PHY_ADDR */
#define BOARD_EEPROM_I2C_BASE HPM_I2C0
/* Abstract eeprom id definition */
#define BOARD_EEPROM_ABSTRACT_ID E2P_DEVICE_AT24C128
/* the address of ecat flash emulate eeprom component in flash */
#define BOARD_ECAT_FLASH_EMULATE_EEPROM_ADDR (0x80000) /* offset 512K */
我是用的SDK版本为V1.11。
修改以上配置后就可以正常运行了,剩下的安装官方的步骤(新建工程,烧录xml文件,Scan等操作即可)
