工业以太网PHY驱动适配参考文档(4)

原创 瑞萨MCU小百科 2024-02-20 12:00


目录

  • 以太网PHY硬件连接

  • MAC与PHY之间的接口标准MII/GMII

  • 以太网PHY寄存器分析

  • 以太网PHY驱动软件配置

  • 其它


以太网PHY驱动软件配置

这里以Renesas提供的RZ/T2M工程样例“RZT2M_EtherCAT_RSK_rev0100”为例对PHY驱动的软件配置流程进行说明。此工程样例可以在Renesas提供的开发版上运行和调试。开发套件的使用文件《r20ut4939eg0050-rskrzt2m-usermanual_c.pdf》可以上Renesas官方网站上获取,开发板也可以申请购买或者是借用。


驱动配置的入口

左右滑动查看完整内容

void hal_entry (void){    fsp_err_t err;    /* TODO: add your own code here */    /* Initialize EtherCAT SSC Port */    err = RM_ETHERCAT_SSC_PORT_Open(gp_ethercat_ssc_port->p_ctrl, gp_ethercat_ssc_port->p_cfg);    if(FSP_SUCCESS != err)    {        __BKPT(0);  /* Can't continue the stack */    }    ...}


进入RM_ETHERCAT_SSC_PORT_Open(), 这个EtherCAT接口配置函数之后,可以看到EtherCAT Slave Controller的一些初始化配置,其中就包括了PHY的初始化:

左右滑动查看完整内容

/* Open Ether-Phy Driver */for (i = 0; BSP_FEATURE_ESC_MAX_PORTS > i; i++){    p_ether_PHY_instance = (ether_PHY_instance_t *) p_extend->p_ether_PHY_instance[i];    if (NULL != p_ether_PHY_instance)    {        err = p_ether_PHY_instance->p_api->open(p_ether_PHY_instance->p_ctrl, p_ether_PHY_instance->p_cfg);    }    if (FSP_SUCCESS == err)    {        opened_PHY[i] = 1;    }    else    {        break;    }}


PHY驱动配置相关数据结构解析

这里初始化的一个PHY实例是:

p_ether_PHY_instance,它是一个ether_PHY_instance_t类型的变量。

左右滑动查看完整内容

typedef struct st_ether_PHY_instance{    ether_PHY_ctrl_t      * p_ctrl;    ///< Pointer to the control structure for this instance    ether_PHY_cfg_t const * p_cfg;     ///< Pointer to the configuration structure for this instance    ether_PHY_api_t const * p_api;     ///< Pointer to the API structure for this instance} ether_PHY_instance_t;


其中ether_PHY_ctrl_t是指向PHY实例的控制结构体;

ether_PHY_cfg_t是指向实例配置的结构体指针;

ether_PHY_api_t是实例配置过程中需要调用到的函数方法所组成的结构体指针;


这个PHY的实例是在调用RM_ETHERCAT_SSC_PORT_Open()函数的时候形参传递进来的,也就是gp_ethercat_ssc_port。


ethercat_ssc_port_instance_t const * gp_ethercat_ssc_port = &g_ethercat_ssc_port0;


而gp_ethercat_ssc_port这个ethercat_ssc_port_instance_t类型的全局指针是指向一个常量,也就是下面代码中的g_ethercat_ssc_port0。

左右滑动查看完整内容

/* Instance structure to use this module. */const ethercat_ssc_port_instance_t g_ethercat_ssc_port0 ={    .p_ctrl        = &g_ethercat_ssc_port0_ctrl,    .p_cfg         = &g_ethercat_ssc_port0_cfg,    .p_api         = &g_ethercat_ssc_port_on_ethercat_ssc_port};


可以看到g_ethercat_ssc_port0是一个常量结构体,它的成员变量分别是:

g_ethercat_ssc_port0_ctrl指向ethercat_ssc_port0控制结构体指针;

g_ethercat_ssc_port0_cfg指向ethercat_ssc_port0配置结构体指针;

g_ethercat_ssc_port_on_ethercat_ssc_port指向ethercat_ssc_port0配置方法的结构指针。


看到这里是不是有一种似成相识的感觉?g_ethercat_ssc_port0是对ethercat_ssc_port0这个外设的驱动的描述体,与前面PHY驱运的描述体“p_ether_PHY_instance”结构上很相似,其实工程样例中所有的外设驱动都可以使用类似的结构体去完成相应的初始化。比如说timer驱动描述结构体:

左右滑动查看完整内容

/** This structure encompasses everything that is needed to use an instance of this interface. */typedef struct st_timer_instance{    timer_ctrl_t      * p_ctrl;        ///< Pointer to the control structure for this instance    timer_cfg_t const * p_cfg;         ///< Pointer to the configuration structure for this instance    timer_api_t const * p_api;         ///< Pointer to the API structure for this instance} timer_instance_t;


这种相似的驱动描述体其实就是工程样例驱动代码部分的大致框架所在,撑握了这个脉络即可以方便的看懂其它外设驱动的代码,也可以在以后的驱动开发过程中参考这种框架,提升代的通用性和可读性。


我们知道PHY的驱动是ethercat_ssc_port0外设驱动的子模块。因为要在RZ/T2M这个芯片上使能EtherCAT功能块,除了要完成芯片本身相关外设的初始化之外,还要完成与之对应的PHY的初始化。那么两者是如何关联在一起的呢?我们继续解读g_ethercat_ssc_port0这个全局结构体。可以看到g_ethercat_ssc_port0_cfg所指向的内容是配置ethercat_ssc_port0的描述体,如下所示:

左右滑动查看完整内容

/** Configuration parameters. */typedef struct st_ethercat_ssc_port_cfg{    uint32_t reset_hold_time;                                        ///< PHY Reset signal hold time (ms)    uint32_t reset_wait_time;                                        ///< Wait time after PHY reset relase (us)    uint32_t offset_address;                                         ///< PHY offset PHYsical address
   IRQn_Type esc_cat_irq;                                           ///< EtherCAT IRQ interrupt number    uint8_t   esc_cat_ipl;                                           ///< EtherCAT interrupt priority
   IRQn_Type esc_sync0_irq;                                    ///< EtherCAT Sync0 IRQ interrupt number    uint8_t   esc_sync0_ipl;                                         ///< EtherCAT Sync0 interrupt priority
   IRQn_Type esc_sync1_irq;                                    ///< EtherCAT Sync1 IRQ interrupt number    uint8_t   esc_sync1_ipl;                                         ///< EtherCAT Sync1 interrupt priority                                                                          ///< Callback provided when an ISR occurs    void (* p_callback)(ethercat_ssc_port_callback_args_t * p_args);
   timer_instance_t const * p_timer_instance;                   ///< Pointer to Timer instance
   /** Placeholder for user data.  Passed to the user callback in ethercat_ssc_port_callback_args_t. */    void const * p_context;    void const * p_extend;                                           ///< Placeholder for user extension.} ethercat_ssc_port_cfg_t;


对PHY的复位信号保持时间有描述,还有对EtherCAT中断有作描述,在此不展开讨论。其中p_extend成员是用户用于扩展控制的占位符。这也正是PHY驱动与ethercat_ssc_port0驱动关联的关键所在。代码赋于这个占位符是一个指向扩展配置的结构体指针。具体可以看看这个结构体的内容如下:

左右滑动查看完整内容

/** Extended configuration */typedef struct s_ethercat_ssc_port_extend_cfg{    ethercat_ssc_port_eeprom_size_t eeprom_size;                         ///< EEPROM memory size    ethercat_ssc_port_txc_delay_t   txc0;                                         ///< Port 0 TXC delay time    ethercat_ssc_port_txc_delay_t   txc1;                                         ///< Port 1 TXC delay time    ethercat_ssc_port_txc_delay_t   txc2;                                         ///< Port 2 TXC delay time
   ether_PHY_instance_t const * p_ether_PHY_instance[BSP_FEATURE_ESC_MAX_PORTS]; ///< Pointer to ETHER_PHY instance} ethercat_ssc_port_extend_cfg_t;const ethercat_ssc_port_extend_cfg_t g_ethercat_ssc_port0_ext_cfg ={    .eeprom_size             = ETHERCAT_SSC_PORT_EEPROM_SIZE_UNDER_32KBIT,    .txc0                    = ETHERCAT_SSC_PORT_TXC_DELAY_00NS,    .txc1                    = ETHERCAT_SSC_PORT_TXC_DELAY_00NS,    .txc2                    = ETHERCAT_SSC_PORT_TXC_DELAY_00NS,    .p_ether_PHY_instance[0] =#define FSP_NOT_DEFINED (1)#if (FSP_NOT_DEFINED == g_ether_PHY0)                    NULL,#else                    &g_ether_PHY0,#endif    .p_ether_PHY_instance[1] =#if (FSP_NOT_DEFINED == g_ether_PHY1)                    NULL,#else                    &g_ether_PHY1,#endif    .p_ether_PHY_instance[2] =#if (FSP_NOT_DEFINED == FSP_NOT_DEFINED)                    NULL,#else                    &FSP_NOT_DEFINED,#endif};


里面就对应有ether_PHY_instance_t类体的初始化值,这值的类型正好是PHY实例所对应的描体结构体如下代码所示,所以关联就产生了。

左右滑动查看完整内容

typedef struct st_ether_PHY_instance{    ether_PHY_ctrl_t      * p_ctrl;    ///< Pointer to the control structure for this instance    ether_PHY_cfg_t const * p_cfg;     ///< Pointer to the configuration structure for this instance    ether_PHY_api_t const * p_api;     ///< Pointer to the API structure for this instance} wh wether_PHY_instance_t;


您可复制下方网址到浏览器中打开进入瑞萨中文论坛查看:

https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/


未完待续


推荐阅读

工业以太网PHY驱动适配参考文档(1)

工业以太网PHY驱动适配参考文档(2)

工业以太网PHY驱动适配参考文档(3)

更多精彩内容,请点击

评论
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 117浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 150浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 105浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 128浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 185浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 90浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 92浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 113浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 205浏览
  • 本文介绍编译Android13 ROOT权限固件的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。关闭selinux修改此文件("+"号为修改内容)device/rockchip/common/BoardConfig.mkBOARD_BOOT_HEADER_VERSION ?= 2BOARD_MKBOOTIMG_ARGS :=BOARD_PREBUILT_DTB
    Industio_触觉智能 2025-01-08 00:06 77浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 103浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 93浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 153浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦