<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

以太網PHY寄存器分析 以太網PHY驅動軟件配置

瑞薩MCU小百科 ? 來源:瑞薩嵌入式小百科 ? 2024-02-22 12:17 ? 次閱讀

我們對g_ethercat_ssc_port0_ext_cfg這個全局變量深入追蹤,其成員變量 g_ether_PHY0,正好是一個PHY實例的詳細描述體。

/* Instance structure to use this module. */
const ether_PHY_instance_t g_ether_PHY0 =
{
  .p_ctrl    = &g_ether_PHY0_ctrl,
  .p_cfg     = &g_ether_PHY0_cfg,
  .p_api     = &g_ether_PHY_on_ether_PHY
};

其中g_ether_PHY0_cfg是pyh實例的配置結構體:

const ether_PHY_cfg_t g_ether_PHY0_cfg =
{


  .channel          = 0,
  .PHY_lsi_address      = 0,
  .PHY_reset_wait_time    = 0x00020000,
  .mii_bit_access_wait_time = 0,             // Unused
  .flow_control       = ETHER_PHY_FLOW_CONTROL_DISABLE,
  .mii_type         = (ether_PHY_mii_type_t) 0, // Unused
  .p_context         = NULL,
  .p_extend         = &g_ether_PHY0_extend
};

這里又通過p_extend 做了擴展配置(其實可以合并在一起)如下所示:

const ether_PHY_extend_cfg_t g_ether_PHY0_extend =
{
  .port_type     = ETHER_PHY_PORT_TYPE_ETHER_CAT,
  .PHY_chip      = (ether_PHY_chip_t) ETHER_PHY_CHIP_VSC8541,
  .mdio_type     = ETHER_PHY_MDIO_GMAC,


  .bps        = ETHER_PHY_SPEED_100,
  .duplex       = ETHER_PHY_DUPLEX_FULL,
  .auto_negotiation  = ETHER_PHY_AUTO_NEGOTIATION_ON,


  .PHY_reset_pin   = BSP_IO_PORT_20_PIN_7,
  .PHY_reset_time   = 15000,


  .p_selector_instance = (ether_selector_instance_t *)&g_ether_selector0,
};

可以看到上面的擴展配置當中,PHY的具體硬件型號都已經列出,如PHY_chip = (ether_PHY_chip_t) ETHER_PHY_CHIP_;

可以看到在示例代碼當中已經支持的PHY如下所示:

/** Identify PHY-LSI */
typedef enum e_ether_PHY_chip
{
  ETHER_PHY_CHIP_VSC8541 = (1 << 0), ///< VSC8541
 ? ?ETHER_PHY_CHIP_KSZ9131 = (1 << 1), ///< KSZ9131
 ? ?ETHER_PHY_CHIP_KSZ9031 = (1 << 2), ///< KSZ9031
 ? ?ETHER_PHY_CHIP_KSZ8081 = (1 << 3), ///< KSZ8081
 ? ?ETHER_PHY_CHIP_KSZ8041 = (1 << 4) ?///< KSZ8041
} ether_PHY_chip_t;

這里具體看一下 g_ether_selector0 這個 ether_selector_instance_t 類型的全局指針,指向 selector driver實例的成員變量:

typedef struct st_ether_selector_instance
{
  ether_selector_ctrl_t   * p_ctrl; ///< Pointer to the control structure for this instance
 ? ?ether_selector_cfg_t const * p_cfg; ?///< Pointer to the configuration structure for this instance
 ? ?ether_selector_api_t const * p_api; ?///< Pointer to the API structure for this instance
} ether_selector_instance_t;

這又是一個類似的結構體,通過三個指針來分別指向結構本身,selector的具體配置,和配置selector過程中所需要用的的成員方法api.

看一下selector的具體配置信息

typedef struct st_ether_selector_cfg
{
  uint8_t port;               ///< Port number
 ? ?ether_selector_PHYlink_polarity_t PHYlink; ///< PHY link signal polarity


 ? ?ether_selector_interface_t interface; ? ? ?///< Converter mode
 ? ?ether_selector_speed_t ? ? speed; ? ? ? ? ?///< Converter Speed
 ? ?ether_selector_duplex_t ? ?duplex; ? ? ? ? ///< Converter Duplex
 ? ?ether_selector_ref_clock_t ref_clock; ? ? ?///< Converter REF_CLK
 ? ?void const ? ? ? ? ? ? ? * p_extend; ? ? ? ///< Placeholder for user extension.
} ether_selector_cfg_t;

可以看到selector 對應的端口號,PHY連接信號對應的極性,接口模式,速率,全雙工,以及外部時鐘輸入。再看一下配置selector的過程中所需要用到的API函數:

const ether_selector_api_t g_ether_selector_on_ether_selector =
{
  .open     = R_ETHER_SELECTOR_Open,
  .converterSet = R_ETHER_SELECTOR_ConverterSet,
  .close    = R_ETHER_SELECTOR_Close,
  .versionGet  = R_ETHER_SELECTOR_VersionGet
};

其最主要的成員方法就是R_ETHER_SELECTOR_Open做了些什么:

先初始化ETHER_SELECTOR

 /* One time initialization for all ETHER_SELECTOR instances. */
  r_ether_selector_state_initialize();


  /* Unlock write access protection for Ethernet subsystem registers */
  r_ether_selector_reg_protection_disable(p_reg_ethss);
  
  /* Set the function of Ethernet ports. */
  sw_mode = ETHER_SELECTOR_CFG_MODE;
  p_reg_ethss->MODCTRL_b.SW_MODE = sw_mode & ETHER_SELECTOR_MODCTRL_BIT_SWMODE_MASK;
  
  /* Set the MAC of all port for half-duplex. */
  p_reg_ethss->SWDUPC_b.PHY_DUPLEX = 0;
  
  /* Set all Ethernet switch port to select not use 10Mbps. */
  p_reg_ethss->SWCTRL_b.SET10 = 0;

根據端口號來選擇對應控制寄存器

/* Set RGMII/RMII Converter configuration */
  switch (port)
  {
    case 0:
    {
      p_reg_convctrl = (uint32_t *) &p_reg_ethss->CONVCTRL[0];
      break;
    }


    case 1:
    {
      p_reg_convctrl = (uint32_t *) &p_reg_ethss->CONVCTRL[1];
      break;
    }


    case 2:
    default:
    {
      p_reg_convctrl = (uint32_t *) &p_reg_ethss->CONVCTRL[2];
      break;
    }
  }

根據指向selector的配置信息:

const ether_selector_cfg_t g_ether_selector0_cfg =
{
  .port           = 0,
  .PHYlink          = ETHER_SELECTOR_PHYLINK_POLARITY_LOW,
  .interface         = ETHER_SELECTOR_INTERFACE_RGMII,
  .speed           = ETHER_SELECTOR_SPEED_100MBPS,
  .duplex          = ETHER_SELECTOR_DUPLEX_FULL,
  .ref_clock         = ETHER_SELECTOR_REF_CLOCK_INPUT,
  .p_extend         = NULL,
};

來對CONVCTRL[port_number]寄存器做相應的配置

2eb4a366-d138-11ee-a297-92fbcf53809c.png

這里結合RZ/T2M的用戶手冊,很容易理解其中的意思:

2ec2147e-d138-11ee-a297-92fbcf53809c.png

結合代碼來看,總體ETHER_SELECTOR 的驅動的配置流程圖臺下所示:

2edfe864-d138-11ee-a297-92fbcf53809c.png

在對ETHER_SELECTOR驅動做完配置后,下面具體看一下對ETHER_PHY_CHIP這個PHY,代碼具體做了哪些操作:

首先是做初始化:

2ef2df46-d138-11ee-a297-92fbcf53809c.png

oid ether_PHY_targets_initialize_vsc8541 (ether_PHY_instance_ctrl_t * p_instance_ctrl)
{
  /* Vendor Specific PHY Registers */
 #define ETHER_PHY_REG_LED_MODE_SELECT         (0x1D)
 #define ETHER_PHY_REG_LED_BEHAVIOR          (0x1E)
 #define ETHER_PHY_REG_EXTEND_GPIO_PAGE        (0x1F)
...

這個初始化函數,并沒有對IEEE 標準規定的16個寄存器做讀寫操作,只對廠商自定義的寄存器做了配置。初始化完成之后,對是否打開自動協商的功能對PHY進行了讀寫:

2efeb3d4-d138-11ee-a297-92fbcf53809c.png

2f107bb4-d138-11ee-a297-92fbcf53809c.png

這里可以看到對PHY芯生來說,需要配置的寄存器并不是很多,大多數情況下,把自動協商寄存器配置好,就可以了。除此之后就是廠商自定義的寄存器的一些自定義的功能。這部分功能需要結合用戶手冊來理解和使用,大部分也是用來調試和指示的作用以及一些IEEE基本標準之外的特色功能,比如節能標準之類的。

對于用戶說來,搞清楚數據結構之間的關聯,剩下的就是驅動代碼的執行邏輯,考慮到執行邏輯并不復雜,這里不展開來說。用戶可以參考錄屏材料進一步深入了解。

其它

經過驗證的PHY芯片列表:

2f2436d6-d138-11ee-a297-92fbcf53809c.jpg






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 以太網
    +關注

    關注

    40

    文章

    5128

    瀏覽量

    166535
  • 寄存器
    +關注

    關注

    30

    文章

    5141

    瀏覽量

    118043
  • PHY
    PHY
    +關注

    關注

    2

    文章

    270

    瀏覽量

    51230

原文標題:工業以太網PHY驅動適配參考文檔(完結篇)

文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用STM32H743做以太網,如何檢測以太網是否掉線?

    目前使用STM32H743做以太網,目前我這里檢測以太網掉線(物理線纜脫掉)的方式為讀取PHY自動協商的狀態,但是這個部分放在主循環中感覺很不好,之前使用的TI芯片,會有一個寄存器的B
    發表于 03-26 07:42

    1- 什么是以太網PHY?

    以太網總線/接口技術
    EE_Voky
    發布于 :2022年09月15日 13:59:14

    以太網PHY碼型變換問題

    求助以太網PHY 雙極性歸零碼和單極性不歸零碼雙向變換的方案,,,(10M)
    發表于 03-06 10:03

    以太網PHY怎么改變現代市場

    筆者在上一篇博客文章(《以太網PHY奧妙無窮,三件事您應了如指掌》)中談論了以太網的演變及以太網物理層收發
    發表于 09-07 11:49

    STM32F407能不能同時使用USB PHY以太網PHY

    【求助】STM32F407能不能同時使用USB HPY和以太網HPY現在需要使用高速USB模擬一個USB設備和進行傳輸文件高速以太網接口,STM32F407能不能同時使用兩個PHY
    發表于 11-21 10:42

    以太網控制外部PHY芯片模擬程序代碼實現

    模擬程序模擬了簡化的 LXT971A 芯片(Inter 公司的外部 PHY 芯片)。PHY 芯片通過 MIIM(媒體無關接口管理模塊)來連接以太網控制,因此:? 當
    發表于 01-18 14:20

    以太網MAC芯片與PHY芯片的關系是什么

    如何實現單片以太網微控制?以太網MAC是什么?什么是MII?以太網PHY是什么?網卡上除RJ-45接口外,還需要其它元件嗎?造成
    發表于 12-28 06:22

    以太網芯片MAC和PHY的關系 精選資料分享

    問:如何實現單片以太網微控制?答:訣竅是將微控制、以太網媒體接入控制(MAC)和物理接口收發
    發表于 07-29 09:22

    STM32F105/107系列以太網PHY設計

    STM32F105/107系列以太網PHY設計資料。圖說的很詳細,廢話就不說了,自己看圖吧。Technorati 標簽: STM32F107,STM32F105,以太網,PHY
    發表于 08-05 06:55

    請問如何更換以太網PHY芯片?

    購買了OKMX6UL-C開發板,使用的以太網PHY芯片是KSZ8081RNB,使用RMII接口和ARM通信。我們做了另一個底板,仍然使用了KSZ8081,但是它非常難以手工焊接,想問一下,如果換成
    發表于 01-11 07:31

    如何對以太網PHY芯片的rmii pin腳進行配置

    如何對以太網PHY芯片的時鐘進行配置?如何對以太網PHY芯片的gmac進行配置?如何對
    發表于 02-21 06:54

    RK3288搭配以太網PHY芯片需要注意哪些

    (1)以太網PHY芯片驅動及接口瑞芯微在設計RK 系列主控芯片時,有內置以太網MAC 控制,通常只需要搭配一顆
    發表于 08-31 17:15

    以太網PHY如何改變現代市場

    在本文里,筆者將重拾上次中斷的話題,探討以太網PHY在如何改變現代市場。 以太網是40多年前發明的?,F在讓我們快進跳過對IEEE 802.3(10Mbps以太網
    發表于 11-18 07:44

    什么是以太網?

    分項規定和規范。由IEEE 802.3規定的一個最重要的部分就是以太網物理層晶體管(PHY)。 圖1展示了數據如何傳輸到標準RJ45以太網線纜以及如何從該線纜傳輸到處理的范例性方框圖
    發表于 11-18 06:56

    使用不同的以太網PHY,MDC信號的問題求解

    我們正忙于開發基于 LS1028A 處理以太網 PHY VSC8514XMK-03 的產品。我們在初始化以太網 PHY 時遇到問題。在文
    發表于 03-23 07:19
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>