راهنمای کامل راه‌اندازی ENC28J60 برای ارسال و دریافت فریم‌های اترنت | آموزش Embedded Ethernet

blog
8 بازدید
۱۴۰۴-۰۱-۳۱
9 دقیقه

راه‌اندازی اولیه ENC28J60

 

خب پایه کار ارتباط با ENC گذاشته شده. حالا فقط نیاز هست ENC رو در ابتدای کار با مقادیر مناسب راه‌اندازی (Initialize) کنیم:

تابع ENC28J60_Init

حالا ENC آماده ست که فریم های اصلی اترنت رو دریافت یا ارسال کنه.

بررسی ساختار فریم اترنت در استاندارد Ethernet II

قبل از هر چیز بریم ببینیم، در يك فریم اترنت چی اطلاعاتي قرار داشت. قبلاً هم گفتیم که یک فریم اترنت در استاندارد Ethernet ii شامل 7 بایت (octet) ثابت با مقدار 0x55؛ یک بایت ثابت با مقدار 0xD5 به‌عنوان شروع فریم یا SFD (اين دو قسمت، جزو بخش اصلي فريم نيستند). سپس 12 بایت شامل مک آدرس مقصد و منبع (گیرنده و فرستنده)؛ دوبایت به‌عنوان نوع فریم که شامل عددی بزرگ‌تر از 0x0600 هستند و ما با دوتاش کار خواهیم داشت: 0x0800 برای پروتکل Ipv4 و 0x0806 برای پروتکل ARP.

بعد از اون داده‌های اصلی قرار می‌گیرند. در ادامه 4 بایت CRC به‌عنوان پایان فریم یا FSC. همچنین به فاصله 12 بایت روی خط با عنوان IPG فاصله یا سکوت برقرار ميشه. IPG هم جزو بخش‌های اصلي فريم به‌حساب نمياد.

نحوه تشخیص پایان فریم در ENC28J60

اگه خاطرتون باشه گفتیم در استاندارد IEEE 802.3 در دو بایت Ethe Type، اندازه داده مشخص میشه؛ لذا ما میتونیم بفهمیم تعداد داده‌ها چنتاست؛ CRC کجا قرار داره و انتهای فریم کجاست. اما در استاندارد Ethernet ii که ما باهاش سروکار داریم، تعداد داده‌ها مشخص نیست، پس از کجا متوجه میشیم (یا بهتره بگیم ENC متوجه میشه) که انتهای فریم کجاست؟ جواب اینه: در ارتباط 10Mb از محل یا وقوع 12 بایت توقف (IPG) و در ارتباط 100Mb از وقوع سیگنالی که به نام /T/R/ شناخته میشه.

بررسی روند بافر شدن داده‌ها در ENC

در واقع ENC؛ داده‌ها رو میخونه تا برسه به IPG؛ سپس این داده‌ها رو بافر میکنه. البته شروطی هم چک میشه که عموماً ما براش تعیین می‌کنیم؛ مثل بررسی CRC و آدرس صحیح (آیا فریم برای ما ارسال شده یا نه؟). داده‌های اضافی مثل preamble,SFD و CRC جدا میشه و قسمت اصلی فریم؛ شامل آدرس‌های مقصد و منبع، نوع فریم؛ payload و CRC بافر میشه (درون حافظه ذخیره میشه) تا بعد توسط میکروكنترلر اون ها رو بخونیم و پردازش کنیم.

ساختار حافظه داخلی ENC28J60 و نحوه تخصیص آن

ENC دارای یه حافظه به اندازه 8KB هست که ازش برای دریافت و ارسال فریم‌ها استفاده میکنه. در واقع این حافظه بین دو بخش ارسال و دریافت تقسیم میشه.

تخصیص حافظه برای ارسال و دریافت

ما تعیین می‌کنیم که چه مقدار حافظه برای بخش ارسال و چه مقدار براي دریافت، قرار داده بشه. به‌این‌ترتیب که ابتدا و انتهای حافظه دریافت رو مشخص می‌کنیم. هرچی باقي بمونه؛ به‌عنوان حافظه ارسال استفاده میشه.

از اونجایی که حداکثر اندازه فریم ارسالی 1518 بایت هست؛ از طرفی نیاز هست براي یه مقدار اطلاعات اضافه در ابتدا و انتهای فریم‌ها؛ فضا وجود داشته باشه (ديتاشيت رو ببينيد) ما 1536=0x600 بایت برای حافظه ارسال در نظر می‌گیریم؛ لذا بقیه حافظه برای دریافت اختصاص داده میشه که مقدار مناسبی هست و چندین فریم، قبل از پردازش توسط ما (میکروکنترلر) میتونه در این حافظه ذخیره بشه.

مفهوم صف چرخشی در بافر فریم‌ها

این حافظه به‌صورت یک صف چرخشی (circular queue) مصرف میشه. بخوام ساده بگم؛ پکت ها به ترتیب دریافت؛ داخل حافظه (البته با تمهیداتی که داخل دیتاشیت گفته شده) ذخیره می‌شوند. اگر به انتهای حافظه برسیم؛ برمی‌گردیم از ابتدای حافظه شروع می‌کنیم. فقط در برنامه مون (داخل میکروکنترلر) باید حواسمون باشه که تعداد فریم‌های رسیده؛ اونقدر زیاد نشه که حافظه‌ای برای دریافت فریم‌های جدید باقی نمونه. اگر نمیدونید صف چرخشی چیه به کتاب‌های “ساختمان داده‌ها” رجوع کنید.

مفهوم Padding و رعایت استاندارد فریم

  • یادم نیست که این نکته رو گفتم یا نه! به‌هرحال؛ چنانچه اندازه فریم کمتر از 64 بایت باشه؛ طبق استاندارد، باید انتهای داده ها رو به مقدار 0 پر کنیم تا اندازه فریم به 64 بایت برسه. به این کار padding میگن. هر چند padding طبق گفته استاندارد، الزامی هست؛ اما در عمل پکت هایی ديدم که padding توش انجام نشده و در واقع استاندارد رعايت نشده. به عنوان مثال، در پکت های هندشیک ارسالی از طرف نرم افزار LabVIEW که اگه یادم موند در موقع خودش نشون میدم. این فریم ها رو میشه ارسال کرد اما ممکنه توسط اجزای میانی شبکه مثل روترها دور ریخته بشه(drop). یکی از مواردی که باید برای ENC تنظیم بکنیم، همین padding هست.

ساختار نهایی فریم ارسالی در ENC28J60

بعد از تعیین تکلیف وضعیت حافظه بافر؛ بریم سر وقت ارسال فریم. هنگام ارسال فریم؛ یک بایت کنترلی در ابتدای فریم و هفت بایت تعیین وضعیت در انتهای فریم، اضافه میشه؛ بعلاوه برای CRC هم با وجود اینکه توسط ENC محاسبه میشه، باید 4 بایت فضا در نظر بگیریم. یک فریم ارسالی ظاهری شبیه به شکل 13 خواهد داشت.

 

ساختار بافر ارسال

ساختار بافر ارسال

 

تعريف بایت کنترلی رو هم که از ديتاشيت ENC برداشتیم در شكل زیر ميبينيد:

بایت کنترلی ارسال

بایت کنترلی ارسال

 

بایت کنترلی و ارسال فریم‌های خاص

  • مواقعی وجود دارد که ارسال فریم‌های بزرگ‌تر از 1500 بایت داده، به یک ارتباط سریعتر، کمک میکنه. بعنوان مثال فرض کنید در حال ارتباط با یک دوربین با رزولوشن و FPS(Frame Per Second) بالایی هستید(که عموما با سرعت گیگابیت کار میکنند). در این حالت نیاز دارید که فریم هایی با اندازه بزرگ ارسال کنید؛ هرچند که خارج از محدوده استاندارد هست. در این حالت به فریم های بزرگتر از 1518 بایت اصطلاحا Huge یا Long گفته میشه. (جهت اطلاع) در گیگابیت اترنت هم به فریم های بزرگتر از 9000 بایت Jumbo میگن. به فریم های بزرگتر از 6000 بایت Giant میگن. همچنین در حالت کلی به فریم های کوچکتر از 64 بایت هم Runt گفته میشه. خودتون رو درگیر این اصطلاحات نکنید، این اطلاعات فعلا فقط جهت اطلاع هست.

بیت PCRCEN و محاسبه CRC توسط ENC

در مورد padding هم توضیح دادیم و اما بیت PCRCEN؛ اگر خودتون میخواید که CRC رو حساب کنید؛ کافیه اون رو در انتهای فریم اضافه کنید و به ENC بگید که اینکار توسط شما انجام شده و 4 بایت انتهایی در بخش

داده‌ها؛ CRC هست. اما اگر قراره ENC این کار رو انجام بده؛ با این بیت به ENC اجازه یا دستور محاسبه رو میدیم، CRC محاسبه شده در 4 بایت انتهایی قرار میگیره و ما فقط باید به اندازه 4 بایت براش جا در نظر بگیریم (ما از این روش استفاده کردیم)

در بیت POVERRIDE هم میگیم که آیا از تنظیمات داخل رجیستر MACON3 استفاده بشه یا از بیت‌های معرفی شده که ما از این وضعیت استفاده می‌کنیم. کد مورد نظر داخل تابع Initialize به‌صورت زیر نوشته شده:

 

رجیسترهای تعیین محدوده حافظه ارسال و دریافت

4 ثبات 16 بیتی با نام های زیر، برای تعیین ابتدا و انتهای بافرهای ارسال/دریافت در بخش رجیسترهای کنترلی ENC موجود هست:

  • ETXSTL / ETXSTH – address of the beginning of the buffer for transmission
  • ETXNDL / ETXNDH – address of the end of the buffer for transmission
  • ERXSTL / ERXSTH – address of the beginning of the receive buffer
  • ERXNDL / ERXNDH – address of the end of the receive buffer

دو ثبات آخر برای تعیین محدوده بافر دریافت استفاده میشن و مابقی حافظه به طور پیش‌فرض، محدوده بافر ارسال (تعریف شده در دو ثبات 16 بیتی اول) رو مشخص می‌کنند.

 

مسئولیت کنترل تداخل حافظه بر عهده میکروکنترلر

  • توجه داشته باشید که ENC هنگام ارسال؛ مقادیر ثبات‌های 16 بیتی ETXST و ETXND رو جهت تداخل با محدوده بافر گیرنده چک نمیکنه و این وظیفه میکروکنترلر (ما) هست که مراقب این خطا باشه.

چون به اندازه تقریبی یک فریم در حافظه ارسالی فضا اختصاص دادیم؛ پس در هر لحظه از زمان؛ فقط یک فریم در حال ارسال خواهد بود. از طرفی قرار هست این برنامه روی میکروکنترلر پیاده‌سازی بشه.

مدیریت حافظه RAM در میکروکنترلر

از اونجایی که یکی از اصلی‌ترین محدودیت‌ها در میکروکنترلرها؛ کم‌بودن میزان حافظه دیتا (RAM) در اونهاست؛ پس ما فقط یک بخش از حافظه RAM رو برای دریافت، پردازش و در صورت نیاز ارسال پاسخ (با همون حافظه) درون میکروکنترلر اختصاص میدیم. در واقع صبر می‌کنیم تا یک فریم برسه؛ اون رو بررسی و پردازش می‌کنیم و چنانچه نیاز به پاسخ داشته باشه؛ داده‌ها رو در همون قسمت از RAM میکروکنترلر می‌نویسیم و بعد ارسال می‌کنیم به ENC تا روی خط ارسال بشه.

مراحل ارسال یک فریم توسط ENC

برای ارسال یک فریم، این عملیات انجام میشه:

  • با بررسی بیت TXRTS از ثبات ECON1 صبر می‌کنیم تا ارسال فریم قبلی به اتمام برسه.
  • آدرس صفر (و یا هر مقدار دیگه ای که اطمینان داریم به‌عنوان آدرس شروع فریم ارسال کافیه) رو در ثبات EWRPT می‌نویسم.
  • ابتدا بایت کنترلی (شکل 14) رو با مقدار 0x00 مینویسیم و در ادامه داده های خودمون رو به بافر منتقل میکنیم.
  • مقادیر مناسب رو باتوجه‌به آدرس شروع و اندازه فریم در ثبات‌های ETXST و ETXND می‌نویسیم.
  • برای شروع عملیات ارسال بیت ETXRTS از ثبات ECON1 رو ست می‌کنیم.

مدیریت خطاها در ارسال فریم

این نکته هم قابل‌توجه هست که چنانچه هنگام ارسال پکت قبلی خطایی رخ ‌داده باشه، سخت‌افزار نمیتونه بیت TXRTS رو پاک کنه؛ لذا ما همواره بیت TXERIF از ثبات EIR رو چک می‌کنیم تا اگر خطایی رخ ‌داده باشه، طبق گفته دیتاشیت، یکبار بیت TXRST رو ست و ریست کنیم تا قادر به ارسال پکت جدید باشیم. لازم به ذکره که با بررسی بایت‌های کنترلی در انتهای فریم قبل میشه به نوع خطا پی ببریم و روال تصحیح اون مثل ارسال دوباره فریم قبلی رو انجام بدیم. تفسیر مقادیر بایت‌های کنترلی TSV در انتهای فریم ارسال در شکل 15 نمایش‌داده‌شده است. دو بایت ابتدایی نشان‌دهنده تعداد بایت‌های ارسالی ست.

 

دریافت فریم‌ها با ENC

ما قبلاً محدوده بافر دریافت رو مشخص کرده‌ایم، همچنین باید بگیم که ENC قابلیت فیلتر فریم‌های دریافتی رو با استفاده از ثبات ERXFCON رو در اختیار ما قرار داده:

راهنمای کامل راه‌اندازی ENC28J60 برای ارسال و دریافت فریم‌های اترنت | آموزش Embedded Ethernet

این فیلترها قابل ترکیب منطقی با هم هستند. برای مطالعه کامل این فیلترها به دیتاشیت مراجعه کنید.

فعال‌سازی بخش دریافت با بیت RXEN

بعد از تنظیمات اولیه (از جمله فیلترها) برای فعال‌سازی بخش دریافت کافیه بیت RXEN از ثبات ECON1 ست بشه که اون رو هم به‌صورت یه تابع پیاده‌سازی کردیم.

نحوه ذخیره‌سازی فریم‌های دریافتی در بافر

فریم‌های دریافتی به‌صورت شکل 16 در بافر دریافت قرار میگیرند. ابتدا دو بایت برای اشاره به آدرس شروع فریم دریافتی بعدی، 4 بایت برای بررسی وضعیت فریم، سپس داده های دریافتی فریم فعلی شامل مک آدرس ها و دو بایت نوع اترنت (ترکیب فریم استاندارد)؛ داده های اصلی و در انتها نیز 4 بایت CRC قرار می گیرند.

تفسیر اطلاعات در 4 بایت وضعیت دریافت

چنانچه تعداد کل بایت ها فرد باشد؛ یک بایت در انتها خالی گذاشته میشود تا شروع فریم بعدی روی آدرس زوج باشد. اطلاعاتیکه درون 4 بایت وضعیت دریافت قرار می گیرند، به صورت شکل 17 تفسیر میشوند. همانطور که در شکل 17 مشخص شده است، دو بایت کم ارزش نشاندهنده تعداد بایت های دریافتی ست.

نحوه ثبت فریم های دریافتی در بافر

نحوه ثبت فریم های دریافتی در بافر

ثبات وضعیت فریم دریافتی

ثبات وضعیت فریم دریافتی

نحوه استفاده از حافظه برای دریافت و ارسال فریم‌ها

همونطور که قبلاً گفتیم هسته برنامه ما (با فرض کمبود حافظه RAM) این‌طور عمل میکنه که از همون حافظه اختصاص‌یافته برای دریافت فریم‌ها (درون میکروکنترلر و نه ENC) برای تهیه و ارسال پاسخ ارسال میشه؛ به همین دلیل هست که ما نوع ارتباط رو HalfDouplex در نظر گرفتیم. یک فریم رو دریافت و پردازش می‌کنیم؛  و چنانچه نیاز به پاسخ باشه؛ پاسخ رو در همون حافظه می‌چینیم و بعد به بافر ارسال ENC منتقل و دستور ارسال فريم رو صادر می‌کنیم.

  • واضحه که این نوع کدنویسی درست نیست؛ زیرا موارد زیادی هست که بدون دریافت فریمی، نیاز هست که اطلاعاتی ارسال بشه، اما همونطور که گفتیم این نوشته برای این عرضه شده که ما با مفاهیم اصلی آشنا بشیم؛ طوری که خودمون بتونیم یک سخت‌افزار (به همراه نرم‌افزار) کامل برای استفاده در شبکه داشته باشیم.

پیاده‌سازی کد دریافت فریم‌ها

بعد از دریافت هر فریم، اونها رو درون یک ساختار (structure) قرار میدیم. تعریف این استراکچر در زبان C همچین چیزیه:

کد تابع دریافت فریم‌ها

و تابع دریافت هم به صورت زیر هست:

توضیحات و فرآیند دریافت فریم

ابتدا توسط رجیستر EPKTCNT بررسی می‌کنیم که آیا فریمی برای خواندن درون ENC هست یا نه؟ چنانچه شمارنده تعداد فریم‌ها، بزرگ‌تر از صفر باشه؛ با استفاده از اشاره‌گر به پکت فعلی داده‌ها، کارهای زیر رو انجام میدیم:

در قدم اول 6 بایت شامل 2 بایت اشاره گر به فریم بعدی و 4 بایت وضعیت رو میخونیم. یادمون هم نمیره اشاره گر به فریم بعدی رو هم ذخیره کنیم که بتونیم فریم بعدی رو بخونیم. اگر فریم دریافت شده، بدون خطا باشه (بیت 23 از بایت های وضعیت رو ببینید) با توجه به تعداد بایت های دریافتی در این فریم (دو بايت اول در بايت هاي وضعيت)، بایت های اصلی رو میخونیم.

نکته مهم در پیاده‌سازی

کار ما اینجا با ENC تموم میشه. این نکته بسیار مهم که قبلاً هم اشاره کردیم؛ مجدد یادآوری می‌کنیم. شما هر مداری با هر نوع سخت‌افزار و هر کدی داشته باشید؛ در نهایت باید دو تابع داشته باشید که با اون ها بتونید فریم‌های موجود در شبکه رو بخونید و یا فریم‌های خودتون رو ارسال کنید، مابقی اجراي (Implementation) شبکه در اختیار نرم‌افزار میکروکنترلر شماست.

اطلاعات
8
0
0
لینک و اشتراک
profile

مجتبی داشخانه

متخصص الکترونیک

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

سیسوگ‌شاپ | فروشگاه محصولات Quectel

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
family

سیکار | اولین مرجع متن باز ECU در ایران

بررسی و ارائه اطلاعات مربوط به ECU (واحد کنترل الکترونیکی) و نرم‌افزارهای متن باز مرتبط با آن برو به سیکار
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

سیسوگ‌شاپ

فروشگاه محصولات Quectel

پالت

سیسوگ فروم

محلی برای پاسخ پرسش‌های شما

سیسوگ جابز
سیسوگ
سیسوگ فروم

سی‌کار

اولین مرجع متن باز ECU در ایران

سیسوگ مگ

آی‌سی

موتور جستجوی قطعات الکترونیکی

سیسوگ آکادمی

پالت

بازار خرید و فروش قطعات الکترونیک

دیدگاه ها

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله