گذرگاه USB در میکروکنترلرهای STM32

0

گذرگاه USB در میکروکنترلرهای STM32

در سیستم­های 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 نشان داده شده است.

توپولوژی گذرگاه USB
توپولوژی گذرگاه USB

از جمله وظایفی که 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 با یک دیوایس
مدل ارتباط 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

کانکتورهای USB

USB دارای کانکتورهای مختلفی است که در شکل زیربه همراه کاربردشان نشان داده شده است.

کانکتورهای مختلف USB
کانکتورهای مختلف USB

راه اندازی کلاس MSD گذرگاه USB در نرم افزار STM32CubeMX

در بخش قبل توضیح مختصری در مورد گذرگاه USB داده شد. در این بخش نحوه راه اندازی آن در نرم افزار STM32CubeMX شرح داده شده است. برای این منظور کلاس MSD به دلیل پرکاربرد بودن آن انتخاب شده و چگونگی راه اندازی آن بیان شده است. در این مثال آموزشی بخشی از حافظه RAM میکروکنترلر بعنوان حافظه فیزیکی در نظر گرفته شده است که Host بتواند در آن عملیات خواندن و نوشتن را انجام دهد. لازم به ذکر است که از آنجایی که از حافظه RAM برای این منظور استفاده شده است، لذا با قطع تغذیه میکروکنترلر داده از بین می­رود.

برای فعال کردن USB باید گام­های زیر طی شود:

ابتدا در نرم افزار STM32CubeMX بر روی واحد USB_OTG_FS کلیک کنید تا پنجره USB_OTG_FS Mode and Configuration نمایش داده شود

نحوه فعال نمودن گذرگاه USB کلاس MSC بخش اول
نحوه فعال نمودن گذرگاه USB کلاس MSC بخش اول
  • در این پنجره حالت کاری USB تنظیم می­شود. USB می­تواند در یکی از حالت­های Device_Only، Host_Only، OTG/Dual_Role_Device و یا غیرفعال باشد. در این پروژه با توجه به اینکه کامپیوتر در حالت کاری Host و میکروکنترلر در حالت Device قرار دارد، لذا گزینه Device_Only انتخاب نمایید. سایر تنظیمات این واحد را با مقادیر پیشفرض رها کنید. در این مرحله تنظیم پورت USB میکروکنترلر انجام شده است.
نحوه فعال نمودن گذرگاه USB کلاس MSC بخش دوم
نحوه فعال نمودن گذرگاه USB کلاس MSC بخش دوم

برای اضافه نمودن کتابخانه و Firmware برای کلاس USB موردنظر از قسمت Middleware بر روی گزینه USB_DEVICE کلیک کنید

نحوه اضافه نمودن Firmware کلاس MSC بخش اول
نحوه اضافه نمودن Firmware کلاس MSC بخش اول
  • در پنجره USB_DEVICE Mode and Configuration تنظیمات مربوط به Firmware کلاس­های USB انجام می­شود. در این پنجره فیلد Class For FS IP را بر روی گزینه Mass Storage Class قرار دهید (شکل 8). سایر تنظیمات این قسمت را با مقادیر پیشفرضشان رها کنید. تا این مرحله تنظیمات مروبط به USB به پایان می­رسد.
نحوه اضافه نمودن Firmware کلاس MSC بخش دوم
نحوه اضافه نمودن Firmware کلاس MSC بخش دوم

نحوه تنظیم کلاک

نحوه تنظیم کلاک میکروکنترلر در شکل 9 نشان داده است. واحد USB برای داشتن عملکرد صحیح نیازمند کلاک 48 MHz است. لذا باید مقدار آن را به درستی تنظیم نمود.

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

بعد از انجام تنظیمات فوق به سربرگ Project Manager رفته و نام، مسیر و IDE موردنظر را مشخص کرده و در نهایت بر روی دکمه GENERATE CODE کلیک کنید تا پروژه اولیه ایجاد شود.

نرم افزار میکروکنترلر

نرم افزار STM32CubeMX کتابخانه و Firmware موردنیاز را به پروژه اضافه می­کند. در شکل 10 فایل­هایی را نرم افزار تولید نموده است، نشان داده شده است. در فایل usbd_storage_if.c لایه مدیریت حافظه پیاده شده است. برای راه اندازی کلاس MSD تنها کافیست این فایل تنظیم شود.

فایل های اضافه شده برای کلاس MSD گذرگاه USB
فایل های اضافه شده برای کلاس MSD گذرگاه USB

در فایل usbd_storage_if.c سه ماکرو زیر تعریف شده است:

#define STORAGE_LUN_NBR                  1
#define STORAGE_BLK_NBR                  0x80
#define STORAGE_BLK_SIZ                  0x200
 

ماکرو STORAGE_BLK_NBR تعداد بلوک­های حافظه و ماکروی STORAGE_BLK_SIZ اندازه هر کدام را مشخص می­کند.

در کتابخانه HAL برای کلاس MSC گذرگاه USB یک ساختار به نام USBD_StorageTypeDef تعریف شده است که توابع مورد نیاز برای راه اندازی آن مشخص شده است. این ساختار بصورت زیر است:

typedef struct _USBD_STORAGE
{
  int8_t (* Init) (uint8_t lun);
  int8_t (* GetCapacity) (uint8_t lun, uint32_t *block_num, uint16_t *block_size);
  int8_t (* IsReady) (uint8_t lun);
  int8_t (* IsWriteProtected) (uint8_t lun);
  int8_t (* Read) (uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
  int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
  int8_t (* GetMaxLun)(void);
  int8_t *pInquiry;

}USBD_StorageTypeDef;
 
  • تابع Init

در این تابع انجام تنظیمات اولیه انجام می­شود.

  • تابع GetCapacity

این تابع حجم حافظه را برمی­گرداند. در این پروژه این تابع بصورت زیر پیاده شده است.

int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  *block_num  = STORAGE_BLK_NBR;
  *block_size = STORAGE_BLK_SIZ;
  return (USBD_OK);
}
 

STORAGE_BLK_NBR تعداد بلوک­های حافظه و STORAGE_BLK_SIZ اندازده هر یک از آن­ها است.

  • تابع IsReady

این تابع برای بررسی آماده بودن دیوایس برای پاسخ به درخواست­های Host است.

  • تابع Read

از این تابع برای خواندن از حافظه استفاده می­شود. در این پروژه این تابع بصورت زیر پیاده سازی شده است.

t blk_len)
{
  memcpy(buf, &myMem[STORAGE_BLK_SIZ*blk_addr], blk_len*STORAGE_BLK_SIZ);
  return (USBD_OK);
 

 در این تابع تنها کافیست که به تعداد بایت­هایی که در آرگومان تابع مشخص شده است، از حافظه به بافر خروجی کپی شود

  • تابع Write

همانطور که از نام این تابع برمی­آید از این تابع برای نوشتن در حافظه استفاده می­شود.

int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  memcpy(&myMem[STORAGE_BLK_SIZ*blk_addr], buf, blk_len*STORAGE_BLK_SIZ);
  return (USBD_OK);
}
 

تابع main

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_USB_DEVICE_Init();

  while (1)
  {

  }
}
 

نتیجه برنامه

بعد از پروگرم کردن میکروکنترلر، آن را با کابل USB به کامپیوتر متصل کنید. در صورتیکه مراحل فوق را به درستی انجام داده باشید باید سیستم عامل باید میکروکنترلر را بعنوان حافظه شناسایی کند.

در شکل زیر پنجره Device Manager نشان داده شده است. واحد USB Mass Storage Device که با اتصال میکروکنترلر به کامپیوتر اضافه شده است، نشان داده شده است.

نمایش دیوایس در Device Manager
نمایش دیوایس در Device Manager

در شکل 12 درایو اضافه شده است به سیستم نشان داده شده است. در این درایور نیز مانند سایر حافظه­های سیستم می­توان داده در آن ذخیره و بازیابی نمود. البته با توجه به اینکه داده در قسمت RAM میکروکنترلر ذخیره می­شود با قطع تغذیه میکروکنترلر داده از بین خواهد رفت.

Choose your Reaction!
دیدگاه خود را بنویسید

آدرس ایمیل شما منتشر نخواهد شد.

redronic.com