راه اندازی W5500 با Stm32f1

شبکه اترنت چیست؟
اترنت (Ethernet) یک فناوری شبکهسازی سیمی است که برای شبکههای محلی (LAN) طراحی شده و استانداردهای آن توسط IEEE تحت عنوان IEEE 802.3 تعریف میشوند. این فناوری امکان انتقال دادهها بین دستگاههای متصل به شبکه را با سرعتهای مختلف فراهم میکند.
اترنت همچنین می تواند نحوه انتقال داده ها در یک شبکه را نشان دهد و فرمت داده ها را به گونه ای در بیاورد که سایر دستگاههای شبکه بتوانند به دریافت و پردازش آن بپردازند و آن را تشخیص دهند.
مزایای شبکه اترنت
-
قابلیت اطمینان بالا
ارتباط سیمی نسبت به ارتباطات بیسیم از ثبات و اطمینان بیشتری برخوردار است.
-
سرعت انتقال بالا
پشتیبانی از سرعتهای مختلف از 10 مگابیت بر ثانیه تا 100 گیگابیت بر ثانیه.
-
امنیت
دسترسی فیزیکی مورد نیاز است، بنابراین نفوذ به شبکه سختتر است.
-
تأخیر کم
مناسب برای برنامههای حساس به زمان مانند سیستمهای صنعتی.
پروتکل های رایج شبکه
-
TCP/IP
پروتکل اصلی ارتباطات شبکهای
-
UDP
برای ارتباطات بدون اتصال و سریع
-
DHCP
تخصیص خودکار آدرس IP
-
DNS
تبدیل نام دامنه به آدرس IP
-
HTTP/HTTPS
برای ارتباطات وب
معرفی تراشههای مهم کنترلر اترنت
1. ENC28J60
– ساخت میکروچیپ (Microchip)
– پشتیبانی از 10BASE-T
– رابط SPI
– حافظه بافر 8 کیلوبایت
– مناسب برای کاربردهای ساده با حجم داده کم
2. W5100
– ساخت (Wiznet)
– پشتیبانی از 10/100BASE-T
– رابط SPI و موازی
– دارای 4 سوکت مستقل
– مناسب برای سیستمهای نه چندان پیچیده
3. W5200
– نسخه بهبود یافته W5100
– پشتیبانی از 10/100BASE-T
– رابط SPI با سرعت بالا
– 8 سوکت مستقل
– مصرف انرژی بهینهتر
4. W5500
– پر استفاده ترین مدل از خانواده WizNet
– پشتیبانی از 10/100BASE-T
– رابط SPI پرسرعت
– 8 سوکت مستقل
– مصرف انرژی بسیار بهینه
– دارای ویژگیهای امنیتی پیشرفته
5. W6300
– جدیدترین مدل از خانواده WizNet
– پشتیبانی از 10/100BASE-T
– رابط QSPI پرسرعت
– 8 سوکت مستقل
- IPv4/v6
– مصرف انرژی بسیار بهینه
– دارای ویژگیهای امنیتی پیشرفته
6. LAN8720/40
– ساخت SMSC (اکنون متعلق به میکروچیپ)
– پشتیبانی از 10/100BASE-T
– رابط RMII برای اتصال به میکروکنترلرها
– مناسب برای سیستمهای embedded پیشرفته
7. DP83848
– ساخت Texas Instruments
– پشتیبانی از 10/100BASE-T
– رابط MII و RMII
– مقاوم در برابر شرایط محیطی سخت
– مناسب برای کاربردهای صنعتی
به علت کاربردهای فراوان شبکه های اترنت در سیستمهای امبدد توانایی کار با این پروتکل و پیاده سازی و اجرای آن توسط پردازنده های مختلف و روشهای مختلف یکی از توانایی های اساسی یک مهندس سیستمهای امبدد میباشد.
برای پیاده سازی شبکه اترنت با استفاده از میکروکنترلرها با توجه به نوع میکروکنترلرو قابلیتهای آن دو روش مختلف وجود دارد در حالت اول درصورتی که میکرو موردنظر دارای واحد ETH باشد میتوان با استفاده از یک ایسی Phy خارجی یا همان لایه فیزیکی خارجی ارتباط اترنت را برقرار نمود.
در این حالت انواع پروتکلهای شبکه مانند TCP-IP,UDP و.. بایستی به طورکامل توسط کاربر یا با استفاد از کتابخانه های موجود مانند lwip پیاده سازی شود.
روش دیگر که بیشتر مناسب پردازنده هایی میباشد که واحد اترنت ندارند در این حالت بایستی از یک ایسی واسط خارجی که استک TCP/IP به همراه لایه MAC و لایه PHY را به صورت یکجا در خود دارد استفاده نمود.
معرفی تراشه W5500
تراشه W5500 یک کنترلر اترنت همهکاره است که توسط شرکت wiznet طراحی و تولید شده است. این تراشه با بهرهگیری از فناوریهای پیشرفته، امکان پیادهسازی ارتباطات شبکهای پایدار و پرسرعت را در سیستمهای embedded فراهم میکند.
مشخصات فنی
-
پروتکلهای پشتیبانی شده
IPv4, TCP, UDP, ICMP, IGMP, PPPoE, DHCP, ARP, DNS
-
سرعت ارتباط
10/100 مگابیت بر ثانیه
-
رابط ارتباطی
SPI (مد0،0) با حداکثر فرکانس 80 مگاهرتز
-
تعداد سوکتهای مستقل
8 سوکت
-
حافظه بافر
32 کیلوبایت (تخصیص پویا بین سوکتها)
-
ولتاژ کاری
3.3V با تحمل ورودی 5V
-
مصرف جریان
~80mA در حالت فعال (100BASE-T)، ~50mA (10BASE-T)
-
پکیج
LQFP48 (7x7mm)
معماری داخلی W5500
-
بلوک PHY
مسئول ارتباط فیزیکی با کابل اترنت
-
بلوک MAC
کنترل دسترسی به محیط انتقال
-
حافظه بافر
برای ذخیرهسازی موقت دادههای ارسالی و دریافتی
-
کنترلر SPI
مدیریت ارتباط با میزبان
-
رجیسترهای کنترل
تنظیم پارامترهای عملیاتی تراشه
قابلیتهای منحصر به فرد W5500
1. عملکرد چندسوکته همزمان
W5500 از 8 سوکت مستقل پشتیبانی میکند که میتوانند همزمان فعال باشند. هر سوکت میتواند به صورت مستقل پیکربندی شود و از پروتکلهای مختلف (TCP، UDP، و غیره) استفاده کند.
2. مدیریت هوشمند حافظه
حافظه 32 کیلوبایتی تراشه به صورت پویا بین سوکتها تخصیص مییابد. این ویژگی باعث میشود منابع حافظه به صورت بهینه استفاده شوند و از هدر رفت فضای ذخیرهسازی جلوگیری شود.
3. پشتیبانی از ارتباطات پرسرعت
با استفاده از رابط SPI پرسرعت (تا 80 مگاهرتز)، W5500 میتواند دادهها را با سرعت بالا انتقال دهد که برای کاربردهای بلادرنگ بسیار مناسب است.
4. مصرف انرژی بهینه
W5500 با بهرهگیری از فناوریهای کاهش مصرف انرژی، گزینهای ایدهآل برای سیستمهای باتریخور یا کممصرف است. این تراشه از حالتهای خواب (Sleep) و کممصرف (Power Down) پشتیبانی میکند.
5. پشتیبانی از Wake-on-LAN
این ویژگی امکان روشن کردن دستگاه از طریق شبکه را فراهم میکند که در سیستمهای مدیریت از راه دور بسیار مفید است.
6. عملکرد بدون نیاز به سیستم عامل
برخلاف بسیاری از راهحلهای شبکهای که نیاز به پشته TCP/IP روی میزبان دارند، W5500 دارای پشته سختافزاری TCP/IP است و نیاز به منابع پردازشی میزبان را به حداقل میرساند.
7. پایداری و اطمینان بالا
W5500 دارای مکانیزمهای تشخیص و تصحیح خطا است که باعث افزایش قابلیت اطمینان ارتباطات شبکهای میشود.
8. پشتیبانی از شبکههای صنعتی
این تراشه برای محیطهای صنعتی بهینه شده و میتواند در محدوده وسیعی از دما و شرایط محیطی کار کند.
کاربردهای W5500:
– سیستمهای اتوماسیون صنعتی
– دستگاههای اینترنت اشیا (IoT)
– سیستمهای نظارت و کنترل از راه دور
– تجهیزات پزشکی متصل به شبکه
– سیستمهای امنیتی و نظارتی
– دستگاههای هوشمند خانگی
– کنترلرهای صنعتی (PLC)
– ترمینالهای پرداخت
مزایای W5500 نسبت به رقبا:
-
پیادهسازی ساده
با داشتن پشته TCP/IP سختافزاری، پیادهسازی شبکه بسیار سادهتر میشود.
-
کاهش بار پردازشی
بار پردازشی TCP/IP از دوش پردازنده اصلی برداشته میشود.
-
پایداری بالا
عملکرد پایدار حتی در شرایط نامساعد شبکه.
-
مستندات کامل
کتابخانهها و نمونه کدهای آماده برای پلتفرمهای مختلف.
-
قیمت رقابتی
نسبت به عملکرد ارائه شده، قیمت مناسبی دارد.
معایب و محدودیتها:
-
پشتیبانی از IPv6
این تراشه از IPv6 پشتیبانی نمیکند.البته مدلهای جدید سری 6000 از IPv6 پشتیبانی میکنند.
-
محدودیت سرعت
فقط تا 100 مگابیت بر ثانیه پشتیبانی میکند.
-
وابستگی به SPI
در صورت نیاز به پهنای باند بسیار بالا، رابط SPI ممکن است محدودیت ایجاد کند.
-
مستندات کامل
کتابخانهها و نمونه کدهای آماده برای پلتفرمهای مختلف.
-
قیمت رقابتی
نسبت به عملکرد ارائه شده، قیمت مناسبی دارد.
نتیجهگیری:
تراشه W5500 با ترکیب ویژگیهای پیشرفته، مصرف انرژی بهینه و پیادهسازی ساده، به یکی از محبوبترین راهحلهای شبکهسازی برای سیستمهای embedded تبدیل شده است. این تراشه به ویژه برای کاربردهای اینترنت اشیا و اتوماسیون صنعتی که نیاز به ارتباطات شبکهای پایدار با حداقل بار پردازشی دارند، گزینهای ایدهآل محسوب میشود. با توجه به مستندات کامل و جامعه کاربری گسترده، W5500 میتواند انتخاب مناسبی برای طیف وسیعی از پروژههای شبکهای باشد.
راه اندازی اولیه W5500
برای راه اندازی اولیه تراشه W5500 نیاز هست که دیتاشیت این چیپ را حتما یکبار مطالعه نمایید.
برای کار با این تراشه و راه اندازی آن احتیاج به یک لایبرری برای انجام تنظیمات اولیه و خواندن و نوشتن در رجیسترهای چیپ W5500 نیاز هست.خوشبختانه خود شرکت WizNet این کار رو برای ما انجام داده و یک کتابخانه کامل به نام ioLibrary_Driver منتشر کرده که از لینک زیر میتوانید دانلود نمایید.
بعداز دانلود کتابخانه داخل پوشه اصلی 3 فولدر با نامهای زیر موجود میباشد.
Application
Ethernet
Internet
در داخل پوشه Ethernet تعدادی پوشه همنام چیپ های WizNet موجود میباشد که فایلهای داخل آن برای خواندن و نوشتن روی هر چیپ استفاده میشود.
همچنین دوفایل با نامهای socket.c و socket.h نیز موجود هستند که از این فایلها برای کار با سوکتها در چیپهای WizNet استفاده میشود.
در کنار این دو فایل دو فایل دیگر نیز با نامهای wizchip_conf.c و wizchip_conf.h موجود میباشد و از این دو فایل برای کانفیگ چیپهای ویزنت استفاده میشود.
پوشه مهم بعدی پوشه Internet میباشد که در این فولدر تعدادی فولدر دیگر موجود میباشد که هرکدام از آنها و فایلهای داخل آنها مختص پیاده سازی یکی از پروتکلهای شبکه میباشد.
در ادامه با یک مثال ساده قصد دارم با استفاده از میکروکنترلر Stm32f1 چیپ W5500 را راه اندازی اولیه نمایم.
برای این منظور من از میکرو stm32f103C8T6 استفاده میکنم.
همینطور که داخل دیتاشیت W5500 دیدید برای ارتباط با تراشه ما نیاز به یک پورت SPI داریم همچنین یک پورت UART و یک LED هم برای دیباگ لازم دارم.
ساخت پروژه در CubeIde
ابتدا نرم افزار STM32CubeIDE را اجرا میکنیم .سپس از منوی File بر روی New و سپس STM32 Project کلیک میکنیم.
در پنجره باز شده کنترلر موردنظر خود را انتخاب کرده و بر روی Next کلیک میکنیم.
در مرحله بعد کافیست یک نام برای پروژه خود انتخاب نماییم و بر روی Finish کلیک نمایید.
در صفحه باز شده با توجه به سخت افزار خود پورت SPI و در صورت نیاز UART را فعال نمایید.
برای داشتن یک ارتباط موفق از طریق SPI کافیست کلاک SPI رو بر روی مقداری بین 2 تا 5 مگاهرتز تنظیم نمایید.(بعد از برقراری ارتباط موفق میتوانید در صورت نیاز کلاک spi خود را افزایش دهید).
همچنین مد را بر رو مد صفر سایز دیتا 8 بیتی و ارسال داده از سمت بیت باارزشتر Msb قراردهید.
بعد از انجام سایر تنظیمات مورد نیاز میکرو مانند منبع کلاک اصلی و ضرایب PLL و سایر تنظیمات مورد نیاز با ذخیره سازی پروژه کد پروژه را تولید نمایید.
اضافه کردن فایلهای مورد نیاز:
برای راه اندازی W5500 با stm32f1 به فایلهای زیر نیاز میباشد.
dhcp.c,dhcp.h, socket.c, socket.h, wizchip_conf.h, wizchip_conf.c و پوشه W5500
این فایلها را مطابق شکل زیر به پروژه خود اضافه نمایید.
بعد از اماده سازی پروژه سراغ کد نویسی آن میرویم.
ابتدا فایل main.c را باز کرده و هدر فایلهای زیر را به پروژه اضافه میکنیم.
#include <string.h> #include <stdbool.h> #include <stdio.h> #include "socket.h" #include "dhcp.h
در مرحله بعد متغیرهای زیر را تعریف میکنیم.نکته مهم این متغیرها متغیر net_info میباشد که دیتا تایپ آن Wiz_NetInfo میباشد.
این متغیر یک استراکچر میباشد که دارای فیلدهای مختلف برای نگه داری پارامترهای مرتبط با شبکه می باشد که به صورت زیر است.
ما در ابتدای کار نیاز داریم مقدار مک آدرس و همچنین مد DHCP را تنظیم کنیم که در این مثال چون میخواهیم از DHCP استفاده کنیم مقدار آن را روی 2 قرار دادیم.
uint8_t mac[6]; ///< Source Mac Address
uint8_t ip[4]; ///< Source IP Address
uint8_t sn[4]; ///< Subnet Mask
uint8_t gw[4]; ///< Gateway IP Address
uint8_t dns[4]; ///< DNS server IP Address
dhcp_mode dhcp; ///< 1 – Static, 2 – DHCP
wiz_NetInfo net_info = { .mac = { 0x0c, 0x29, 0xab, 0x7c, 0x00, 0x01 }, .dhcp = NETINFO_DHCP }; uint8_t dhcp_buffer[1024]; uint8_t dns_buffer[1024]; volatile bool ip_assigned = false;
بعد از انجام مقداردهی های بالا نیاز است یکسری توابع خاص را تعریف کنیم.
این لایبرری به صورتی نوشته شده است که برای خواندن و نوشتن در رجیسترها و یکسری عملیات های دیگر مثل انتخاب تراشه(Chip Select) تعدادی توابع به صورت فانکشن پوینتر نوشته شده است و نیاز است ما توابع جایگزین را براساس اتصالات سخت افزاری خود پیاده سازی کرده و به کتابخانه معرفی نماییم. که این کار را به صورت زیر انجام میدهیم.
void wizchipSelect(void) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); } void wizchipUnselect(void) { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); } void wizchipReadBurst(uint8_t* buff, uint16_t len) { HAL_SPI_Receive(&hspi2, buff, len, HAL_MAX_DELAY); } void wizchipWriteBurst(uint8_t* buff, uint16_t len) { HAL_SPI_Transmit(&hspi2, buff, len, HAL_MAX_DELAY); } uint8_t wizchipReadByte(void) { uint8_t byte; wizchipReadBurst(&byte, sizeof(byte)); return byte; } void wizchipWriteByte(uint8_t byte) { wizchipWriteBurst(&byte, sizeof(byte)); } void Callback_IPAssigned(void) { ip_assigned = true; } void Callback_IPConflict(void) { ip_assigned = false; }
بعد از تعریف توابع مورد نیاز لازم است تابع دیگری برای مقداردهی اولیه چیپ W5550 تعریف نمایید. این تابع را تحت نام W5500Init تعریف میکنیم.
در این تابع ابتدا نیاز است توابع Callback تعریف شده در قسمت قبل رجیستر شوند این کار به صورت زیر انجام میشود.
reg_wizchip_cs_cbfunc(wizchipSelect, wizchipUnselect); reg_wizchip_spi_cbfunc(wizchipReadByte, wizchipWriteByte); reg_wizchip_spiburst_cbfunc(wizchipReadBurst, wizchipWriteBurst);
اکنون نوبت آن است که تنظیمات مورد نیاز W5500 مانند اختصاص بافر ارسال و دریافت به هر سوکت در چیپ اعمال شود که این کار با فراخوانی تابع wizchip_init به صورت زیر انجام میشود.
در بخش کد زیر به هر بافر ارسال و دریافت سوکت در تراشه مقدار 2 کیلوبایت حافظه اختصاص داده شده است.
uint8_t rx_tx_buff_sizes[] = {2, 2, 2, 2, 2, 2, 2, 2}; wizchip_init(rx_tx_buff_sizes, rx_tx_buff_sizes);
بعد از اختصاص حافظه به هر یک از 8 سوکت چیپ باید تنظیمات مربوط به استفاده از DHCP را وارد بکنیم برای این کار لازم است مقدار MAC آدرس را ست نماییم و بعد از آن تابع DHCP_init را فراخوانی کرده و پارامترهای لازم را به تابع ارسال نماییم.
بعد از فراخوانی تابع DHCP_init بایستی توابع CallBack مربوط به DHCP را نیز رجیستر نماییم.
// set MAC address before using DHCP setSHAR(net_info.mac); DHCP_init(DHCP_SOCKET, dhcp_buffer); reg_dhcp_cbfunc( Callback_IPAssigned, Callback_IPAssigned, Callback_IPConflict );
بعد از انجام تنظیمات بالا کافیست تابع DHCP_run را فراخوانی کرده و منتظر میمانیم تا ip توسط dhcp به چیپ اختصاص داده شود.
uint8_t dhcp_ret = DHCP_run(); while(dhcp_ret != DHCP_IP_LEASED) { printf("Waiting DHCP: %d\r\n", dhcp_ret); //led_toggle(); HAL_Delay(500); dhcp_ret = DHCP_run(); }
بعد از انجام مراحل گفته شده ip,sn,gw مناسب به چیپ اختصاص داده شده است و ما میتوانیم آن ها را از سرور DHCP دریاف نماییم و در انتها با فراخوانی تابع wizchip_setnetinfo مقادیر را در چیپ ست می کنیم.
getIPfromDHCP(net_info.ip); getGWfromDHCP(net_info.gw); getSNfromDHCP(net_info.sn); wizchip_setnetinfo(&net_info);
در نهایت کد کامل مربوط به تابع W5500Init به شکل زیر خواهد بود.
void W5500Init() { // Register W5500 callbacks reg_wizchip_cs_cbfunc(wizchipSelect, wizchipUnselect); reg_wizchip_spi_cbfunc(wizchipReadByte, wizchipWriteByte); reg_wizchip_spiburst_cbfunc(wizchipReadBurst, wizchipWriteBurst); uint8_t rx_tx_buff_sizes[] = {2, 2, 2, 2, 2, 2, 2, 2}; wizchip_init(rx_tx_buff_sizes, rx_tx_buff_sizes); // set MAC address before using DHCP setSHAR(net_info.mac); DHCP_init(DHCP_SOCKET, dhcp_buffer); reg_dhcp_cbfunc( Callback_IPAssigned, Callback_IPAssigned, Callback_IPConflict ); uint8_t dhcp_ret = DHCP_run(); while(dhcp_ret != DHCP_IP_LEASED) { printf("Waiting DHCP: %d\r\n", dhcp_ret); //led_toggle(); HAL_Delay(500); dhcp_ret = DHCP_run(); } getIPfromDHCP(net_info.ip); getGWfromDHCP(net_info.gw); getSNfromDHCP(net_info.sn); char charData[200]; // Data holder sprintf(charData,"IP: %d.%d.%d.%d\r\nGW: %d.%d.%d.%d\r\nNet: %d.%d.%d.%d\r\n", net_info.ip[0], net_info.ip[1], net_info.ip[2], net_info.ip[3], net_info.gw[0], net_info.gw[1], net_info.gw[2], net_info.gw[3], net_info.sn[0], net_info.sn[1], net_info.sn[2], net_info.sn[3] ); HAL_UART_Transmit(&huart2,(uint8_t *)charData,strlen(charData),1000); wizchip_setnetinfo(&net_info); }
در انتها کافیست تابع W5500Init را داخل تابع main و بعد از تنظیمات اولیه پریفرالها و قبل از تابع while فراخوانی کنید.
با اتصال برد با یک کابل شبکه به یک دیوایس دارای DHCP سرور مانند یک روتر معمولی IP به چیپ اختصاص داده میشود که اگر برد با استفده از مبدل usb به سریال به pc متصل باشد IP اختصاص داده شده را میتوانید مشاهده نمایید.در غیر اینصورت از طریق منوی روتر و سرور DHCP هم میتوانید IP اختصاص داده شده را پیدا کرده و با استفاده از دستور زیر صحت ارتباط را تایید نمایید.
کافیست ترمینال را در ویندوز یا لینوکس باز کرده و دستور ping را به همراه IP اختصاص داده شده وارد نمایید.
ping IP
مثال بالا حداقل کانفیگ لازم برای استفاده راه اندازی W5500 با stm32f1 میباشد.بعداز انجام این مراحل میتوانید انواع پروتکلهای لایه کاربری مثل http یا mqtt و غیره را پیاده سازی نمایید.
فایل کامل پروژه را از لینک زیر میتوانید دانلود نمایید.