一、概述
本文應用主要是使用SPI驅動wiznet的網絡接口芯片W5xxx,根據wiznet提供的ioLibrary_Driver庫支持W5100、W5100S、W5200、W5300、W5500。主要從以下幾點進行說明:
使用hpm_sdk的cmake框架對接wiznet的ioLibrary_Driver。
ioLibrary_Driver的底層讀寫相關操作接口注冊對接。
以ioLibrary_Driver庫測試wiznet的速率性能。
本文不做wiznet芯片相關寄存器闡述,只簡單闡述W5xxx的通信機制。
本文以W5500作為本文測試芯片。
本文例子倉庫分支地址:
https://github.com/RCSN/hpm_sdk_extra/tree/feature/add_spi_drive_wizchip_w5xxx_sample/spi_drive_wizchip_w5xxx
二、流程
(一)使用hpm_sdk的cmake框架對接wiznet的ioLibrary_Driver
在一些開源項目上,可能并沒有使用cmake來進行搭建,而hpm_sdk基于cmake構建,所以在移植的過程中,建議使用cmake框架加入開源項目。本文以對接wiznet的ioLibrary_Driver作為例子供開發者相關參考。
wiznet的ioLibrary_Driver倉庫地址:
https://github.com/Wiznet/ioLibrary_Driver
里面包含了w5xxx的驅動程序以及應用程序協議,使用該庫基本可以很快能對接好相應的功能實現。
需要關心的是Ethernet文件夾,里面包含了如W5500,W5300,W5200,W5100,W5100S的讀寫相關中間層,還提供了socket應用層操作接口。
1、芯片讀寫操作層加入
在此庫中,僅支持一款w5xxx,所以添加到工程,也只能是一個芯片讀寫操作的文件夾。在每個芯片上加入cmakelists文件,把對應的頭文件包含以及添加對應的C文件。
如以下:比如W5100文件夾,使用sdk_inc和sdk_src命令,把該文件下的所需的文件進行添加以及包含該文件夾的頭文件。
2、Ethernet文件加入
外層想使用文件夾的時候,可以通過set一個參數來判斷對應的芯片操作選擇,然后再添加ethernet內部的socket.c和config.c文件。
通過CONFIG_WIZNET參數來進行對不同芯片加入篩選,以及加入兩個宏定義,一個是給config表示目前使用的是哪個芯片,一個是讓app知道引用的是哪個頭文件。
3、APP加入ioLibrary_Driver相關文件。
在本文中,使用的芯片是W5500,需要用到DHCP和ioLibrary_Driver里面application的loopback的tcp client接口,那么在app的camkelist可以做以下操作:
(1)set(CONFIG_WIZNET "w5500") 設置CONFIG_WIZNET為w5500,這樣cmake到ioLibrary_Driver索引時候只添加w5500這個文件夾。
(2)add_subdirectory(ioLibrary_Driver) 加入ioLibrary_Driver文件目錄
(3)sdk_app_src sdk_inc 加入ioLibrary_Driver需要的相關文件和頭文件
4、使用sdk_env的start_gui生成工程或者使用命令行生成都可以。這里使用start_gui
可以看到ioLibrary_Drivers對應的目錄和文件都已經添加到SES。
如此編譯也Ok
(二)ioLibrary_Driver的底層讀寫相關操作接口注冊對接
在ioLibrary_Drivers的config上,需要接口注冊的主要是臨界區、CS片選操作、單字節收發、塊收發傳輸接口。在該庫中也有對應的注冊接口wizchip_conf.h中。
1、臨界區注冊
這里臨界主要做全局中斷的使能和禁止,可根據自身應用添加
2、CS片選信號操作注冊
在這里為了避免CS拉低后存在較高的間隔,實際的拉低在actual_cs_sel API操作,就是在開啟SPI傳輸的時候調用,具體請詳見 玩轉先楫SPI外設系列 文章,這里不做闡述說明。
cs操作接口使用sdk對應的board的cs操作API,可自行根據應用更改。
3、讀寫單字節操作注冊
需要注意的是,這里為了方便快速操作,比如在讀接口SPI設置為只讀,然后設置傳輸長度,復位FIFO,開啟傳輸,等待數據接收完成后讀取數據。寫接口也是如此。具體請詳見 玩轉先楫SPI外設系列 文章,這里同樣不做闡述說明。
4、塊讀寫傳輸操作注冊
DMA相關的操作請詳見 玩轉先楫SPI外設系列 文章,這里同樣不做闡述說明。
5、注冊相關操作接口
(三)以ioLibrary_Driver庫測試wiznet的速率性能。
W5500官方手冊中,雖然可以支持到80M的SPI SCLK,但官方的建議是33.3M推薦頻率,再高的頻率會出現些許采樣問題,在實際測試的過程中也是如此,hpm_sdk的Board.h默認為20M,本文SLCK的頻率調整為30M左右測試。
在性能上,wiznet官方也出了W5500對應的MAX速率為15Mbps。如果需要更高的可以選擇W5100/s
在本文所實現的例子實現中,可通過cmakelists開啟或者關閉DHCP,或者開啟和關閉tcp iperf測試。默認都是開啟。
如果想靜態IP分配,那么直接在main.c中更改load_net_parameters API里面的ip值即可。
這里iperf測試主要測試W5500作為Tcp client的發送性能。在SPI SCLK 30M下,可以達到17Mbps速度性能,與wiznet官方提供的15Mbsps速率相當,滿足性能需求。
目前ioLibrary_Driver庫性能還能繼續提升,比如修改socket的send和recv實現邏輯,減少查詢和等待;中間層少數據收發再次封裝等等。
在邏輯分析儀下,socket的發送接口send,在實際發送前,會查詢以及等待相關網絡狀態寄存器,占用了不少時間。wiznet提供的15mbps只有理論的一半性能也是這個時間所消耗引起。
三、總結
在ioLibrary_Driver庫下,hpm的SPI驅動W5500的網絡性能可以達到17Mbps,與wiznet官方的15Mbps保持一致。
如果需要提高性能,可以選擇wetne其他芯片。或者自身優化wiznet的ioLibrary_Driver庫。比如socket的發送send邏輯。
對于HPM6200,HPM5300等先楫通用MCU沒有以太網接口,但是有實際以太網需求或者方案平替,可以選擇SPI驅動相關的芯片網絡接口。
-
芯片
+關注
關注
455文章
50714瀏覽量
423139 -
單片機
+關注
關注
6035文章
44554瀏覽量
634635 -
網絡
+關注
關注
14文章
7553瀏覽量
88729 -
SPI
+關注
關注
17文章
1706瀏覽量
91505
發布評論請先 登錄
相關推薦
評論