<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天內不再提示

基于DWC2的USB驅動開發-0x0D PHY寄存器讀寫代碼編寫與測試

嵌入式USB開發 ? 來源:嵌入式USB開發 ? 作者:嵌入式USB開發 ? 2023-06-06 13:03 ? 次閱讀

本文轉自公眾號,歡迎關注

基于DWC2的USB驅動開發-0x0D PHY寄存器讀寫代碼編寫與測試 (qq.com)

PHY寄存器讀寫

1.1前言

我們前面重點介紹了ULPI接口和PHY的寄存器,這一篇來進行PHY寄存器讀寫的代碼編寫與測試。從這一篇開始就正真進入了驅動編寫的過程了。

1.2 GPVNDCTL寄存器介紹

DWC2提供了讀寫PHY寄存器的機制,對于應用來說就是操作一個寄存器GPVNDCTL:PHY供應商控制寄存器。能夠讀寫PHY寄存器這在有些底層問題分析時很重要。

《DesignWare Cores USB 2.0 Hi-Speed On-TheGo (OTG) Databook》的P391 5.4.14 GPVNDCTL 有該寄存器的介紹。

IP必須配置OTG_VENDOR_CTL_INTERFACE = 1 才支持該功能。

GHWCFG3寄存器的b9查看該配置值。

圖片

圖片

對于UTMI+PHY,DWC_otg核心使用UTMI+供應商控制接口進行PHY寄存器訪問。對于ULPI PHY,核心使用ULPI接口進行PHY寄存器訪問。應用程序設置GPVNDCTL來訪問PHY寄存器,并對PHY寄存器的訪問進行計時,應用程序輪詢此寄存器中的VStatus Done位來確認是否完成PHY寄存器的訪問。

該寄存器的描述如下

偏移0x34 訪問大小32位

image.png

image.png

image.png

圖片

我們重點關注和PHY讀寫有關的位域,其他的位暫時用不到,先不管。

NewRegReq: 軟件寫1觸發一次操作。

VStsDone: 當應用程序設置NewRegReq為1時,硬件清除該位,操作完成后硬件再置位該位。軟件查詢該位以判斷是否完成,注意代碼中需要考慮查詢超時機制。

VStsBsy: 忙標志,正在進行操作時硬件置位該位,操作完成時硬件清零,可以認為是和VStsDone相反的標志。

RegWr: 0表示讀PHY寄存器,1表示寫PHY寄存器

RegAddr: PHY寄存器地址,PHY立即寄存器的6位地址。設置為6'h2F用于擴展PHY寄存器集訪問。

VCtrl:UTMI+供應商控制寄存器地址(VCtrl)供應商定義的4位并行輸出總線的4位寄存器地址。該字段的位11:8被置于utmi_vontrol[3:0]上。ULPI擴展寄存器地址(ExtRegAddr)PHY擴展寄存器地址。

RegData: 寫寄存器時寫入寄存器的數據。讀寄存器時讀到的寄存器內容,設置VStatus Done時有效。

DisUlpiDrvr:讀寫PHY寄存器無關,

應用程序在完成ULPI Carkit中斷(GINTSTS.ULPICKINT)處理后設置此位。設置后,控制器將禁用輸出信號驅動器,并屏蔽ULPI接口的輸入信號??刂破髟趩⒂肬LPI接口之前清除該位。

1.3 代碼編寫

讀PHY寄存器

  1. RegWr設置為0
  2. RegAddr設置為立即寄存器的6位地址,如果是擴展寄存器則設置為0x2F且設置VCtrl為擴展寄存器的值。
  3. NewRegReq置1啟動操作
  4. 等待VStsDone變為1
  5. 讀出RegData

寫PHY寄存器

  1. RegWr設置為1
  2. RegAddr設置為立即寄存器的6位地址,如果是擴展寄存器則設置為0x2F且設置VCtrl為擴展寄存器的值。
  3. RegData設置為待寫入寄存器的值
  4. NewRegReq置1啟動操作
  5. 等待VStsDone變為1

代碼如下

/**
 * \\fn static uint8_t hw_dwc2_is_vndctlsupt(void)
 * 判斷是否支持供應商控制接口(VndctlSupt)
 * \\retval 0 不支持 供應商控制接口(VndctlSupt)
 * \\retval 1 支持
*/
static uint8_t hw_dwc2_is_vndctlsupt(void)
{
    return ((USB_OTG_READ_REG(CFG_GHWCFG3_ADDR) & VNDCTLSUPT_MASK) > > VNDCTLSUPT_OFFSET) & 0x01;
    //return (uint8_t)(s_dwc2_reg_t- >ghwcfg3._b.vndctlsupt);
}


/**
 * \\fn  int hw_dwc2_read_phyreg(uint8_t regaddr, uint8_t* regval, uint32_t timeout)
 * \\param[in] regaddr PHY寄存器,立即寄存器和擴展寄存器統一編碼,高2位為0表示立即寄存器,
 * 高兩位不為0表示擴展寄存器。
 * \\param[out] regval 存儲讀出的寄存器值
 * \\param[in] timeout 查詢是否完成的次數
 * \\retval -1 不支持供應商控制接口(VndctlSupt)
 * \\retval -2 讀超時
 * \\retval 0  讀成功
*/
int hw_dwc2_read_phyreg(uint8_t regaddr, uint8_t* regval, uint32_t timeout)
{
    /* 判斷是否支持供應商控制接口(VndctlSupt) */
    if(hw_dwc2_is_vndctlsupt() == 0)
    {
        return -1;
    }
#if 0
    s_dwc2_reg_t- >gpvndctl._b.regwr = 0; /* 讀模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴展寄存器 */
        s_dwc2_reg_t- >gpvndctl._b.regaddr = 0x2F;
        s_dwc2_reg_t- >gpvndctl._b.vctrl = regaddr;
    }
    else
    {
        /* 立即寄存器 */
        s_dwc2_reg_t- >gpvndctl._b.regaddr = regaddr;
        s_dwc2_reg_t- >gpvndctl._b.vctrl = 0;    
    }
    s_dwc2_reg_t- >gpvndctl._b.newregreq = 1;  /* 啟動操作 */
    while ((s_dwc2_reg_t- >gpvndctl._b.vstsdone == 0) && (timeout-- > 0));  /* 等待完成 */

    /* 根據標志返回值或者錯誤 */
    if(s_dwc2_reg_t- >gpvndctl._b.vstsdone != 0)
    {
        *regval = s_dwc2_reg_t- >gpvndctl._b.regdata;
        //s_dwc2_reg_t- >gpvndctl._b.vstsdone = 1;  /* newregreq =1時硬件清0,沒必要手動清零 */
        return 0;
    }
    else
    {
        return -2;
    }
#else
    uint32_t tmp = 0;
    tmp &= ~REGWR_MASK; /* 讀模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴展寄存器 */
        tmp |= ((uint32_t)0x2F < < REGADDR_OFFSET);
        tmp |= ((uint32_t)regaddr < < VCTRL_OFFSET);
    }
    else
    {
        /* 立即寄存器 */
        tmp |= ((uint32_t)regaddr < < REGADDR_OFFSET);
        tmp |= ((uint32_t)0 < < VCTRL_OFFSET);  
    }   
    tmp |= NEWREGREQ_MASK;                       /* 啟動操作 */
    USB_OTG_WRITE_REG(CFG_GPVNDCTL_ADDR,tmp);


    while(((USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR)&VSTSDONE_MASK) == 0) && (timeout-- > 0));  /* 等待完成 */
    if(((USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR)&VSTSDONE_MASK) != 0))
    {
        *regval = (USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR) > > REGDATA_OFFSET) & 0xFF; /* 讀出寄存器的值 */
        USB_OTG_WRITE_REG(CFG_GPVNDCTL_ADDR,USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR) | VSTSDONE_MASK);
        /* newregreq =1時硬件清0,沒必要手動清零 */
        return 0;
    }
    else
    {
        return -2;
    }
#endif
}


/**
 * \\fn  int hw_dwc2_write_phyreg(uint8_t regaddr, uint8_t regval, uint32_t timeout)
 * \\param[in] regaddr PHY寄存器,立即寄存器和擴展寄存器統一編碼,高2位為0表示立即寄存器,
 * 高兩位不為0表示擴展寄存器。
 * \\param[out] regval 寫入寄存器的值
 * \\param[in] timeout 查詢是否完成的次數
 * \\retval -1 不支持供應商控制接口(VndctlSupt)
 * \\retval -2 讀超時
 * \\retval 0  讀成功
*/
int hw_dwc2_write_phyreg(uint8_t regaddr, uint8_t regval, uint32_t timeout)
{
    /* 判斷是否支持供應商控制接口(VndctlSupt) */
    if(hw_dwc2_is_vndctlsupt() == 0)
    {
        return -1;
    }


#if 0
    /* 不能使用結構體單位域操作,因為regdata需要vstsdone=1才能訪問
     * 且vstsdone是W1C,所以單位域讀-修改-寫時vstsdone寫入1導致清0,導致后面regdata不能寫入
    */
    s_dwc2_reg_t- >gpvndctl._b.regwr = 1; /* 寫模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴展寄存器 */
        s_dwc2_reg_t- >gpvndctl._b.regaddr = 0x2F;
        s_dwc2_reg_t- >gpvndctl._b.vctrl = regaddr;
    }
    else
    {
        /* 立即寄存器 */
        s_dwc2_reg_t- >gpvndctl._b.regaddr = regaddr;
        s_dwc2_reg_t- >gpvndctl._b.vctrl = 0;    
    }
    s_dwc2_reg_t- >gpvndctl._b.regdata = regval; /* 寫入寄存器的值 */
    s_dwc2_reg_t- >gpvndctl._b.newregreq = 1;    /* 啟動操作 此時regdata回讀未0,導致回寫為0 不對*/
    while ((s_dwc2_reg_t- >gpvndctl._b.vstsdone == 0) && (timeout-- > 0));  /* 等待完成 */

    /* 根據標志返回值或者錯誤 */
    if(s_dwc2_reg_t- >gpvndctl._b.vstsdone != 0)
    {
        // s_dwc2_reg_t- >gpvndctl._b.vstsdone = 1;  /* newregreq =1時硬件清0,沒必要手動清零 */
        return 0;
    }
    else
    {
        return -2;
    }
#else
    uint32_t tmp = 0;
    tmp |= REGWR_MASK; /* 寫模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴展寄存器 */
        tmp |= ((uint32_t)0x2F < < REGADDR_OFFSET);
        tmp |= ((uint32_t)regaddr < < VCTRL_OFFSET);
    }
    else
    {
        /* 立即寄存器 */
        tmp |= ((uint32_t)regaddr < < REGADDR_OFFSET);
        tmp |= ((uint32_t)0 < < VCTRL_OFFSET);  
    }   
    tmp |= ((uint32_t)regval < < REGDATA_OFFSET); /* 寫入寄存器的值 */
    tmp |= NEWREGREQ_MASK;                       /* 啟動操作 */
    USB_OTG_WRITE_REG(CFG_GPVNDCTL_ADDR,tmp);


    while(((USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR)&VSTSDONE_MASK) == 0) && (timeout-- > 0));  /* 等待完成 */
    if(((USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR)&VSTSDONE_MASK) != 0))
    {
        USB_OTG_WRITE_REG(CFG_GPVNDCTL_ADDR,USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR) | VSTSDONE_MASK);
        /* newregreq =1時硬件清0,沒必要手動清零 */
        return 0;
    }
    else
    {
        return -2;
    }
#endif
}

1.4 測試

1.4.1 立即寄存器讀VID PID

這里使用的PHY型號是USB3343

VID PID寄存器值如下

圖片

測試代碼如下

uint8_t regval;
    int res = 0;


    /* 讀VID PID */
    res = hw_dwc2_read_phyreg(0x00,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[VIDL]:0x%x\\r\\n",regval);
    res = hw_dwc2_read_phyreg(0x01,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[VIDH]:0x%x\\r\\n",regval);
    res = hw_dwc2_read_phyreg(0x02,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[PIDL]:0x%x\\r\\n",regval);
    res = hw_dwc2_read_phyreg(0x03,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[PIDH]:0x%x\\r\\n",regval);

打印如下,可以看到讀出的值是正確的

image.png

也可以直接使用仿真器修改寄存器操作

(gdb) set (unsigned int )0x03000034=0x02000000 // 讀0寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x08000024

(gdb) set (unsigned int )0x03000034=0x02010000 // 讀1寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x08010004

(gdb) set (unsigned int )0x03000034=0x02020000 // 讀2寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x08020009

(gdb) set (unsigned int )0x03000034=0x02030000 // 讀3寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x08030000

1.4.2 立即寄存器讀寫寄存器

圖片

0x16處的Scratch寄存器是用戶可以自由使用的寄存器,可以使用該寄存器測試

0x16對應讀寫

0x17對應Set

0x18對應Clr

測試代碼如下

/* 讀Scratch Register初始值 */
    res = hw_dwc2_read_phyreg(0x16,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[Scratch Register]:0x%x\\r\\n",regval);


    /* 寫入0x55回讀是否正確 */
    hw_dwc2_write_phyreg(0x16,0x55,1000);
    if(res != 0)
    {
        return res;
    }
    res = hw_dwc2_read_phyreg(0x16,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    if(regval != 0x55)
    {
        usb_hal_info("[Scratch Register Write Err]:0x%x\\r\\n",regval);
    }
    else
    {
        usb_hal_info("[Scratch Register Write OK]:0x%x\\r\\n",regval);
    }


    /* 0x55置位0xAA變為0xFF */
    hw_dwc2_write_phyreg(0x17,0xAA,1000);
    if(res != 0)
    {
        return res;
    }
    res = hw_dwc2_read_phyreg(0x16,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    if(regval != 0xFF)
    {
        usb_hal_info("[Scratch Register Set Err]:0x%x\\r\\n",regval);
    }
    else
    {
        usb_hal_info("[Scratch Register Set OK]:0x%x\\r\\n",regval);
    }


    /* 0xFF清除0x55變為0xAA */
    hw_dwc2_write_phyreg(0x18,0x55,1000);
    if(res != 0)
    {
        return res;
    }
    res = hw_dwc2_read_phyreg(0x16,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    if(regval != 0xAA)
    {
        usb_hal_info("[Scratch Register Clr Err]:0x%x\\r\\n",regval);
    }
    else
    {
        usb_hal_info("[Scratch Register Clr OK]:0x%x\\r\\n",regval);
    }

打印如下

圖片

直接使用仿真器操作

(gdb) set (unsigned int )0x03000034=0x02560055 //寫0x16寄存器為0x55

(gdb) set (unsigned int )0x03000034=0x02160000 //讀0x16寄存器

(gdb) x /1xw 0x03000034 //查看讀回來的值為0x55 正確

0x3000034: 0x08160055

(gdb) set (unsigned int )0x03000034=0x025700AA //設置0x16寄存器,即操作0x17置位0xAA位

(gdb) set (unsigned int )0x03000034=0x02160000 //讀0x16寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x081600ff //查看讀回來的值為0xFF 正確

(gdb)

1.4.3 問題

位域操作和宏操作

  1. 寫regwr時 done標志被清零了,因為是讀-修改-寫的方式,VstsDone讀出來為1再修改其他位回寫時VstsDone寫入1,但是該位為W1C,寫1清0,所以回寫時會清除標志。雖然這里不會有什么問題,但是這里有編程者未意料到的副作用,在其他地方可能會導致問題,所以不建議使用位域一步步的操作。
  2. 位域的操作可能被優化,比如這里位于regdata等因為是字節對齊的,所以使用了字節操作指令,但是按照DWC2手冊應該要求都是按照32位訪問的,所以這里帶來了未預料的問題。
  3. 寫入regdata后,實際上回讀的值是0,所以最后s_dwc2_reg_t->gpvndctl._b.newregreq = 1;讀-寫0修改后讀出regdata是0,再寫入就是0了,而不是上一步寫入的s_dwc2_reg_t->gpvndctl._b.regdata = regval;了,所以不能使用這種位域一步步設置的方式。

以下驗證regdata寫入是不能回讀的,寫入0x55回讀是0

圖片

所以regdata在手冊中描述的rw不完全是可讀可寫,而是寫時只寫不可讀,讀時只有Vstsdone才能讀。

  1. 位域操作有太多的副作用,比如上面的W1C,寫入不能回讀,位域訪問寬度被優化修改,等等都可能導致問題,而且位域一步步操作都需要讀-修改-寫,所以效率也低,最好使用直接的寄存器宏一次讀出,臨時變量存儲修改,最后一次寫入的方式。

圖片

所以不能使用結構體一步一步修改的方式,而是使用宏,一次性修改整個寄存器。

圖片

圖片

1.5總結

以上測試了PHY立即寄存器的讀寫,由于使用的PHY USB3343沒有擴展寄存器,所以擴展寄存器讀寫沒有測試。注意上面也介紹了盡量使用宏的方式進行寄存器操作,而不要使用位域的方式,位域的方式存在諸多副作用。

審核編輯:湯梓紅

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

    關注

    30

    文章

    5164

    瀏覽量

    118135
  • usb
    usb
    +關注

    關注

    59

    文章

    7508

    瀏覽量

    259771
  • PHY
    PHY
    +關注

    關注

    2

    文章

    270

    瀏覽量

    51305
  • 驅動開發
    +關注

    關注

    0

    文章

    129

    瀏覽量

    12021
  • DWC2
    +關注

    關注

    0

    文章

    35

    瀏覽量

    105
收藏 人收藏

    評論

    相關推薦

    基于DWC2USB驅動開發-0x06 DWC2 USB2.0 IP 頭文件與寄存器讀寫操作

    上一篇我們介紹了控制器的寄存器,而驅動編寫底層無非就是配置各種寄存器,所以第一步先要準備寄存器的頭文件,對
    的頭像 發表于 05-16 14:04 ?2073次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x06 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP 頭文件與<b class='flag-5'>寄存器</b>的<b class='flag-5'>讀寫</b>操作

    基于DWC2USB驅動開發-0x01開篇介紹與新思DWC2 USB2.0控制器簡介

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-0x01開篇介紹與新思DWC2 USB2
    的頭像 發表于 05-08 18:10 ?3466次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x01開篇介紹與新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器簡介

    基于DWC2USB驅動開發-0x02 DWC2 USB2.0 IP功能特征介紹

    DWC2即新思(Synopsys )的DesignWare? Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。從linux的內核源碼驅動中就帶
    的頭像 發表于 05-09 10:09 ?6733次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介紹

    基于DWC2USB驅動開發-0x05 DWC2 USB2.0 IP 寄存器介紹

    本文對控制器的寄存器有了一個整體上的概覽,先了解個大概,了解寄存器的組織結構,大致了解一下常用的寄存器。后面編程時再一個個對照每一個寄存器的描述去
    的頭像 發表于 05-16 12:50 ?2275次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x05 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP <b class='flag-5'>寄存器</b>介紹

    基于DWC2USB驅動開發-USB復位詳解

    本文轉自公眾號歡迎關注 基于DWC2USB驅動開發-USB復位詳解 (qq.com) 一.前言 ? ? ? ? ?上一篇我們詳細介紹了
    的頭像 發表于 07-07 11:18 ?1.8w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>USB</b>復位詳解

    基于DWC2USB驅動開發-USB連接詳解

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-USB連接詳解 (qq.com) 一.前言 ? 之前一直在閱讀手冊,規格書,練習招式
    的頭像 發表于 07-07 08:46 ?2571次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>USB</b>連接詳解

    基于DWC2USB驅動開發-設備類驅動框架

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-設備類驅動框架 (qq.com) 一.前言 從軟件頂層,從數據流的角度來看
    的頭像 發表于 07-16 15:56 ?780次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-設備類<b class='flag-5'>驅動</b>框架

    基于DWC2USB驅動開發-發送相關的寄存器DMA寄存器詳解

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-發送相關的寄存器DMA寄存器詳解 (qq
    的頭像 發表于 07-16 16:42 ?1043次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-發送相關的<b class='flag-5'>寄存器</b>DMA<b class='flag-5'>寄存器</b>詳解

    基于DWC_ether_qos的以太網驅動開發-MDIO驅動編寫測試

    本文轉自公眾號歡迎關注 基于DWC_ether_qos的以太網驅動開發-MDIO驅動編寫測試
    的頭像 發表于 08-30 09:37 ?2610次閱讀
    基于<b class='flag-5'>DWC</b>_ether_qos的以太網<b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-MDIO<b class='flag-5'>驅動</b><b class='flag-5'>編寫</b>與<b class='flag-5'>測試</b>

    dm9000讀寫寄存器的問題

    0x0C(該寫入方法用的是第一種方式,只不過讀0x20000000換成了寫),然后通過0x0B地址選擇操作方式,比如說讀或寫,操作完之后延遲一段時間,再讀(或寫)0x0d
    發表于 10-31 16:13

    ad9959讀寫寄存器時只有0x00地址能讀寫數據

    您好!我焊接了三塊一模一樣的AD9959的線路板,用同樣的代碼只有一塊板子能正常工作,可后來這個板子也不工作了。這塊曾經調試好的板子,讀寫寄存器時只有0x00地址能
    發表于 09-26 16:48

    stm32識別TC35短信有兩個“0x0d 0x0a”怎么解決?

    原子哥的串口代碼里,遇到0x0d 0x0a就停止接收,但是從TC35模塊讀取短信時,前面的短信息說明,會有兩個“0x0d 0x0a”,然后再
    發表于 08-28 08:00

    RK3399平臺上USB控制PHY的連接方式和配置說明

    判斷切換為何種模式,ID腳的電平變化觸發控制ID腳中斷,然后由軟件切換到對應模式。目前使用兩種驅動版本,一個是upstream 版,驅動dwc2目錄下,主要從upstream開源項
    發表于 05-12 17:46

    如何對基于hal庫的DWC2 USB IP進行調試呢

    背景之前適配 DWC2 USB IP 的時候,主要是基于 st 的 hal 庫來走的,當時我就對他們的 hal 庫代碼不滿,只是無奈,迫于時間就沒重構,果不其然,usb bug 一堆,
    發表于 06-14 15:23

    無法讓USB主機正常工作是我做錯了什么嗎?

    ] scsi host0: usb-storage 1-1:1.0[ 2.818748] dwc2 49000000.usb-otg: 49000000.
    發表于 12-02 06:06
    亚洲欧美日韩精品久久_久久精品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>