در سیستمهای Embedded اپلیکشنهای فراوانی وجود دارد که نیاز به ارتباط با کامپیوتر است. یکی از راههای ساده و پرکاربرد برای منظور، استفاده از گذرگاه USB است. امروزه گذرگاه USB رایجترین گذرگاه برای اتصال ادوات مختلف به کامپیوتر است. از جمله این ادوات میتوان به Mouse، Keyboard و USB Disk و … اشاره نمود. همچنین لازم به ذکر است که اکثر کامپیوترهای امروزی فاقد پورتهای سریال و موازی هستند.
در این بخش ابتدا بصورت مختصر گذرگاه USB معرفی شده است. سپس نحوه راه اندازی آن در میکروکنترلرهای stm32 با استفاده از نرم افزار STM32CubeMX بیان شده است. برای این منظور کلاس MSD در حالت Device راه اندازی شده است.
فهرست مطالب
تاریخچه گذرگاه USB
گذرگاه USB یک استاندارد صنعتی است که برای اتصال ادوات الکترونیکی نظیر مودم، میکروفن، صفحه کلید و … به کامپیوتر توسعه داده شده است. این استاندارد برای جایگزینی گذرگاههای کندتر و بزرگتر نظیر پورتهای سریال و موازی گسترش داده شد. در سال 1994 شرکتهای Compaq، Intel، Microsoft و NEC با هدف یافتن گذرگاهی ساده و کارا و حذف گذرگاههای گوناگون که در آن زمان رایج بودند و همینطور برای افزایش نرخ انتقال داده، گذرگاه USB را پایه ریزی کردند.
در طول سالها مشخصات USB چندین بار دستخوش تغییر شد. اولین استاندارد USB در سال 1996 تحت عنوان USB 1.0 ارائه شد. این استاندارد فقط شامل دو سرعت Low-Speed و Full-Speed بود. سرعت حالت Low-Speed برابر 1.5 Mbit/s و حالت Full-Speed برابر 12 Mbit/s است. حالت Low-Speed با توجه به این که در مقابل EMI مقاومتر از حالت Full-Speed است برای برخی جذاب تر بود چرا که با استفاده از ادوات ارزان قیمتتری میتوانستند محصول خود را تولید کنند. در سال 1998 استاندارد USB 1.1 گسترش داده شد و بهبودهایی به آن داده شد. در سال 2000 استاندارد 2.0 USB ارائه شد و سرعت جدیدی به نام High-Speed به آن اضافه شد. نرخ داده در حالت High-Speed برابر 480 Mbit/s در نظر گرفته شده است. USB 2.0 طوری طراحی شد که سازگار با استانداردهای قبلی باشد.
در سال 2008 استاندارد USB 3.0 منتشر شد که سرعتهایی تا نرخ 5 Gbit/s را فراهم میکند. این استاندارد نیز همانند USB 2.0 با استانداردهای قبلی سازگار است. اخیرا استاندارد USB 3.1 توسعه داده شده است که حداکثر سرعت 10 Gbit/s است.
ساختار گذرگاه USB
گذرگاه USB معمولا از یک Host و چند دیوایس جانبی که بصورت Tiered Star به هم متصل شده اند، تشکیل شده است. در اکثر موارد Host یک کامپیوتر است. توپولوژی Tiered Star ممکن است شامل چند هاب باشد که امکان اتصال ادوات بیشتر را فراهم کند. توپولوژی گذرگاه USB در شکل 1 نشان داده شده است.
از جمله وظایفی که Host برعهده دارد عبارتند از:
- فهمیدن اضافه و یا کم شدن ادوات USB به سیستم
- مدیریت جریان داده بین Host و سایر دیوایسها
- فراهم نمودن توان به دیوایسهای متصل شده و مدیریت آن
- کنترل کردن فعالیت بر روی گذرگاه
هر Host امکان اتصال حداکثر 127 دیوایس را بوسیله Hub های خارجی فراهم میکند. هر دیوایس USB دارای یک و یا چند Function نظیر Mouse و Keyboard و … است. هر دیوایس دارای آدرس مشخصی است که برای ارتباط بین آن دیوایس و Host استفاده میشود. ارتباط USB با استفاده از Pipe ها انجام میشود. Pipe ها مسیر ارتباطی از Host تا یک بافر قابل آدرسدهی به نام Endpoint هستند. Endpoint داده دریافت شده از Host را ذخیره کرده و داده ای که منتظر ارسال به Host است را نگه میدارد. هر دیوایس USB میتواند چندین Endpoint داشته باشد و هر Endpoint دارای یک Pipe مرتبط به آن است. در شکل 2 مدل ارتباط Host با یک دیوایس نشان داده شده است.
Host مسئول کنترل گذرگاه است و Device ها نمیتوانند بصورت مستقیم با هم تبادل داده داشته باشند و همینطور هیچکدام نمیتوانند شروع کننده انتقال داده باشند و باید منتظر درخواست شروع انتقال داده از طرف Host باشند.
در سیستم USB، Pipe ها به دو دسته Pipe کنترلی و Pipe داده تقسیم میشوند. USB چهار نوع مختلف انتقال داده تعریف کرده است. هر Pipe با توجه به نوع انتقال داده مورد استفاده قرار میگیرد.
- Control Transfer: برای ارسال دستور و یا کنترل دیوایس از Control Transfer استفاده میشود.
- Interrupt Transfer: برای ارسال دادههایی با حجم کوچک که نیاز به پردازش سریع دارند از Interrupt Transfer استفاده میشود.
- Bulk Transfer: هنگام ارسال داده با حجم بالا که از کل پهنای باند USB استفاده میشود از Bulk Transfer استفاده میشود.
- Isochronous Transfers: هنگامی که ارسال داده با نرخ مطمئن موردنیاز باشد از Isochronous Transfers استفاده میشود.
هر دیوایس USB دارای یک Control Pipe است که Host با استفاده از آن ارتباط را مدیریت میکند و علاوه بر این هر دیوایس ممکن است دارای Pipe های داده باشد که انتقالهای Interrupt ، Bulk و Isochronous بوسیله آنها انجام شود.
هنگامی که یک دیوایس USB به Host متصل میشود، فرآیندی به نام USB enumeration آغاز میشود. Enumeration فرآیندی است که طی آن مشخصات و ویژگیهای دیوایس به Host انتقال داده میشود. در این فرآیند به دیوایس یک آدرس اختصاص داده شده و توصیفگر (Descriptor) دیوایس خوانده میشود تا سیستم عامل بتواند درایور مناسب آن را بارگذاری کند. در صورتی که این فرآیند موفقیت آمیز باشد، دیوایس آماده تبادل داده با Host است.
کلاس های USB
جهت مدیریت ساده و موثر، دیوایسهای USB در کلاسهای مختلفی طبقه بندی شدهاند. رایج ترین این کلاسها عبارتند از:
- Human Interface Device (HID)
- Mass Storage Device (MSD)
- Communication Device Class (CDC)
- Vendor (Vendor Specific)
ملاحظات متعددی هنگام توسعه یک Application برای کلاس معینی وجود دارد. بعنوان مثال در هر کلاس نرخ بیشینه پهنای باند ثابتی است و دارای محدودیتهایی بر روی انواع انتقالهایی که پشتیبانی میکند، دارد.
پایه های USB
گذرگاه USB دارای چهار سیم است که دوتای آنها D+ و D- است که برای انتقال داده بصورت تفاضلی است و دوتای دیگر آن GND و +5V هستند. در شکل 3 ترتیب سیمهای USB نشان داده شده است.
کانکتورهای USB
USB دارای کانکتورهای مختلفی است که در شکل زیربه همراه کاربردشان نشان داده شده است.
راه اندازی کلاس MSD گذرگاه USB در نرم افزار STM32CubeMX
در بخش قبل توضیح مختصری در مورد گذرگاه USB داده شد. در این بخش نحوه راه اندازی آن در نرم افزار STM32CubeMX شرح داده شده است. برای این منظور کلاس MSD به دلیل پرکاربرد بودن آن انتخاب شده و چگونگی راه اندازی آن بیان شده است. در این مثال آموزشی بخشی از حافظه RAM میکروکنترلر بعنوان حافظه فیزیکی در نظر گرفته شده است که Host بتواند در آن عملیات خواندن و نوشتن را انجام دهد. لازم به ذکر است که از آنجایی که از حافظه RAM برای این منظور استفاده شده است، لذا با قطع تغذیه میکروکنترلر داده از بین میرود.
برای فعال کردن USB باید گامهای زیر طی شود:
ابتدا در نرم افزار STM32CubeMX بر روی واحد USB_OTG_FS کلیک کنید تا پنجره USB_OTG_FS Mode and Configuration نمایش داده شود
- در این پنجره حالت کاری USB تنظیم میشود. USB میتواند در یکی از حالتهای Device_Only، Host_Only، OTG/Dual_Role_Device و یا غیرفعال باشد. در این پروژه با توجه به اینکه کامپیوتر در حالت کاری Host و میکروکنترلر در حالت Device قرار دارد، لذا گزینه Device_Only انتخاب نمایید. سایر تنظیمات این واحد را با مقادیر پیشفرض رها کنید. در این مرحله تنظیم پورت USB میکروکنترلر انجام شده است.
برای اضافه نمودن کتابخانه و Firmware برای کلاس USB موردنظر از قسمت Middleware بر روی گزینه USB_DEVICE کلیک کنید
- در پنجره USB_DEVICE Mode and Configuration تنظیمات مربوط به Firmware کلاسهای USB انجام میشود. در این پنجره فیلد Class For FS IP را بر روی گزینه Mass Storage Class قرار دهید (شکل 8). سایر تنظیمات این قسمت را با مقادیر پیشفرضشان رها کنید. تا این مرحله تنظیمات مروبط به USB به پایان میرسد.
نحوه تنظیم کلاک
نحوه تنظیم کلاک میکروکنترلر در شکل 9 نشان داده است. واحد USB برای داشتن عملکرد صحیح نیازمند کلاک 48 MHz است. لذا باید مقدار آن را به درستی تنظیم نمود.
بعد از انجام تنظیمات فوق به سربرگ Project Manager رفته و نام، مسیر و IDE موردنظر را مشخص کرده و در نهایت بر روی دکمه GENERATE CODE کلیک کنید تا پروژه اولیه ایجاد شود.
نرم افزار میکروکنترلر
نرم افزار STM32CubeMX کتابخانه و Firmware موردنیاز را به پروژه اضافه میکند. در شکل 10 فایلهایی را نرم افزار تولید نموده است، نشان داده شده است. در فایل usbd_storage_if.c لایه مدیریت حافظه پیاده شده است. برای راه اندازی کلاس MSD تنها کافیست این فایل تنظیم شود.
در فایل usbd_storage_if.c سه ماکرو زیر تعریف شده است:
ماکرو STORAGE_BLK_NBR تعداد بلوکهای حافظه و ماکروی STORAGE_BLK_SIZ اندازه هر کدام را مشخص میکند.
در کتابخانه HAL برای کلاس MSC گذرگاه USB یک ساختار به نام USBD_StorageTypeDef تعریف شده است که توابع مورد نیاز برای راه اندازی آن مشخص شده است. این ساختار بصورت زیر است:
- تابع Init
در این تابع انجام تنظیمات اولیه انجام میشود.
- تابع GetCapacity
این تابع حجم حافظه را برمیگرداند. در این پروژه این تابع بصورت زیر پیاده شده است.
STORAGE_BLK_NBR تعداد بلوکهای حافظه و STORAGE_BLK_SIZ اندازده هر یک از آنها است.
- تابع IsReady
این تابع برای بررسی آماده بودن دیوایس برای پاسخ به درخواستهای Host است.
- تابع Read
از این تابع برای خواندن از حافظه استفاده میشود. در این پروژه این تابع بصورت زیر پیاده سازی شده است.
در این تابع تنها کافیست که به تعداد بایتهایی که در آرگومان تابع مشخص شده است، از حافظه به بافر خروجی کپی شود
- تابع Write
همانطور که از نام این تابع برمیآید از این تابع برای نوشتن در حافظه استفاده میشود.
تابع main
نتیجه برنامه
بعد از پروگرم کردن میکروکنترلر، آن را با کابل USB به کامپیوتر متصل کنید. در صورتیکه مراحل فوق را به درستی انجام داده باشید باید سیستم عامل باید میکروکنترلر را بعنوان حافظه شناسایی کند.
در شکل زیر پنجره Device Manager نشان داده شده است. واحد USB Mass Storage Device که با اتصال میکروکنترلر به کامپیوتر اضافه شده است، نشان داده شده است.
در شکل 12 درایو اضافه شده است به سیستم نشان داده شده است. در این درایور نیز مانند سایر حافظههای سیستم میتوان داده در آن ذخیره و بازیابی نمود. البته با توجه به اینکه داده در قسمت RAM میکروکنترلر ذخیره میشود با قطع تغذیه میکروکنترلر داده از بین خواهد رفت.