1.關于 ioLibrary_Driver
1.1. ioLibrary 概述
The ioLibrary means “Internet Offload Library” for WIZnet chip. It includes drivers and application protocols. The driver (ioLibrary) can be used for the application design of WIZnet TCP/IP chips as W5500, W5300, W5200 and W5100.
更多信息參考ioLibrary的 wiki : http://wizwiki.net/wiki/doku.php?id=products:w5500:driver
1.2. ioLibrary 下載
從 github ( https://github.com/Wiznet/ioLibrary_Driver ) 下載驅動庫
2. ioLibrary 移植STM32F4
2.1. 準備工作
首先,下載庫源碼,解壓,文件目錄如下所示:
然后,準備一個基本的STM32F4的工程,將 ioLibrary_Driver 放到工程目錄下。
2.2. 移植過程
步驟一、將用到 ioLibrary_Driver\Ethernet 下面的文件,將這些文件加入到自己的工程中。
步驟二、添加對應的頭文件目錄到工程中。
然后編譯,出現如下錯誤,將問題行注釋掉。
若編譯出現類似于如下錯誤
..\User\Ethernet\wizchip_conf.c(113): error: #29: expected an expression
.id = _WIZCHIP_ID_,
..\User\Ethernet\wizchip_conf.c(114): error: #29: expected an expression
.if_mode = _WIZCHIP_IO_MODE_,
..\User\Ethernet\wizchip_conf.c(115): error: #29: expected an expression
.CRIS._enter = wizchip_cris_enter,
..\User\Ethernet\wizchip_conf.c(116): error: #29: expected an expression
.CRIS._exit = wizchip_cris_exit,
..\User\Ethernet\wizchip_conf.c(117): error: #29: expected an expression
.CS._select = wizchip_cs_select,
..\User\Ethernet\wizchip_conf.c(118): error: #29: expected an expression
.CS._deselect = wizchip_cs_deselect,
..\User\Ethernet\wizchip_conf.c(119): error: #29: expected an expression
.IF.BUS._read_byte = wizchip_bus_readbyte,
..\User\Ethernet\wizchip_conf.c(120): error: #29: expected an expression
.IF.BUS._write_byte = wizchip_bus_writebyte
..\User\Ethernet\wizchip_conf.c(123): warning: #12-D: parsing restarts here after previous syntax error
};
..\User\Ethernet\wizchip_conf.c: 1 warning, 8 errors
主要原因是Keil MDK默認設置不支持按照結構體名稱初始化結構體的原因導致。則需要根據自己的編譯器做下設置,keil MDK設置如下所示:
直到編譯全部通過,編譯器無錯誤,無警告提示。
步驟三、W5500和STM32F4是通過SPI接口通信的,所以要配置底層SPI管腳功能及SPI工作模式。
/**
* @brief : WIZ_SPI_Init
* @note : SPI接口初始化
* 硬件連接: PA3 -> W5500_RST
* PA4 -> W5500_SCS
* PA5 -> W5500_SCK
* PA6 -> W5500_MISO
* PA7 -> W5500_MOSI
* PA8 -> W5500_INT
* @param :
* @retval :
*/
static void W5500_SPI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能GPIOA時鐘
/* W5500_RST引腳初始化配置(PA2) */
GPIO_InitStructure.GPIO_Pin = W5500_RST;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //普通輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽輸出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(W5500_RST_PORT, &GPIO_InitStructure);
GPIO_SetBits(W5500_RST_PORT, W5500_RST); // 設置高電平,W5500不會進入復位模式
/* 初始化CS引腳 */
GPIO_InitStructure.GPIO_Pin = W5500_SCS;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(W5500_SCS_PORT, &GPIO_InitStructure);
GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);
// Enable SPI and GPIO clocks
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
//SPI口初始化 Set PA5,6,7 as Output push-pull - SCK, MISO and MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SPI_I2S_DeInit(SPI1);
//初始化SPI結構體
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI設置為兩線全雙工
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI發送接收8位幀結構
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //串行時鐘在不操作時,時鐘為低電平
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第一個時鐘沿開始采樣數據
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由軟件(使用SSI位)管理
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //SPI波特率預分頻值為 2
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //數據傳輸從MSB位開始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值計算的多項式
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //設置SPI為主模式
SPI_Init(SPI1, &SPI_InitStructure); //根據SPI_InitStruct中指定的參數初始化外設SPI1寄存器
SPI_Cmd(SPI1, DISABLE);
/* Enable SPI1 */ //使能SPI外設
SPI_Cmd(SPI1, ENABLE); //啟動傳輸
}
步驟四、在 wizchip_conf.h 文件中,有以下幾個功能回調注冊函數:
void reg_wizchip_cris_cbfunc(void(*cris_en)(void), void(*cris_ex)(void));
void reg_wizchip_cs_cbfunc(void(*cs_sel)(void), void(*cs_desel)(void));
void reg_wizchip_bus_cbfunc(iodata_t (*bus_rb)(uint32_t addr), void (*bus_wb)(uint32_t addr, iodata_t wb));
void reg_wizchip_spi_cbfunc(uint8_t (*spi_rb)(void), void (*spi_wb)(uint8_t wb));
void reg_wizchip_spiburst_cbfunc(void (*spi_rb)(uint8_t* pBuf, uint16_t len), void (*spi_wb)(uint8_t* pBuf, uint16_t len));
根據以上幾個接口設定的函數接口,添加如下代碼
/**
* @brief : WIZ_CS
* @note : 選擇W5500
* @param :
* @retval :
*/
static void W5500_CS_Select(void)
{
GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS為低電平
}
/**
* @brief : SPI_CS_Deselect
* @note : 去選擇W5500
* @param :
* @retval :
*/
static void W5500_CS_Deselect(void)
{
GPIO_SetBits(W5500_SCS_PORT, W5500_SCS); //置W5500的SCS為高電平
}
/**
* @brief : W5500_WriteByte
* @note : W5500 寫
* @param :
* @retval :
*/
static void W5500_WriteByte(uint8_t byte)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, byte);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
SPI_I2S_ReceiveData(SPI1);
}
/**
* @brief : W5500_ReadByte
* @note : W5500 讀
* @param :
* @retval :
*/
static uint8_t W5500_ReadByte(void)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, 0xFF);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return (SPI_I2S_ReceiveData(SPI1));
}
步驟五、W5500正常工作還需配置MAC地址,IP地址,子網掩碼等網絡配置信息。
/**
* @brief : W5500_Network_Init
* @note : W5500 網絡初始化
* @param :
* @retval :
*/
static void W5500_Network_Init(void)
{
uint8_t chipid[6];
wiz_NetInfo gWIZNETINFO;
uint8_t mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11}; ///< Source Mac Address
uint8_t ip[4]={192,168,100,150}; ///< Source IP Address
uint8_t sn[4]={255,255,255,0}; ///< Subnet Mask
uint8_t gw[4]={192,168,100,1}; ///< Gateway IP Address
uint8_t dns[4]={8,8,8,8}; ///< DNS server IP Address
memcpy(gWIZNETINFO.ip, ip, 4);
memcpy(gWIZNETINFO.sn, sn, 4);
memcpy(gWIZNETINFO.gw, gw, 4);
memcpy(gWIZNETINFO.mac, mac,6);
memcpy(gWIZNETINFO.dns,dns,4);
gWIZNETINFO.dhcp = NETINFO_STATIC; //< 1 - Static, 2 - DHCP
ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);
ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);
// Display Network Information
ctlwizchip(CW_GET_ID,(void*)chipid);
printf("\r\n=== %s NET CONF ===\r\n",(char*)chipid);
printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],
gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);
printf("SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);
printf("GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);
printf("SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);
printf("DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);
printf("======================\r\n");
wizchip_init(NULL, NULL);
wiz_NetTimeout w_NetTimeout;
w_NetTimeout.retry_cnt = 50;
w_NetTimeout.time_100us = 1000;
wizchip_settimeout(&w_NetTimeout);
}
步驟六、初始化W5500相關設定。
/**
* @brief : W5500_Init
* @note : 初始化
* @param :
* @retval :
*/
void W5500_Init(void)
{
W5500_SPI_Init();
for(int i=0x5FFF; i>0; i--); // 短暫延時,不然導致初始化失敗
reg_wizchip_cris_cbfunc(NULL, NULL); // 注冊臨界區函數
reg_wizchip_cs_cbfunc(W5500_CS_Select, W5500_CS_Deselect);// 注冊片選函數
reg_wizchip_spi_cbfunc(W5500_ReadByte, W5500_WriteByte); // 注冊讀寫函數
W5500_Network_Init();
}
步驟七、到這里,移植基本上完成。編譯工程保證無錯誤,無警告輸出。
3. 基于ioLibrary的應用
3.1. 功能測試
步驟一、將用到 ioLibrary_Driver\Application 的文件添加到工程
步驟二、包含對應頭文件路徑。
步驟三、添加應用代碼到主流程中。
/**
* @brief Main program
* @param None
* @retval None
*/
int main(void)
{
uint8_t dest_ip[4] = {192, 168, 10, 13};
uint16_t dest_port = 8080;
uint8_t dataBuffer[DATA_BUF_SIZE]={0x0};
RCC_ClocksTypeDef RCC_Clocks;
/* SysTick end of count event each 10ms */
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
/* Add your application code here */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USART1_NVIC_Config(0,1);
LED_Init();
USART1_Init();
W5500_Init();
/* Infinite loop */
while (1)
{
loopback_tcpc(0x0, dataBuffer, dest_ip, dest_port);
LEDA_ON;LEDB_OFF;
Delay(50);
LEDA_OFF;LEDB_ON;
Delay(50);
}
}
步驟四、調整工程堆棧配置(根據功能需要,自定大小)。
步驟五、啟動網絡調試助手,適當配置。
步驟六、編譯程序,燒寫到單片機中,重啟。查看連接對象中是否出現,TCP-Client,選擇點擊發送按鈕,能收到回文,代表測試成功。
3.2. ping 測試
我們ping下程序里面的IP試試,能ping通,看來沒什么大問題了。
4、測試代碼
CSDN下載鏈接:https://download.csdn.net/download/xiayufeng520/10293822
上一篇:STM32F407之模擬I2C(二)之24C128
下一篇:STM32內存使用及分配
推薦閱讀
史海拾趣
2000年,冠西電子在臺灣證券交易所成功上市,標志著公司進入了一個新的發展階段。上市不僅為冠西電子提供了更多的資金支持,也提升了其品牌知名度和市場影響力。冠西電子借此機會進一步加大在研發、生產、銷售等方面的投入,推動公司業務的全面發展。
隨著CMOS MEMS諧振器技術的不斷成熟,Discera公司開始注重專利的申請和保護。他們投入大量資源用于技術研發和專利申請,逐漸在MEMS諧振器技術領域積累了大量的專利。這些專利不僅保護了公司的核心技術,也為公司的持續發展提供了堅實的法律保障。
隨著業務的不斷發展和市場的不斷擴大,DIALIGHT公司逐漸實現了全球化布局。他們在美國、英國、丹麥、德國、馬來西亞、新加坡、澳大利亞、墨西哥和巴西等地設立了分支機構或辦事處,為全球客戶提供及時、高效的服務。此外,DIALIGHT還積極尋求與其他企業的合作與共贏,通過戰略合作協議的簽署,為雙方帶來新的業務機遇和合作空間。這些舉措不僅增強了DIALIGHT的市場競爭力,也為其未來的發展奠定了堅實的基礎。
請注意,由于篇幅限制,以上三個故事僅為DIALIGHT公司發展歷程的簡要概述。如需更詳細的信息和更多故事,建議查閱相關資料或訪問公司官網。
在電子行業的早期,Advanced Fibreoptic Engineering Ltd(以下簡稱AFE公司)還是一個名不見經傳的小企業。然而,隨著技術的不斷進步,AFE公司憑借其在光纖技術領域的深厚積累,成功研發出了一種具有劃時代意義的新型光纖材料。這種材料不僅傳輸速度快,而且損耗極低,極大地提高了數據傳輸的效率和質量。這一技術突破迅速為AFE公司贏得了市場認可,公司的訂單量激增,業績逐年攀升。
隨著技術的推廣和應用,AFE公司的光纖產品逐漸在通信、醫療、工業等多個領域得到廣泛應用。公司不僅在國內市場占據了一席之地,還積極拓展海外市場,與國際知名企業建立了穩定的合作關系。憑借卓越的產品性能和良好的市場口碑,AFE公司逐漸在電子行業中嶄露頭角,成為了光纖技術領域的佼佼者。
以上是第一個故事的示例,若您想要探索更多關于AFE公司的發展故事,請輸入繼續。
(注:由于我無法實時獲取具體公司的實際發展故事,以上故事為虛構內容,僅用于展示故事編寫風格和結構。如果您需要真實、具體的故事,請提供更多關于AFE公司的信息,以便我能為您編寫更貼近實際的內容。)
隨著環保意識的日益增強,Cantherm公司積極響應國家號召,將環保理念融入產品設計和生產過程中。公司研發出一系列環保型電子產品,采用可降解材料和節能技術,有效降低了產品對環境的影響。這一舉措不僅提升了公司的社會形象,還為公司帶來了更多的環保項目合作機會。
隨著電子市場的日益競爭,Cantherm公司面臨著市場拓展的難題。為了打開新的銷售渠道,公司決定加大在國際市場的宣傳力度,同時積極參加各種電子行業的展會和論壇。通過與國際同行的交流與合作,Cantherm不僅提升了品牌知名度,還成功拓展了海外市場,實現了業務的多元化發展。
手機上WAP網站收發郵件,真正的移動電郵.最近玩了幾個手機上網發郵件的WAP站。將自己的經驗和大家共享一下.有好的東西希望回帖頂下!1.中國移動的WAP郵.性能非常穩定,功能也不錯,有短信提示功能等.但是,最大的問題是收費!呵呵,這個是個 ...… 查看全部問答∨ |
|
摘要:為解決大容量有源電力濾波器面臨的大容量和開關頻率之間的矛盾,本文介紹一種采用多重化主電路的大容量有源電力濾波器,給出系統的主電路結構和系統的控制方法。實驗表明該系統有效地解決了有源電力濾波器容量與開關頻率的矛盾,取得了滿意的 ...… 查看全部問答∨ |
|
2007全民奮斗史---eeworld獻給堅守崗位辛勤耕耘的各位高工 工作學習了又一年,累了吧? 坐下來,品品茶,歇歇腳,看看我們為您準備了什么? 放松心態,或許沉思,或許微笑,來到這里,來到這真正的工程師歡樂的家園。 … 查看全部問答∨ |
|
我是用C#進行開發的,直接部署到設備上運行沒有問題,但是生成cab安裝文件,在設備上安裝失敗,提示“文件不是有效windows CE安裝文件”。系統是wince 5.0… 查看全部問答∨ |
|
出現如下錯誤 BUILD: [00:0000000026:PROGC ] Building LIB Pass in D:\\WINCE600\\PLATFORM\\LPC32XX\\src\\drivers\\GPIO\\ directory. BUILD: [01:0000000036:PROGC ] Linking D:\\WINCE600\\platform\\LPC32XX\\lib\\ARMV4I\\debug\\GPIO.li ...… 查看全部問答∨ |