一、前言
二、開發(fā)板CH32V307V-EVT-R3介紹
三、CH182H2介紹
四、性能測試
五、總結(jié)建議
六、基于MounRiver_Studio開發(fā)(保姆級操作)
一、前言
本文分享一款100M以太網(wǎng)PHY芯片,CH182H2。并分享基于官方的開發(fā)板CH32V307V-EVT-R3來評估下這款芯片的應(yīng)用,以及性能測試。具體的性能,參數(shù),特點等可以參考數(shù)據(jù)手冊,這里主要描述一些個人覺得比較有意思的點。
本文會著重描述該芯片的基本應(yīng)用,包括原理圖分析,官方開發(fā)板Demo測試,RAW發(fā)送,TCP收發(fā)性能測試等,如果是初次使用該芯片的朋友,可以參考本文。
二、開發(fā)板CH32V307V-EVT-R3介紹
官方的CH32V307V-EVT-R3開發(fā)板,可以用于評估CH182H2芯片。

資料下載地址:
https://www.wch.cn/downloads/CH32V307EVT_ZIP.html
開發(fā)板的主要接口資源如下:

1.100M網(wǎng)口
2.MCU引出I/O
3.SWDIO調(diào)試口
4.CH32V307VCT6
5.USB全速接口
6.USB高速接口(內(nèi)置PHY)
8.復位按鈕
9.下載按鈕
個人覺得比較好的地方是P6把RMII接口引出來了,方便邏輯分析儀直接測量RMII接口,用于測試分析,甚至用于學習RMII接口都是不錯的。
三、CH182H2介紹
開發(fā)板是用于評估的載體,本文的重點是CH182H2這顆PHY芯片,所以開發(fā)板大致了解,熟悉下原理圖,知道有哪些接口,如何使用即可。重點來看CH182H2這顆芯片。該芯片IO口支持3.3/2.5/1.8V,適配多種電壓的主控,還兼容RTL8102F??词謨悦枋?,有一款CH182D內(nèi)置唯一MAC地址,體積小巧,QFN封裝才3*3mm。
可以從以下地址下載該芯片規(guī)格書
https://www.wch.cn/downloads/CH182DS1_PDF.html
這里順帶提一下,WCH的以太網(wǎng)產(chǎn)品還是挺全的??此麄児倬W(wǎng)介紹,除了以太網(wǎng)PHY,還提供控制器芯片CH390、協(xié)議棧芯片CH394/CH395和轉(zhuǎn)接芯片CH9121等。CH390D尺寸3*3mm,算是目前市面上體積最小的百兆以太網(wǎng)MAC PHY芯片了,內(nèi)置PHY,支持IPv4 TCP/UDP和IPv6 TCP/UDP校驗和的生成和檢查。帶全球唯一MAC地址。
3.1原理圖解析
根據(jù)開發(fā)板的原理圖,重點看下CH182H2的應(yīng)用部分。
MCU最小系統(tǒng)部分:

PHY部分:

RMII接口部分,引出IO可使用邏輯分析抓信號:

以太網(wǎng)接口部分:

PHY電源和復位部分:

從以上原理圖可以看出PHY的外圍電路是很簡單的,可以降低BOM成本。
原理圖分為以下部分來看:
1.電源
VDDIO: IO電源輸入,對地接0.1uF電容。支持3.3V、2.5V或1.8V。
AVDD33: 3.3V主電源輸入,對地接0.1uF并聯(lián)10uF。
AVDDK:對地接1uF電容,供內(nèi)置LDO用。實測應(yīng)該為1.2V左右,最大1.5V。
DVDDK:對地接0.1uF電容,供內(nèi)置LDO解耦用。實測應(yīng)該為1.2V,最大1.5V。
2.MDIO
CH182系列MDIO、MDC均內(nèi)置上拉電阻,可省外部上拉,簡化電路。
3.復位
RSTB使用阻容復位即可,典型值4.7K,0.1uF。低電平有效。
4.LED
LED引腳的一個功能是配置PHY地址。
LED1 LED0組合決定PA1 PA0 PHY的地址,默認為01即LED0內(nèi)部上拉,LED1內(nèi)部下拉。
開發(fā)板中使用了默認配置,所以無需額外的4.7k的上下拉。
LED引腳本身還作為LED信號控制,用于表示10M還是100M速度,以及是否在通訊活動的狀態(tài),取決于寄存器配置LED_SEL不同,LED1和LED0的行為不一樣,如下,默認LED_SEL為0b11

LED0還可以作為PMEB喚醒事件輸出,低有效。
5.MDI
MDI_TX_P/N MDI_RX_P/N接網(wǎng)絡(luò)變壓器的TD+/- RD+/-即可,網(wǎng)絡(luò)變壓器中心抽頭0.1uF對地即可,無需接電源。
6.中斷
INTB引腳通過4.7k上拉到VDDIO。
需要在RMII模式下,作為中斷輸出,低有效。
7.晶振
XI,XO外接25M晶體,或者輸入25M/50M時鐘。PHY內(nèi)部集成了負載電容為12pF的晶體所需的兩個振蕩電容,所以對于負載電容為12pF的晶體無需外接電容。
如果晶體負載電容大于12pF,則還需根據(jù)實際情況外接負載電容(在內(nèi)部電容基礎(chǔ)上再增加)。
8.RMII接口選擇
RXDV引腳默認為內(nèi)部下拉此時配置為MII接口,如果需要配置為RMII接口則RXDV需要外部接4.7k上拉到VDDIO。
9.TXC時鐘模式
RMII模式下,RXD0引腳默認為下拉TXC輸出50MHz時鐘,
如果外部4.7KΩ上拉到VDDIO,則TXC輸入50MHz時鐘。
開發(fā)板中無外部上下拉,使用默認狀態(tài)TXC輸出時鐘。
頁7寄存器16也可配置RMII的TXC是輸出還是輸入時鐘。
10.[R]MII接口
RXDV高有效表示有接收數(shù)據(jù)。同時用于配置RMII接口還是MII接口。
RXD0~3 MAC接收數(shù)據(jù)
RXC PHY輸出時鐘100M時25M,10M時2.5M
TXD0~3 MAC發(fā)送數(shù)據(jù)
TXCMII PHY輸出時鐘,RMII下PHY輸出或者輸入時鐘(RXD0決定)
TXEN發(fā)送使能,高有效。
CRS_DV高有效,載波或者接收數(shù)據(jù)不為空閑時高。
COL 高有效,檢測到碰撞為高
RXER 高有效,檢測到錯誤為高
3.2寄存器

0號寄存器的速度和自動協(xié)商,雙工模式是需要關(guān)注的,對于不能通過引腳配置這些參數(shù)的型號需要配置該寄存器,對于能通過引腳配置這些參數(shù)的型號則可以不配置該寄存器,CH182H2需要配置該寄存器。默認配置是100M,自動協(xié)商使能,全雙工,所以默認配置即可滿足一般使用。


寄存器都是標準的。寄存器31用于頁切換,基礎(chǔ)寄存器是標準的,擴展寄存器由廠家自定義功能,詳細內(nèi)容需要咨詢廠家。
3.3特點
詳細參數(shù),特點等可以參考數(shù)據(jù)手冊,個人覺得以下特點值得特別提出
1.25M晶體(如果負載電容是12pF)無需外部電容,內(nèi)置了負載電容為12pF的晶體對應(yīng)的電容。
2.IO可配不同電壓,支持3.3V、2.5V或1.8V。
3.P6引出了RMII接口,方便使用邏輯分析儀測試。
4.CH182D還內(nèi)置唯一MAC地址。
5.內(nèi)置以太網(wǎng)50Ω阻抗匹配電阻,外部不要再接49.9Ω或50Ω電阻,等效于電壓驅(qū)動。
6.外圍器件簡單,BOM成本低。
3.4建議
開發(fā)板中建議CH182H2的VDDIO不要直連VCC182,而是通過跳線可外部供指定的電壓或者使用板載默認的3.3V,方便評估VDDIO使用不同電壓(最好是板載就可以選擇不同電壓,作為評估版要能通過配置就能評估所有功能)。
四、性能測試
這里來基于iperf進行TCP的收發(fā)性能測試,先來測試RAW發(fā)送可以驗證PHY的速率,然后再測試TCP的收發(fā)性能。 實測結(jié)果先睹為快如下,詳見后面的測試介紹。
1.Raw TX:93Mbps
2.TCP TX: 80Mbps
3. TCP RX: 70Mbps
4.1 Raw發(fā)送速度測試
基于CH32V307V-EVT-R3CH32V307EVTEVTEXAMETHMAC_RAW這個工程進行測試
注釋掉接收處理與打印,只關(guān)注發(fā)送
void WCHNET_MainTask(void)
{
//RecDataPolling();
WCHNET_QueryPhySta(); /* Query external PHY status */
WCHNET_LinkProcessing(); /* process Link stage task */
}
發(fā)送代碼
static uint32_t sndlen = 0;
static uint32_t tick1=0;
static uint32_t tick2=0;
extern uint32_t volatile LocalTime;
while(1)
{
WCHNET_MainTask();
if(LinkSta)
{
if(ETH_SUCCESS == MACRAW_Tx(ARPPackage, sizeof(ARPPackage))){
///if(++PktCnt % 100 == 0)
/// printf("PktCnt:%drn",PktCnt);
///Delay_Ms(100);
sndlen += sizeof(ARPPackage);
if(tick1 == 0){
tick1 = LocalTime;
tick2 = LocalTime;
}else{
tick2 = LocalTime;
}
if (tick2 - tick1 >= 5000){
uint32_t speed;
speed=((uint64_t)sndlen/125)/(tick2-tick1);
printf("%d Mbps!rn", speed);
tick1 = tick2;
sndlen = 0;
}
}
}
}
}
可以看到幾乎可以跑滿100Mbps。

4.2接收測試
作為servert接收
所以使用TCPServer的Demo
接收數(shù)據(jù)流如下:
WCHNET_HandleGlobalInt->WCHNET_HandleSockInt->WCHNET_DataLoopback
我們在WCHNET_DataLoopback記錄接收指定長度數(shù)據(jù)后的時間,用于接收速度測試,

實測,接收速度最大可達70Mbps左右。

關(guān)鍵代碼如下
extern uint32_t volatile LocalTime;
void WCHNET_DataLoopback(u8 id)
{
u32 len;
u32 endAddr = SocketInf[id].RecvStartPoint + SocketInf[id].RecvBufLen; //Receive buffer end address
if ((SocketInf[id].RecvReadPoint + SocketInf[id].RecvRemLen) > endAddr) { //Calculate the length of the received data
len = endAddr - SocketInf[id].RecvReadPoint;
}
else {
len = SocketInf[id].RecvRemLen;
}
static uint32_t recvlen = 0;
static uint32_t tick1=0;
static uint32_t tick2=0;
recvlen += len;
if(tick1 == 0){
tick1 = LocalTime;
tick2 = LocalTime;
}else{
tick2 = LocalTime;
}
if (tick2 - tick1 >= 5000){
uint32_t speed;
speed=((uint64_t)recvlen/125)/(tick2-tick1);
printf("%d Mbps!rn", speed);
tick1 = tick2;
recvlen = 0;
}
WCHNET_SocketRecv(id, NULL, &len);
}
4.3發(fā)送測試
作為client發(fā)送
所以使用TCPClient的Demo
u8DESIP[4] = {192,168,1,100}; //destination IP address
改為電腦IP
u8DESIP[4] = {192,168,1,9};
端口對應(yīng)
u16desport=1000; //destination portu16srcport=1000; //source port
增加變量,檢測到鏈接或者斷開時,設(shè)置對應(yīng)標志,標志是鏈接狀態(tài)時才發(fā)送
//if (intstat & SINT_STAT_RECV) //receive data
{
WCHNET_DataLoopback(socketid); //Data loopback
}
volatileintconnect_flag=0;
if (intstat&SINT_STAT_CONNECT) //connect successfully
{
connect_flag=1;
if (intstat&SINT_STAT_DISCONNECT) //disconnect
{
connect_flag=0;
if (intstat&SINT_STAT_TIM_OUT) //timeout disconnect
{
connect_flag=0;
接收處理這里不再發(fā)送避免干擾,單獨添加發(fā)送測試函數(shù)
void WCHNET_DataLoopback(u8 id)
{
u8 i;
u32 len;
u32 endAddr=SocketInf[id].RecvStartPoint+SocketInf[id].RecvBufLen; //Receive buffer end address
if ((SocketInf[id].RecvReadPoint+SocketInf[id].RecvRemLen) >endAddr) { //Calculate the length of the received data
len=endAddr-SocketInf[id].RecvReadPoint;
}
else {
len=SocketInf[id].RecvRemLen;
}
//i = WCHNET_SocketSend(id, (u8 *) SocketInf[id].RecvReadPoint, &len); //send data
//if (i == WCHNET_ERR_SUCCESS) {
WCHNET_SocketRecv(id, NULL, &len); //Clear sent data
//}
初始發(fā)送數(shù)據(jù)
for (i=0; i
發(fā)送處理
extern uint32_t volatile LocalTime;
static voidsend_test(void){
if(connect_flag){
static uint32_t sndlen=0;
static uint32_t tick1=0;
static uint32_t tick2=0;
u8 id=0;
uint32_t len=RECE_BUF_LEN;
u8 res=WCHNET_SocketSend(id, (u8*) SocketRecvBuf[id], &len);
if (res!=WCHNET_ERR_SUCCESS) {
//printf("snd err:%drn",res);
sndlen+=0;
}else{
sndlen+=len;
}
if(tick1==0){
tick1=LocalTime;
tick2=LocalTime;
}else{
tick2=LocalTime;
}
if (tick2-tick1>=5000){
uint32_tspeed;
speed=((uint64_t)sndlen/125)/(tick2-tick1);
printf("%d Mbps!rn", speed);
tick1=tick2;
sndlen=0;
}
}
}
while(1)
{
/*Ethernet library main task function,
* which needs to be called cyclically*/
WCHNET_MainTask();
/*Query the Ethernet global interrupt,
* if there is an interrupt, call the global interrupt handler*/
if(WCHNET_QueryGlobalInt())
{
WCHNET_HandleGlobalInt();
}
/* 發(fā)送測試 */
send_test();
}
實測如下


發(fā)送速度為80Mbps左右,會有一些抖動,最大可達90Mbps,可以看到效率是非常不錯的,支持硬件校驗是一個很大的優(yōu)勢。
4.4速度優(yōu)化建議
1.提高MCU主頻
Usersystem_ch32v30x.c中改為144M
#defineSYSCLK_FREQ_144MHz_HSE 144000000
2.增加DMA描述符數(shù)/緩存區(qū)個數(shù)
根據(jù)應(yīng)用場景看是大量收還是大量發(fā),調(diào)大對應(yīng)的方向的描述符數(shù)
比如發(fā)送多的場景可以加大ETH_TXBUFNB
Usernet_config.h中
#define ETH_TXBUFNB 16 /* The number of descriptors sent by the MAC */
#define ETH_RXBUFNB 2 /* Number of MAC received descriptors */
3.增加協(xié)議棧緩存區(qū)大小
Usernet_config.h中
根據(jù)應(yīng)用場景看是大量收還是大量發(fā),調(diào)大對應(yīng)的方向的緩存大小。
比如發(fā)送多的場景可以加大WCHNET_NUM_TCP_SEG
#define RECE_BUF_LEN (WCHNET_TCP_MSS*2) /* socket receive buffer size */
#define WCHNET_NUM_PBUF WCHNET_NUM_POOL_BUF /* Number of PBUF structures */
#define WCHNET_NUM_TCP_SEG (WCHNET_NUM_TCP*8) /* The number of TCP segments used to send */
4.打開硬件校驗
這個是最能明顯提升效率的,因為校驗計算很占CPU帶寬。
Usernet_config.h中
#defineHARDWARE_CHECKSUM_CONFIG 1 /* Hardware checksum checking and insertion configuration, 1: enable, 0: disable */
5.數(shù)據(jù)量盡量按最大包長填充,即應(yīng)用上層協(xié)議的設(shè)計盡量不要使用短包。
五、總結(jié)建議
總的來說CH182H2的優(yōu)點是很明顯的,正如3.3的介紹,最主要的就是外圍電路可以很簡單,降低BOM成本,另外也有不同小封裝可選,適應(yīng)于尺寸限制等場景,同時也可以降低成本,所以選擇100M以太網(wǎng)PHY芯片的話可以考慮下CH182系列。
選用CH32V30x等主控,基于MountRiverStudio開發(fā),也是很方便的,測試跑RAW數(shù)據(jù)發(fā)送幾乎能跑滿硬件帶寬,跑TCP效率也非常不錯,發(fā)送可達80Mbps多。MountRiverStudio使用起來個人感覺還是非常絲滑方便的,界面也美觀。
另外官方Demo提供了協(xié)議棧庫可以直接使用減少開發(fā)工作量,而對于想自己移植第三方協(xié)議棧庫或者直接面向底層編程的,可以參考下MAC Raw例程,可以基于此在上面移植以太網(wǎng)協(xié)議棧。RMII驅(qū)動層也是可以直接使用的。
注意ISP下載開發(fā)板BOOT0不要短接(默認是短接的)。
注意使用仿真器需要先切換到RV模式。
六、基于MounRiver_Studio開發(fā)(保姆級操作)
前面介紹了CH182H2這顆芯片和其對應(yīng)的評估版,并進行了性能測試,對于只是想了解該芯片的可以參考,如果進一步想進行應(yīng)用開發(fā),則可參考本章內(nèi)容。本章按照保姆級別操作記錄,介紹基于官方的Demo開發(fā)實踐。
6.1安裝MounRiverStudio
從以下地址下載MounRiverStudio:
https://www.mounriver.com/download

6.2導入工程
下載開發(fā)板資料包CH32V307EVT.ZIP,解壓
https://www.wch.cn/downloads/CH32V307EVT_ZIP.html
雙擊CH32V307EVTEVTEXAMETHTCPServerTCPServer.wvproj打開tcpserver的例程。
6.2.1配置Netlib
我們這里要使用RMII,100M接口,所以要修改使用的驅(qū)動文件
右鍵eth_driver_RMII.c,Include/Exclude From Build添加到編譯

同樣的方法將eth_driver_10M.c排除編譯
即編譯以下幾個文件

6.2.2配置浮點庫
右鍵點擊TCPServer->Properties
配置使能硬件單精度浮點

再配置鏈接對應(yīng)的庫文件(可省略)

配置完點擊Apply
兩個a文件只保留一個即可,這里使用float.a
也可以使用上述方法,將這個庫排除編譯。

按delete按鍵選擇remove

6.2.3確認芯片型號
右鍵點擊TCPServer->Properties,選擇對應(yīng)的MCU型號

配置完點擊Apply
6.3編譯
菜單欄點擊Project->build Project
編譯完成

6.3.1編譯注意事項
如果開啟了微軟電腦管家服務(wù),MRS2檢測到該服務(wù)可能導致編譯變慢會彈窗提示如下。用戶可以按彈窗提示,關(guān)閉該服務(wù),編譯速度就會恢復正常。

按照如下處理
右鍵點擊左下角WIN圖標->計算機管理->服務(wù)和應(yīng)用程序->服務(wù)
找到Microsoft PC Manager Service,右鍵點擊->屬性
啟動類型選擇禁用,然后點擊停止

6.4配置仿真器
參考WCH-LinkUserManual
https://www.wch.cn/downloads/WCH-LinkUserManual_PDF.html
接入仿真器后設(shè)備管理器下外部接口目錄下會看到對應(yīng)的設(shè)備。
MounRiver Studio菜單欄Tools->WCH-LinkUtility
獲取當前模式

設(shè)置為WCH-LinkRV

右鍵點擊TCPServer->Properties
設(shè)置仿真器和參數(shù)如下,一般默認即可
其中SVD下是指定寄存器描述文件,這樣就可以查看各個外設(shè)寄存器



然后點擊甲殼蟲圖標進入仿真環(huán)境并下載程序


可以查看外設(shè)寄存器。

其他仿真操作,不同IDE都大同小異不再贅述。
新版本MounRiver基于VSCODE框架深度定制,明顯比之前基于eclipse的更絲滑,輕量,美觀。同時兼容了之前版本的操作習慣,方便熟悉MRS1的用戶快速上手,另外對于熟悉VSCODE的用戶也會覺得很熟悉可以直接上手。
6.5 ISP下載程序
手里沒有WCH-LInk可以使用ISP下載
注意開發(fā)板上BOOT0默認跳線到了GND要斷開。
BOOT0接VCC,BOOT1接GND是進下載模式,
BOOT0通過下載按鍵按下接VCC


以下地址下載WCHISPTool_Setup.exe
https://www.wch.cn/downloads/WCHISPTool_Setup_exe.html
雙擊WCHISPTool_Setup.exe安裝






選擇MCU

為了方便可以先不使能讀保護,否則使能了之后下次下載前需要先解除讀保護

USB接P5,按下下載按鍵,按下復位按鍵
識別到USB設(shè)備

選擇HEX文件
CH32V307EVTEVTEXAMETHTCPServerobjTCPServer.hex

點擊下載

6.6運行
接上串口線,參數(shù)為115200-8-n-1

按鍵RST重啟
串口打印如下

Usermain.c中看到
開發(fā)板IP為
u8 IPAddr[4] = {192, 168, 1, 10}; //IP address
所以將電腦IP設(shè)置為192, 168, 1,9
打開網(wǎng)絡(luò)調(diào)試助手
作為客戶端,連接開發(fā)板的服務(wù)端192.168.1.10,端口1000
u16 srcport = 1000; //source port

客戶端發(fā)送數(shù)據(jù),開發(fā)板原樣返回
開發(fā)板打印

Intstat這個打印在如下位置添加的
void WCHNET_HandleGlobalInt(void){
u8 intstat;
u16 i;
u8 socketint;
intstat=WCHNET_GetGlobalInt(); //get global interrupt flag
printf("intstat:%xrn",intstat);
相關(guān)的處理邏輯位于
WCHNET_HandleSockInt
收到數(shù)據(jù)后原樣返回
void WCHNET_HandleSockInt(u8 socketid, u8 intstat)
{
u8i;
if (intstat&SINT_STAT_RECV) //receive data
{
WCHNET_DataLoopback(socketid); //Data loopback
}
連接時打印信息
if (intstat&SINT_STAT_CONNECT) //connect successfully
{
#if KEEPALIVE_ENABLE
WCHNET_SocketSetKeepLive(socketid, ENABLE);
#endif
WCHNET_ModifyRecvBuf(socketid, (u32) SocketRecvBuf[socketid],
RECE_BUF_LEN);
for (i=0; i
其他邏輯,斷開,超時等處理
if (intstat&SINT_STAT_DISCONNECT) //disconnect
{
for (i=0; i
-
以太網(wǎng)
+關(guān)注
關(guān)注
41文章
6137瀏覽量
181459 -
PHY
+關(guān)注
關(guān)注
2文章
340瀏覽量
54289 -
開發(fā)板
+關(guān)注
關(guān)注
26文章
6386瀏覽量
120294
發(fā)布評論請先 登錄
MII/RMII接口100M以太網(wǎng)PHY芯片 SR8201F
供應(yīng)國產(chǎn)網(wǎng)絡(luò)芯片SR9900 (USB2.0接口100M低功耗以太網(wǎng)芯片)
供應(yīng)國產(chǎn)以太網(wǎng)PHY芯片SR8201F
為什么以太網(wǎng)+柔性板與電腦無法協(xié)商為100M?
【沁恒微CH32V307評估板試用體驗】之一————開箱
基于FPGA的10M/100M以太網(wǎng)控制器的設(shè)計
LPC2138的100M以太網(wǎng)開發(fā)板原理圖
沁恒股份以太網(wǎng)擴展多外設(shè)接口芯片CH9130概述
100M以太網(wǎng)口雷擊靜電保護用GDT放電管和TVS管選型
國產(chǎn)100M以太網(wǎng)PHY:沁恒CH182H2性能測試應(yīng)用看這篇就夠了
評論