محسن نوشته

نگاهی عمیق به پشته شبکه (بخش دوم)
منتشر شده در: — Jul 14, 2020

توی بخش اول یه سری مفاهیم اولیه را با هم مرور کردیم. توی این بخش تمرکزمون روی معماری تراشه ENC28J60 هستش. برای اینکه بتونیم راحتر پشته شبکه را درک کنیم باید شناخت کافی از معماری حداقل یک تراشه اترنت داشته باشیم. همونطوری که قرارمون بود تراشه منتخب ما ENC28J60 هستش. اگه اجزای این تراشه را خوب بشناسیم سایر تراشه های شبکه هم تقریبا معماری مشابهی دارند و از این طریق میتونیم مثلا بعدا درک بهتری از تراشه هایی که روی کارتهای شبکه استفاده میشه داشته باشیم. بدون اتلاف وقت بریم سراغ محتوای اصلی این بخش.


معماری بیرونیENC28J60

همونطوری که میدونیم ENC28J60 ابزاری برای مبادله داده روی شبکه های کامپیوتری از نوع اترنت هستش. بنابراین، این تراشه از یک طرف به سوکت شبکه و از طرف دیگه به واحد پردازشی متصل میشه. واحد پردازشی میتونه یک میکروکنترلر(MCU)، یک رزبری پای (Raspberry PI) و یا هر ابزار پردازشی که بتونه با واسط SPI ارتباط برقرار کنه، باشه.

SPI یک گذرگاه مبادله داده هستش و باهاش فرستنده و گیرنده (توسط یک کلاک با فرکانس مشخصی) با هم مبادله داده انجام میدن. گذرگاه SPI سه تا پین اصلی داره: SI، SO و SCK. نودهایی که روی گذرگاه داده منتقل می کنند میتونن Master یا Slave باشن. نود Master تامین کننده پالس ساعت همزمانی (همگامی) هستش که این پالس از طریق پین SCK از Master به Slave منتقل میشود. پین SI داده را از Master به Slave و پین SO داده را از Slave به Master منتقل میکنه. پین های باس SPI نامگذاری دیگه ای هم دارن، اما چون تمرکز ما اینجا تراشه ENC28J60 هست، نامگذاری را از دید این تراشه بررسی کردیم.

اگه بخوام انتزاعی بگم دو طرف باس SPI (سمت Slave و Master) دوتا شیفت رجیستر ساده و هشت بیتی قرار داره که توی هر پالس ساعت یک بیت روی SI به Slave وارد میشه و یک بیت روی SO از Slave به Master منتقل میشه. بنابراین برای مبادله 8 بیت داده باید 8 پالس ساعت روی پین SCK توسط Master ارسال بشه. حواسمون باشه روی باس SPI همیشه Master شروع کننده مبادله داده هستش. تراشه ENC28J60 وقتی به ارتباط Master نیاز داشته باشه درخواستشو از طریق پین INT بهش اعلام میکنه. روی یک باس SPI میتونه چند تا Slave وجود داشته باشه. در این صورت Slave ی داده های روی باس را برمیداره که از طریق پین CS انتخاب شده باشه. توی تراشه ENC28J50 قبل از انجام هر عمل مشخصی پین CS مقدار صفر(Low) و بعد از انجام عمل مشخص به یک (High) مقدار دهی می شود.


ENC28J60


شکل بالا نحوه ارتباط تراشه را با واحد پردازشی (MCU) نمایش میده. ENC28J60 از طرف دیگه به شبکه اترنت متصل میشه. چهار پین TPIN و TPOUT از طریق فیلتر اترنت به زوج سیم های بهم تابیده شده کابل شبکه وصل میشن. ENC28J60 از پین های TPIN برای دریافت فریم های اترنت و از پین های TPOUT برای ارسال فریم های اترنت استفاده می کنه. میدونیم کابل های شبکه چهار زوج سیم بهم تابیده شده دارن. توی نسخه های 10Mbps و 100Mbps دو زوج در انتقال داده مشارکت داشته، اما توی نسخه های 1000Mbps و بالاتر هر چهار زوج در انتقال داده مشارکت دارند.


معماری داخلی ENC28J60

شکل زیر معماری داخلی ENC28J60 را نمایش میده.
ENC28J60


بخش های اصلی معماری:Buffer، MAC و PHY هستن. اما ارتباط این بخش ها با یکدیگر و دنیای بیرون نیازمند یه سری ماژول ها هستش. با هم ببینیم هر کدوم از این ماژول ها چین و چیکار می کنن:

حواسمون باشه که پین های اصلی ENC28J60 توی شکل بالا نمایش داده شده. حالا ما میدونیم داخل ENC28J60 چه اجزائی داریم و نقش هر کدام چیه و چطوری به دنیا بیرون وصل میشن.


سازمان اصلی حافظه

در ENC28J60 حافظه از نوع Static RAM و به سه دسته اصلی تقسیم میشه. این دسته ها عبارتند از:

توی ادامه هر کدوم از این حافظه ها را جداگانه بررسی میکنیم


سازمان CRS

اول از همه باید بدانیم CRS ها چی هستن و چه کاربردی دارن. میدونیم ENC28J60 یه سری اجرای اصلی و یه سری ماژول ها داره. هر کدوم از این اجزا و ماژول ها برای انجام کار مشخصی باید کانفیگ بشن. ما با استفاده از CRS ها میتونیم کارکرد این اجزا و ماژول ها را تنظیم (Configure) کنیم. علاوه بر این از طریق CRS ها میتونیم عملکرد این اجزا و ماژول ها رو پایش هم کنیم.

حافظه CRS ها به چهار بانک اصلی تقسیم و توی هر بانک ۳۲ ثبات قرار داده شده. ادرس ثبات ها از 0X00 شروع شده و تا 0X1F ادامه داره و طول هر ثبات 8bit هستش. شکل زیر این بانک ها را نمایش میده.


ENC28J60


نکته مهم اینکه ۵ ثبات آخر هر بانک یعنی از آدرس: 0X1B تا آدرس: 0X1F بین همه بانک ها مشترکن! بنابراین ENC28J60 ثبات های پرکاربرد را توی این بخش جایابی کرده تا واحد پردازشی مجبور نباشه برای دسترسی به اونها ابتدا تعویض بانک انجام بده. به این ترتیب مستقل از بانک جاری این ثبات ها قابل دسترسی هستن. برای انتخاب بانک جاری واحد پردازشی باید شماره بانک مورد نظرشو توی بیت های BSL1:BSL0 در ثبات ECON1 بنویسه. (شناسه بانکها: 0، 1، 2، 3). شکل زیر تمام ثبات های بانک های حافظه ENC28J60 را نمایش میده


ENC28J60


ثبات های ENC29J60 به سه دسته اصلی تقسیم میشن، این سه دسته عبارتند از:


سازمان Ethernet Buffer

کار اصلی ENC28J60 بعنوان تراشه شبکه اترنت مبادله فریم های اترنت روی رسانه شبکه اترنت هستش. بنابراین ENC28J60 به بافری برای نگهداری موقت فریم های دریافت شده داره (RX Buffer). واحد پردازشی میتونه از وجود فریم های دریافت شده توی بافر دریافت فریم اطلاع پیدا کنه و اونهارو برای پردازش از طریق باس SPI واکشی کنه. وقتی واحد پردازشی میخواد فریمی را روی شبکه ارسال کنه هم نیاز به یک بافر داریم. این بافر را بعنوان بافر ارسال فریم (TX Buffer) میشناسیم. ENC28J60 کلا 8KB بافر برای فریم های اترنت ارائه میده. شکل زیر نمایی از این بافر را نمایش میده. تنظیمات این بافر بعنوان RX Buffer و TX Buffer به عهده واحد پردازشی هستش.
ENC28J60


سازمان `PHY Register`

شکل زیر سازمان ثبات های `PHY` را نمایش میده.
ENC28J60


ثبات های `PHY` بصورت مستقیم قابل پیکربندی نیستن. برای پیکربندی این ثبات ها از ثبات های واسط یا `MII` استفاده می کنیم. نکته مهم اینکه طول ثبات های `PHY` برخلاف سایر ثبات ها `16bit` هستش و روال های خواندن و نوشتن یمقداری متفاوته. توی ادامه این روال ها را با هم بررسی میکنیم.

روال خواندن مقدار ثبات های `PHY`

* واحد پردازشی آدرس ثباتی که میخواد مقدراشو بخونه توی ثبات: `MIREGADR` قرار میده. * واحد پردازشی بیت `MIRD` از ثبات `MICMD` را با مقدار`1` بروز میکنه. * تا زمانی که عملیات خواندن ادامه داشته باشه بیت `BUSY` از ثبات `MISTAT` مقدارش `1` خواهد بود. بعد از خاتمه خواندن مقدار ثبات با `0` بروز میشه. * تا زمانی که عملیات خواندن مقدار ثبات تمام نشده واحد پردازشی نباید روال `MISCAN`ی را شروع کنه یا چیزی توی ثبات `MIWR` قرار بده. * بعد از خاتمه عملیات خواندن، مقدار خوانده شده در محتوای ثبات: `MIRD` قابل دسترس می باشد.

روال نوشتن در ثبات های `PHY`

* واحد پردازشی آدرس ثباتی که میخواد توش بنویسه را توی ثبات: `MIREGADR` قرار میده. * واحد پردازشی مقداری که قرار توی ثبات مورد نظر بنویسه را توی ثبات: `MIWR` قرار میده. * بعد از بروزرسانی ثبات`MIWR` عملیات نوشتن بصورت خودکار شروع میشه. * تا زمانی که عملیات نوشتن ادامه داشته باشه بیت `BUSY` از ثبات `MISTAT` مقدارش `1` خواهد بود. بعد از خاتمه خواندن مقدار ثبات با `0` بروز میشه.

اشاره گرهای `Ethernet Buffer`

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

ENC28J60


برای تنظیم محدوده RX Buffer در Ethernet Buffer دو ثبات (اشاره گر): ERXST و ERXND که به ترتیب به آدرس شروع و آدرس خاتمه RX Buffer اشاره می کنن به مقدار مطلوب واحد پردازشی تنظیم میشن. این دو اشاره گر در شکل زیر نمایش داده شده است.
ENC28J60


فضایی که توسط این دو اشاره گر مشخص میشن را ENC28J60 بعنوان RX Buffer در نظر میگیره و فریم های دریافتی را توی این فضا ذخیره میکنه. نکته مهم اینه که این فضا بعنوان Circular FiFo مورد استفاده قرار میگیره و وقتی حین نوشتن فریم توی بافر، ENC28J60 به انتهای بافر رسید، ادامه فریم در ابتدای بافر قرار داده میشه. علاوه بر اینENC28J60 از دو اشاره گر ERXRDPTR و ERXWRPTR بترتیب برای اشاره به آخرین بایت خوانده شده توسط واحد پردازشی و آخرین بایت نوشته شده توسط RXBM استفاده میکنه. بنابراین واحد پردازشی میتونه به راحتی با این مجموعه از ثبات ها بفهمه تا کجای بافر را خوانده، تا کجای بافر فریم دریافت شده وجود داره یا چقدر از RX Buffer خالیه. اگه فضای آزاد RX buffer برای ذخیره فریم دریافت شده کم باشه، همه فریم های بعدی دور ریخته خواهد شد. بنابراین آزاد نگه داشتن RX Buffer باید مدام توسط واحد پردازشی کنترل شه. شکل زیر انواع حالات مختلف برای محاسبه میزان فضای آزاد RX Buffer را نمایش میده.
ENC28J60


بعد از تعیین محدوده RX Buffer فضای باقیمانده بعنوان TX Buffer توسط ENC28J60 در نظر گرفته میشه. تنها کاری که واحد پردازشی باید انجام بده: تعیین نقطه شروع TX Buffer هستش. برای این کار مقدار نقطه شروع را در اشاره گر ETXST قرار میده. شکل زیر محل این اشاره گر را نمایش میده.


ENC28J60



جمع بندی

توی این پست ما یه پله جلو رفتیم و بیشتر بحثمونو روی سازمان حافظه و ثبات ها گذاشتیم. حالا یه درک سطحی از این موضوع داریم. توی پست بعدی میریم سراغ دستورالعمل های ENC28j60. اونجا یاد میگیریم که واحد پردازشی با چه دستوراتی هر کدوم از این ثبات ها را میتونه مقدار دهی کنه یا مقدارشو واکشی کنه.

پیروز باشید.