برنامه نویسی دستگاه های مختلف از طریق usb. برنامه نویسی دستگاه های USB *. برنامه نویسی دستگاه های HID در "سطح بالا"


شکل 1 تصویری از عملکرد یک دستگاه اندروید در حالت های USBمیزبان و لوازم جانبی (تصویر از http://developer.android.com)

توجه داشته باشید که استفاده از USB تنها راه ارتباط با همان نیست دستگاه خانگی. اندروید به شما امکان استفاده بیشتر از NFC، Wi-Fi P2P، SIP و همچنین استاندارد را می دهد اتصال شبکه. بنابراین در زرادخانه توسعه دهندگان فرصت های کافی برای اجرای وحشیانه ترین ایده های آنها وجود دارد.

یکی دیگر از گزینه های رایج برای برقراری ارتباط با دستگاه های مختلف هنوز استفاده از آداپتور USB-COM است. مطالبی در شبکه در مورد استفاده از آداپتور USB-COM در Android وجود دارد - به عنوان مثال، ببینید. محبوبیت چنین اتصالی به دلیل وجود تعداد زیادی دستگاه است که قبلاً با استفاده از میکروکنترلرهای مختلف توسعه یافته اند که ارتباط با آنها با استفاده از پورت COM ( درگاه سریال) که حدود 10 سال پیش تقریباً یک روش استاندارد برای انتقال داده ها از رایانه به یک قطعه سخت افزاری خانگی بود.

در مقایسه با پورت COM، استفاده از USB می تواند سرعت انتقال اطلاعات را به میزان قابل توجهی افزایش دهد و این فرآیند را کاربر پسند کند. سرعت انتقال که حتی در مورد دستگاه های کم سرعت (صفحه کلید، ماوس، جوی استیک) 10-1500 کیلوبیت بر ثانیه است، سادگی و هزینه کم کابل کشی و اتصالات، خودشناسی دستگاه ها با پیکربندی خودکار، مخفی کردن جزئیات اتصال الکتریکی از کاربر نهایی (به علاوه توانایی جدا کردن کابل بدون خاموش کردن دستگاه ها)، کنترل خطا و بازیابی آنها در سطح پروتکل - اینها از مزایای غیرقابل انکار این فناوری هستند (نگاه کنید به صفحه 12).

به طور کلی، در مورد استفاده از USB برای انتقال داده، ذکر کتاب "رابط USB" P. Agurov مفید خواهد بود. اگرچه اغلب در شبکه مورد انتقاد قرار می گیرد و آخرین بار در سال 2006 منتشر شده است، اما در جستجوی اطلاعات در مورد جنبه های مختلف کاربرد این فناوری بیش از یک بار به یافتن راه حل مناسب کمک کرده است. این کتاب سوالاتی را شامل می‌شود: از انتخاب یک ریزمدار و مدار برای کنترل‌کننده تا نوشتن یک برنامه میکروکنترلر و نمونه‌هایی از انتقال داده‌های برنامه‌نویسی از طریق پروتکل USB از رایانه. غیرممکن است که "منبع اصلی" داده ها را در مورد این موضوع نشان ندهید - سایت سازمان غیرانتفاعی USB IF (فورم اجرایی USB) که مشخصات این رابط را توسعه می دهد -با این حال، این مقاله به زبان انگلیسی است. با این حال، در آنجا اطلاعات جامعی در مورد دستگاه رابط USB خواهید یافت. ترجمه خوبی از قسمت هایی از مشخصات وجود دارد - . علاقه مندان به راه حل های نرم افزاری از سمت میکروکنترلر نیز می توانند لینک را مشاهده کنند.

این مقاله در درجه اول برای کسانی است که هر کدام را دارند دستگاه الکترونیکی(طراحی شده توسط خودتان یا شخص دیگری)، پروتکل ارتباطی که با آن به خوبی شناخته شده است (به عنوان مثال، قبلاً برنامه ای وجود دارد که با این دستگاه در ویندوز / لینوکس کار می کند) و من می خواهم برنامه ای داشته باشم که با آن در اندروید کار کند. .

کمی در مورد کلاس های دستگاه USB

لازم به ذکر است که توسعه نرم افزار برای تبادل اطلاعات با یک دستگاه خاص به شدت به پیاده سازی آن در سطح میکروکنترلر بستگی دارد. به دلایل واضح، ارائه نمونه هایی از برنامه های ارتباطی برای انواع دستگاه های USB در یک مقاله غیرممکن است (اطلاعات اولیه در مورد برنامه نویسی انواع مختلف دستگاه ها را می توان در این مقاله یافت). با این حال، ما خود را به ارائه کدی که جستجوی دستگاه و دسترسی به نقاط کنترل آن را برای تبادل اطلاعات پیاده‌سازی می‌کند، محدود می‌کنیم. ما همچنین ارسال داده ها را با استفاده از مثال یکی از انواع دستگاه های USB، یعنی کلاس دستگاه HID (دستگاه رابط انسانی - کلاسی از دستگاه ها برای تعامل با یک شخص) تجزیه و تحلیل خواهیم کرد. این کلاس شامل دستگاه‌های «آهسته» مانند صفحه کلید، ماوس، جوی استیک است و نمونه‌های کافی از اجرای آن با استفاده از میکروکنترلرهای مختلف در شبکه وجود دارد (برای مثال، در ).

چرا کلاس HID به تولید کنندگان دستگاه های مختلف خانگی بسیار علاقه دارد؟ به نقل از ویکی پدیا: «علاوه بر مشخصات دقیق دستگاه های ورودی کلاسیک (مانند صفحه کلید و ماوس)، استاندارد HID کلاس خاصی از دستگاه ها را بدون مشخصات دقیق تعریف می کند. این کلاس USB HID Consumer Control نام دارد و در اصل یک کانال ارتباطی موقت با دستگاه است. در این مورد، دستگاه از همان استاندارد برای سیستم عاملدرایورها به عنوان یک ماوس با صفحه کلید. بنابراین، می توان یک دستگاه USB ایجاد کرد که نیازی به ایجاد و نصب درایورهای خاص در اکثر سیستم عامل های رایج رایانه نداشته باشد. فقط اضافه می شود که این مشخصات در سیستم عامل اندروید نیز کار می کند (بدون احتساب سیستم عامل CyanogenMod).

یکی از گزینه‌های مبادله داده با دستگاه HID، انتقال وقفه است که در مواقعی که نیاز به انتقال بسته‌های داده کوچک (حداکثر اندازه بسته بستگی به سرعت انتقال دارد و بین 64 تا 1024 بایت است) پس از یک بازه زمانی معین، استفاده می‌شود. . بسته برای انتقال گزارش نامیده می شود (انگلیسی - گزارش، رجوع کنید به ص 71، 95). این طول گزارش معمولاً برای تبادل اطلاعات با یک دستگاه خانگی کافی است، مثلاً 64 بایت اطلاعات در یک بسته، برای یک کنترلر بسیار زیاد است، زیرا 1 بیت اطلاعات برای انتقال حالت های یک LED یا یک ساده کافی است. سنسور

ابزارهای مورد نیاز

بنابراین، ما به یک تبلت یا یک گوشی با اندروید نسخه 3.1 یا بالاتر نیاز داریم. در اینجا لازم به ذکر است که USB Host API به طور کامل در همه دستگاه های تلفن همراه پیاده سازی نشده است (این مورد در وب سایت developer.android.com نیز ذکر شده است، به لینک مراجعه کنید). برخی از تبلت ها/تلفن ها فقط از کانکتور USB برای شارژ و اتصال کامپیوتر استفاده می کنند. یک بار دیگر خواننده را به لیست دستگاه های تلفن همراه مناسب یا نامناسب برای آزمایش های ما می فرستم (نگاه کنید به).

همچنین به نوعی دستگاه USB (برای اولین آزمایش ها، یک درایو فلش USB معمولی کافی است)، یک آداپتور OTG (On-The-Go - به شکل 2 مراجعه کنید) و / یا یک کابل USB برای برقراری ارتباط با دستگاه نیاز دارید. . ویکی‌پدیا در مورد OTG می‌گوید: «هنگامی که از طریق USB OTG متصل می‌شوید، رتبه دستگاه (master یا slave) با وجود یا عدم وجود یک جامپر بین پایه‌های 4 و 5 در دوشاخه کابل اتصال تعیین می‌شود. در یک کابل USB OTG، چنین جامپری فقط در یکی از دو کانکتور نصب شده است (نگاه کنید به).» بر این اساس، ما به چنین جامپری از کنار دستگاه تلفن همراه نیاز داریم.


شکل 2 تفاوت در طرح یک کابل USB معمولی و یک کابل OTG (شکل از http://tech.firstpost.com)

شما همچنین می توانید چنین کابل OTG را برای دستگاه خود لحیم کنید. برای انجام این کار، باید یک اتصال دهنده مناسب را در فروشگاه رادیو خریداری کنید، به علاوه نویسنده، به عنوان مثال، استفاده می شود کابل قدیمیاز یک هارد دیسک قابل حمل:

یک کمک خوب در کار نیز برنامه USB Device Info نصب شده از حافظه Google Play Market خواهد بود. این برنامه قادر است دستگاه های متصل به اتصال USB تبلت / تلفن را هم با استفاده از Java API و هم با استفاده از هسته لینوکس شناسایی کند. یعنی اگر دستگاه شما با استفاده از Java USB Host API در اطلاعات دستگاه USB شناسایی نشود، با احتمال زیاد، استفاده از هر برنامه اندرویدی (از جمله خودتان) که با استفاده از جاوا برای این دستگاه تلفن همراه نوشته شده است، بیهوده خواهد بود. و USB Host API.

گاهی اوقات نیز اطلاعات نمایش داده شده توسط دستور lsusb سیستم عامل لینوکس بسیار مفید است. با گزینه‌های -v و -d، lsusb همه چیز یا تقریباً همه چیز را در مورد یک دستگاه USB که یک توسعه‌دهنده نرم‌افزار برای دستگاه‌های این کلاس به آن نیاز دارد را نشان می‌دهد (شکل 3 را ببینید).


شکل 3 نمونه خروجی از دستورات lsusb و lsusb -v -d

در مرحله بعد، به یک کامپیوتر با Android SDK نصب شده و یک محیط توسعه یکپارچه Eclipse (IDE) با افزونه ADT نیاز دارید (اگرچه می توانید فقط با SDK از پس آن برآیید). می توانید نحوه ایجاد و نصب یک برنامه اندروید را مشاهده کنید، به عنوان مثال، در اینترنت یا در اینترنت.

و البته، حداقل و همچنین میل به دستیابی به نتیجه، بدون آن به هیچ وجه ضروری است! توجه می کنم که برای روشن شدن برخی موارد مسائل فنیاستفاده از USB در اندروید توسط نویسنده، هفته ها جستجوی پر زحمت برای اطلاعات طول کشید.

کلاس های جاوا برای کار با USB در API اندروید

بنابراین، همانطور که در وب سایت USB Host API برای توسعه دهندگان اندروید می گویند (نگاه کنید به) - "قبل از شروع، مهم است که بدانید از چه کلاس هایی در کار خود استفاده خواهید کرد." جدول 1 مهمترین کلاس ها را برای کار با USB Host API (تلاشی برای ترجمه اطلاعات از http://developer.android.com) توضیح می دهد.

جدول 1. شرح کلاس های کار با USB در اندروید

نام کلاس شرح
یواس بی منیجر به شما امکان می دهد دستگاه های USB متصل را شمارش کنید و با آنها ارتباط برقرار کنید.
به شما امکان می دهد یک دستگاه USB متصل را شناسایی کرده و با آن ارتباط برقرار کنید.
دستگاه USB یک دستگاه USB متصل را نشان می دهد و حاوی روش هایی برای دسترسی به اطلاعات شناسایی، رابط ها و نقاط پایانی آن است.
یک دستگاه USB متصل را نشان می‌دهد و شامل روش‌هایی برای دسترسی به هویت، رابط‌ها و نقاط پایانی آن است.
رابط کاربری یک رابط یک دستگاه USB را نشان می دهد که مجموعه ای از عملکردها را برای دستگاه تعریف می کند. یک دستگاه می تواند یک یا چند رابط داشته باشد که بر روی آن ارتباط برقرار کند.
نمایانگر "رابط" یک دستگاه USB است که مجموعه ای از عملکردها را برای آن تعریف می کند این دستگاه. یک دستگاه ممکن است یک یا چند رابط برای تبادل اطلاعات داشته باشد.
UsbEndpoint یک نقطه پایانی رابط را نشان می دهد که یک کانال ارتباطی برای این رابط است. یک رابط می تواند یک یا چند نقطه پایانی داشته باشد و معمولا دارای نقاط پایانی ورودی و خروجی برای ارتباط دو طرفه با دستگاه است.
"نقطه پایانی" یک رابط را نشان می دهد که کانال ارتباطی آن رابط است. یک رابط می تواند یک یا چند نقطه پایانی داشته باشد و معمولاً دارای نقاط پایانی برای دریافت اطلاعات و انتقال آن است.
اتصال UsbDevice نشان دهنده اتصال به دستگاه است که داده ها را در نقاط پایانی منتقل می کند. این کلاس به شما امکان می دهد داده ها را به صورت همزمان یا ناهمزمان به عقب و جلو ارسال کنید.
نشان دهنده یک "اتصال" به این دستگاه است. برای ارسال داده به نقطه پایانی مورد نیاز است. این کلاس به داده ها اجازه می دهد تا به صورت همزمان یا ناهمزمان دریافت یا ارسال شوند.
UsbRequest یک درخواست ناهمزمان برای برقراری ارتباط با یک دستگاه از طریق UsbDeviceConnection را نشان می دهد.
یک درخواست ناهمزمان برای برقراری ارتباط با یک دستگاه از طریق UsbDeviceConnection را نشان می دهد.
UsbConstants ثابت های USB را تعریف می کند که مطابق با تعاریف در Linux/usb/ch9.h هسته لینوکس است.
ثابت هایی را تعریف می کند که با تعاریف linux/usb/ch9.h هسته لینوکس مطابقت دارند.

تقریباً در تمام موارد استفاده از USB Host API، برنامه نویس از این کلاس ها در کار خود استفاده می کند. الگوریتم برای کاربرد آنها چیزی شبیه به این است: ما دستگاه ها را تعریف می کنیم (هدف این است دسترسی برنامه ایبه کلاس UsbDevice) که با استفاده از UsbManager به هاست (دستگاه تلفن همراه) متصل است. هنگامی که یک دستگاه به صورت برنامه نویسی دسترسی پیدا کرد، UsbInterface و UsbEndpoint مناسب باید برای ارتباط با آن تعریف شود. هنگامی که نقطه پایانی را در اختیار دارید، UsbDeviceConnection را باز کنید تا با دستگاه USB صحبت کنید. اگر نقطه پایانی در حالت ناهمزمان است، از کلاس UsbRequest استفاده کنید.

بیایید سعی کنیم همه اینها را با ایجاد یک برنامه ساده درک کنیم که با استفاده از این API، دستگاه متصل به هاست با سیستم عامل اندروید را مشخص می کند و برخی از اطلاعات مربوط به آن را روی صفحه گوشی یا تبلت نمایش می دهد.

یک پروژه ایجاد کنید

در Eclipse، یک پروژه با استفاده از آیتم های منو File->New->Android Application Project ایجاد می شود. همچنین توجه داشته باشید که کد زیر از برنامه‌های نمونه همراه با Android SDK (پوشه android sdk samples/android-N(API Level)/USB) گرفته شده است. ما داریم صحبت می کنیمدرباره برنامه مدیریت اسباب بازی USB Missile Launcher (شکل 4 را ببینید) نمونه برنامه ها از طریق Android SDK Manager دانلود می شوند (شما باید مورد را بررسی کنید - Samples for SDK). در لیست‌های زیر، نمونه‌های کد برای توضیح آنچه در حال رخ دادن است، توضیح داده شده‌اند.


شکل 4 اسباب بازی خنده دار "راکت انداز"

هنگام ایجاد یک پروژه، فراموش نکنید که سطح API مورد نیاز را در گزینه Minimum Requared SDK (سطح API 12، مربوطه) علامت بزنید. نسخه های اندروید 3.1 /لانه زنبوری/ یا بالاتر). این پروژه یک رابط کاربری بسیار ساده خواهد داشت - پنجره اصلی (Activity) و یک TextView برای نمایش اطلاعات. پروژه مشابهی به تفصیل در مورد بحث قرار گرفته است.

در کلاس تولید شده به طور خودکار برای Activity پروژه ما، باید نمونه های کلاس زیر را برای کار با USB تعریف کنید:

TextView خصوصی lgView.
خصوصی UsbManager mUsbManager;
mDevice خصوصی USBDevice.
خصوصی UsbDeviceConnection mConnection.
خصوصی UsbEndpoint mEndpointIntr;

LGView = (TextView) findViewById(R.id .logTextView) ;

و به کلاس UsbManager دسترسی پیدا کنید

MUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE) ;

بیایید یک کنترلر رویداد دیگر رویResume() ایجاد کنیم. بیایید به هدف دست یابیم - زمانی که پنجره برنامه ما فعال می شود، اطلاعات مربوط به دستگاه های متصل به روز می شود (به فهرست 1 مراجعه کنید).

فهرست 1. کنترل کننده رویداد onResume().

public void onResume()(
super .onResume();

// ظرف را با لیستی از دستگاه ها پر کنید
نقشه< String , UsbDevice>deviceList = mUsbManager.getDeviceList();
اشاره گر< UsbDevice>deviceIterator = deviceList.values() .iterator() ;

lgView.setText ( "تعداد دستگاه ها:" + deviceList.size () );

while (deviceIterator.hasNext()) (
UsbDevice device = (UsbDevice) deviceIterator.next() ;

//نمونه ای از تعیین ProductID دستگاه
\n"+ "Device ProductID: " + device.getProductId () );
}
//مقصد توضیح داده شده در فیلتر را تعریف کنید
// intent AndroidManifest.xml
intent intent = getIntent() ;
lgView.setText(lgView.getText() + " \n"+ "intent: " + intent) ;
String action = intent.getAction();

//اگر دستگاه متصل است، پیوند را به
//به تابع setDevice().
دستگاه UsbDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE ) ;
if (UsbManager.ACTION_USB_DEVICE_ATTACHED .برابر (عمل)) (
setDevice(دستگاه) ;
lgView.setText(lgView.getText() + " \n" + "UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(عمل) درست است") ;
) else if (UsbManager.ACTION_USB_DEVICE_DETACHED .برابر (عمل)) (
if (mDevice != null && mDevice.equals (device) ) (
setDevice(null) ;
lgView.setText(lgView.getText() + " \n" + "UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action) درست است") ;
}
}

در مرحله بعد، برای Activity، تابع setDevice() مورد نیاز برای کار با دستگاه خود را ایجاد می کنیم (به لیست 2 مراجعه کنید). در کنترلر onResume() و در تابع setDevice() دقیقاً از الگوریتم استفاده از USB Host API که در بخش قبل توضیح داده شد پیروی کردیم.

لیست 2. تابع setDevice().

private void setDevice (دستگاه UsbDevice) (
lgView.setText(lgView.getText() + " \n"+ "setDevice" + دستگاه) ;

// رابط های دستگاه موجود را تعریف کنید
if (device.getInterfaceCount () != 1) (

lgView.setText(lgView.getText() + " \n"+ "نمی‌توان رابط را پیدا کرد") ;
برگشت؛
}
UsbInterface intf = device.getInterface(0) ;

//نقاط پایانی دستگاه را تعریف کنید
اگر (intf.getEndpointCount() == 0 ) (

lgView.setText(lgView.getText() + " \n"+ "نقطه پایانی پیدا نشد" ) ;
برگشت؛
) دیگر (
lgView.setText(lgView.getText() + " \n"+ "Endpoints Count: " + intf.getEndpointCount () );
}

UsbEndpoint epIN = null ;
UsbEndpoint epOUT = null ;

//به دنبال نقاط پایانی برای ارسال وقفه باشید
برای (int i = 0 ; i< intf.getEndpointCount () ; i++ ) {
if (intf.getEndpoint(i).getType() == UsbConstants.USB_ENDPOINT_XFER_INT) (
if (intf.getEndpoint(i).getDirection() == UsbConstants.USB_DIR_IN) (
epIN = intf.getEndpoint (i) ;
lgView.setText(lgView.getText() + " \n"+ "IN endpoint: " + intf.getEndpoint (i) );
}
دیگر(
epOUT = intf.getEndpoint (i) ;
lgView.setText(lgView.getText() + " \n"+ "OUT endpoint: " + intf.getEndpoint (i) );
}
) else (lgView.setText(lgView.getText() + " \n" + "بدون نقطه پایانی برای INTERRUPT_TRANSFER") ; }
}

MDDevice = دستگاه;
mEndpointIntr = epOUT;

//دستگاه را برای انتقال داده باز کنید
اگر (دستگاه != پوچ) (
اتصال UsbDeviceConnection = mUsbManager.openDevice (دستگاه) ;
if (اتصال != null && connection.claimInterface (intf, true) ) (

lgView.setText(lgView.getText() + " \n"+ "باز کردن دستگاه SUCCESS!" ) ؛
mConnection = اتصال;

) دیگر (

lgView.setText(lgView.getText() + " \n"+ "باز کردن خرابی دستگاه!" ) ؛
mConnection = null ;
}
}
}
}

علاوه بر کد فوق، که همانطور که خواننده توجه قبلاً حدس زده است، دستگاه را برای دریافت و انتقال داده باز می کند، تنها استفاده از پروتکل تبادل داده باقی مانده است، که، تکرار می کنم، باید به خوبی برای توسعه دهنده شناخته شود. همانطور که وعده داده شده بود، در اینجا کدی است که با استفاده از انتقال وقفه، کلاس UsbRequest و نقطه پایانی مناسب، مقداری بسته داده پیام را به دستگاه HID ارسال می کند - به فهرست 3 مراجعه کنید.

فهرست 3. کد نمونه برای ارسال داده به دستگاه

//تعیین اندازه بافر برای ارسال
//مستقر حداکثر اندازهبسته بندی
int bufferDataLength = mEndpointIntr.getMaxPacketSize();

lgView.setText(lgView.getText() + " \n"+ mEndpointIntr.getMaxPacketSize ());

بافر ByteBuffer = ByteBuffer.allocate (bufferDataLength + 1 );

UsbRequest درخواست = new UsbRequest() ;

بافر قرار دادن (پیام) ;

request.initialize(mConnection, mEndpointIntr) ;

request.queue (بافر، bufferDataLength) ;

if (request.equals (mConnection.requestWait ()))

//ارسال با موفقیت انجام شد
//lgView.setText(lgView.getText() + "\n" + "ارسال CLEAR!!!");

گرفتن (استثناء سابق)

//چیزی اشتباه است...
//lgView.setText(lgView.getText() + "\n" + "ارسال واضح نیست...");

فیلتر کردن دستگاه در AndroidManifest.xml

اگرچه در برنامه ما نیازی به جستجو نیست دستگاه خاصبا VID شناخته شده (شناسه فروشنده) و PID (شناسه محصول)، مهندسان گوگلنمونه‌هایی از برنامه‌های بدون بخش فیلتر قصد در فایل مانیفست ارائه نکنید، و نویسنده نتوانست برنامه را بدون فیلتر کردن دستگاه در AndroidManifest.xml کار کند.

اجازه دهید به شما یادآوری کنم که Vendor-ID و Product-ID شناسه های منحصر به فرد برای دستگاه های USB هستند. یعنی با استفاده از فیلترینگ می توانید اپلیکیشنی ایجاد کنید که فقط با یک دستگاه خاص یا دسته ای از دستگاه ها تعامل داشته باشد. توجه داشته باشید که سازندگان دستگاه باید این اعداد را با سازمان USB IF موافقت کنند.

برنامه‌ای که فایل مانیفست آن در فهرست 4 نشان داده شده است و فایل شرایط فیلتر آن در فهرست 5 است، برای مثال، درایوهای فلش USB متصل به دستگاه تلفن همراه را با موفقیت تشخیص می‌دهد، اما صفحه‌کلید و موش‌های نویسنده را نمی‌شناسد. این اپلیکیشن به همراه کد منبع از لینک قابل دانلود است.

فهرست 4. فایل AndroidManifest.xml


" > http://schemas.android.com/apk/res/android"
> package="en.learn2prog.usbhostexample"
android:versionCode="1"
android:versionName="1.0" >


android:minSdkVersion="12"
android:targetSdkVersion="14" />


android:allowbackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

android:name= "en.learn2prog.usbhostexample.MainActivity"
android:label="@string/app_name" >
>

"android.intent.category.DEFAULT" />

"android.intent.category.LAUNCHER" />

>

>

>
"android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
>
>

>

فهرست 5. فایل فیلتر Device_filter.xml (/res/xml)

>

>

عملیات ساخت و نصب برنامه ما با عملیات معمول تفاوتی ندارد (نمونه‌هایی را در , مشاهده کنید). من می خواهم به اقدامات فیلتر قصد توجه کنم - هنگامی که دستگاه به میزبان متصل می شود، سیستم عامل از کاربر می خواهد که برنامه ما را راه اندازی کند.

ادبیات/پیوندها: 11.
12.
13. http://developer.android.com/guide/topics/connectivity/usb/host.html - مروری بر کلاس های مورد نیاز برای کار با USB در اندروید
14. پیوند به منابع برنامه

تصویر 1

رابط USB به عنوان یک رابط ارتباطی محبوبیت پیدا می کند لوازم جانبیبا رایانه شخصی و رایانه های مدرن اغلب رابط معمولی RS-232 را ندارند. محبوبیت USB به دلایل زیادی است که در اینجا به مهمترین آنها اشاره می کنیم:

  • نرخ ارز بالا، ایمنی بالای سر و صدا
  • کنترل جریان داده، کنترل یکپارچگی و تصحیح خطا
  • امکان انشعاب از طریق هاب و اتصال تعداد زیادی دستگاه.
  • منبع تغذیه اتوبوس
  • تطبیق پذیری اتوبوس - توانایی اتصال دستگاه های مختلف (صفحه کلید، چاپگر، مودم)
  • شناسایی و پیکربندی خودکار سیستم، Plug and Play

با این حال، عواملی (اغلب غیر معقول) وجود دارد که مانع استفاده اصلی از USB توسط توسعه دهندگان MCU می شود:

  • نیاز به برنامه نویسی درایورها برای ویندوز
  • شیوع نسبتا کم میکروکنترلرها با رابط USB داخلی
  • درس 2: یک دستگاه HID Joystick سازگار با USB 2.0 ایجاد کنید.

هدف از این سری مقالات نشان دادن این است که غلبه بر این مشکلات بسیار آسان است و همه می توانند دستگاه خود را از RS-232 معمولی به USB "ارتقاء" کنند یا یک دستگاه جدید با رابط USB ایجاد کنند.

به عنوان یک میکروکنترلر در مثال ها، یک میکروکنترلر ساخت شرکت Microchip در نظر گرفته خواهد شد. PIC18F4550 با رابط USB 2.0 (پشتیبانی از سرعت کم و سرعت کامل).

درس 1. USB بدون برنامه نویسی ویندوز، پورت COM مجازی

یکی از کارهایی که هنگام توسعه دستگاه های USB ایجاد می شود، انتقال از رابط RS-232 به USB است و اگر یک دستگاه "قدیمی" در حال تغییر است یا دستگاه باید با پروتکل های موجود و نرم افزار رایانه شخصی سازگار باشد، پس بهتر است از شر هرگونه تغییر نرم افزار خلاص شوید.نرم افزار روی کامپیوتر. یکی از راه حل های این مشکل استفاده از رابط USB به عنوان یک پورت COM مجازی است. استفاده از این روش نیاز به اصلاح نرم افزار کامپیوتر را از بین می برد، زیرا. اتصال USB توسط رایانه شخصی به عنوان یک پورت COM اضافی دیده می شود. مزیت مهم دیگر این است که از درایورهای استاندارد ویندوز استفاده می شود و نیازی به ایجاد درایور سفارشی نیست.

مشخصات USB یک کلاس از دستگاه های ارتباطی (Communication Device Class - CDC) را توصیف می کند که مجموعه ای از حالت های اتصال را برای ارتباطات راه دور (مودم ها، پایانه ها، تلفن ها) و دستگاه های شبکه (آداپتورها و هاب های اترنت، مودم های ADSL)، از جمله شبیه سازی پورت سریال تعریف می کند. .

بیایید به عنوان مثال دستگاهی را در نظر بگیریم که داده‌های ولتاژ را از یک پتانسیومتر و دما را از یک سنسور دیجیتال TC77 از طریق RS-232 ارسال می‌کند و همچنین فرمان‌هایی برای روشن/خاموش کردن دو LED دریافت می‌کند (برای سادگی، این مثال را در PICDEM™ FS پیاده‌سازی می‌کنیم. برد USB DEMONSTRATION BOARD، اما می توانید مدار ساده تری را جمع آوری کنید - به زیر مراجعه کنید).

برد اشکال زدایی PICDEM FS-USB برای توسعه و نمایش دستگاه های مبتنی بر میکروکنترلر PIC18F4550 با گذرگاه USB2.0 طراحی شده است. این برد دارای کنترلر PIC18F4550 در پکیج TQFP44 می باشد که دارای ویژگی های زیر می باشد:

  • حداکثر فرکانس کاری - 48 مگاهرتز (12 MIPS)؛
  • حافظه برنامه فلش 32 کیلوبایت (فناوری Flash پیشرفته)؛
  • 2 کیلوبایت حافظه داده (که 1 کیلوبایت رم دو پورت)
  • 256 بایت حافظه داده EEPROM;
  • رابط FS USB2.0 با پشتیبانی از سرعت 12 مگابیت بر ثانیه با فرستنده و گیرنده داخلی و تنظیم کننده ولتاژ.

هیئت دارای:

  • کوارتز 20 مگاهرتز;
  • رابط RS-232 برای نشان دادن امکان انتقال از USART به USB.
  • کانکتور برای برنامه نویسی و اشکال زدایی در مدار
  • تثبیت کننده ولتاژ با قابلیت سوئیچ به برق باس USB.
  • اتصال گسترش PICtail™؛
  • سنسور دما TC77 از طریق I2C متصل شده است.
  • مقاومت متغیر متصل به ورودی ADC.
  • LED ها، دکمه ها

این دستگاه دارای یک برنامه کامپیوتری برای کنترل دستگاه و نمایش مقادیر ولتاژ و دما می باشد. بنابراین، می‌توانیم دستگاه را به RS-232 متصل کنیم، پورت COM موجود در سیستم را انتخاب کرده و نرخ تبادل با دستگاه خود، تعداد بیت‌های داده، تعداد بیت‌های توقف و همچنین پارامترهای بیت‌های برابری و کنترل جریان مطابق با برنامه میکروکنترلر (برای اینکه باید پارامترهای اولیه کنترلر خود را بدانیم)


برنج. 2

بیایید شروع به اتصال دستگاه خود به USB کنیم.

شرکت فناوری ریزتراشه یک مثال کاربردی آماده ارائه می دهد AN956، که پشتیبانی از USB CDC را برای میکروکنترلر PIC18F2550، PIC18F2455، PIC18F4455، PIC18F4550 اجرا می کند. این برنامه بر اساس ماژولار ساخته شده است که امکان نوسازی و ادغام آسان در پروژه های تمام شده را فراهم می کند.

پس از شروع اولیه کنترلر، برنامه می تواند از طریق رابط USB از طریق چندین عملکرد آماده با رایانه شخصی ارتباط برقرار کند:

بیایید برنامه خود را برای ارسال و دریافت داده ها از طریق USB تغییر دهیم.

بخشی از برنامه برای تهیه و انتقال داده ها:

دریافت داده ها:

if(getsUSBUSART(input_buffer,1)) ( switch (input_buffer) ( case "1" : mLED_3_On(); break; case "2" : mLED_3_Off(); break; case "3" : mLED_4_On(); break; case " 4" : mLED_4_Off()؛ شکست؛ پیش‌فرض: شکست؛ ))

پس از اتصال دستگاه به USB، سیستم دستگاه جدید را تشخیص می دهد


برنج. 3

و تجهیزات جدید را نصب می کند


برنج. چهار

نصب را از محل مشخص شده انتخاب می کنیم و مسیر را برای مکان فایل mcpusb.inf از مجموعه کدهای منبع برنامه به AN956 مشخص می کنیم. پس از آن یک دستگاه جدید در سیستم نصب می شود.


برنج. 5

بنابراین، دستگاه جدید آماده راه اندازی است. این سیستم دارای یک پورت COM مجازی جدید است.


برنج. 6

اکنون در برنامه خود می توانیم پورت COM مجازی ظاهر شده را برای ارتباط با دستگاه انتخاب کنیم...


برنج. 7

... و ببینید که دستگاه واقعاً از طریق پورت COM که از طریق اتصال USB در سیستم ظاهر می شود شروع به کار کرد.

لازم به ذکر است که USB کنترل و تصحیح داده ها را فراهم می کند، بنابراین مفاهیمی مانند نرخ جریان، بیت های برابری و کنترل جریان به مفاهیم انتزاعی تبدیل می شوند و در مورد ما می توانند توسط هر کسی انتخاب شوند، تنها پارامتر اطلاعاتی شماره پورت COM مجازی است.

پنجره PICDEM CDC


برنج. هشت

هنگام استفاده از میکروکنترلرهای PIC18Fxx5x با ماژول داخلی USB 2.0، پورت COM مجازی می تواند سرعت انتقال داده تا 80 کیلوبایت در ثانیه (640 کیلوبیت بر ثانیه) را ارائه دهد، که به طور قابل توجهی از نرخ انتقال احتمالی از طریق RS-232 فراتر می رود، در حالی که، همانطور که می توانیم ببینید، نیازی به تغییر نرم افزار برای کامپیوتری که مصرف کرده است وجود ندارد!

نمونه برنامه ها، مستندات و نمودارهای مورد استفاده در درس 1.

  1. دانلود PICDEM CDC + منابع دلفی
  2. دانلود کامپوننت دلفی برای کار با پورت COM
  3. AN956+ کدهای منبع اصلی
  4. فایل user_uart.c (تمام تغییرات برنامه اصلی از AN956 فقط در این فایل انجام شده است. برای اجرای مثال درس 1، باید این فایل را در دایرکتوری C:\MCHFFSUSB\fw\Cdc\user\ کپی کنید. فایل user.c در پروژه با user_uart .c، پروژه را کامپایل کرده و میکروکنترلر را فلش کنید)
  5. نمودار ساده شده یک دستگاه USB


برنج. 9

توجه: مدار اصلی برد USB PICDEM FS از تشخیص خودکار منبع تغذیه برد (خارجی یا USB) استفاده می کند. بنابراین، هنگام استفاده از یک طرح ساده شده، باید خط #define USE_USB_BUSSENSE_IO را در فایل usbcfg.h بیان کنید.

درس 2: ایجاد یک دستگاه HID Joystick سازگار با USB 2.0

رایج ترین دستگاه های USB، دستگاه های رابط انسانی (HID) هستند. نمایندگان معمولی این کلاس عبارتند از: صفحه کلید USB، ماوس، جوی استیک، پانل های تنظیمات مانیتور، بارکدخوان ها، کارت خوان ها و غیره. مزایای دستگاه های HID عبارتند از:

  • سهولت اجرا؛
  • کد فشرده؛
  • پشتیبانی از ویندوز (بدون نیاز به درایورهای اضافی).

وب سایت Microchip نمونه ای از اجرای ماوس HID را دارد. اجرای ساده ترین کنترلر بازی را بر اساس این مثال در نظر بگیرید. برای این پروژه از برد نمایشی PICDEM FS-USB (DM163025) استفاده خواهیم کرد. برد اشکال زدایی PICDEM FS-USB دارای یک مقاومت متغیر و 2 دکمه است، بنابراین جوی استیک در حال توسعه دارای حداقل کنترل خواهد بود (2 دکمه و به عنوان مثال، یک دریچه گاز).

ابتدا باید توصیفگر دستگاه را برای جوی استیک ایجاد شده بازنویسی کنیم. برای ساده کردن کار می توانید از برنامه HID Descriptor Tool استفاده کنید که از سایت قابل دانلود است. www.usb.org

همراه با برنامه نمونه هایی از تنظیمات برخی از دستگاه های HID است که می توانید آنها را برای کار خود تنظیم کنید یا دستگاه HID خود را ایجاد کنید.


برنج. ده

بنابراین، در مورد ما، از چندین نوع داده استفاده خواهد شد - این یک شبیه سازی کنترل است - کنترل های شبیه سازی، و به طور خاص این دکمه های دریچه گاز (پدال) (دریچه گاز) و دکمه های کنترل (دکمه) است. برای اینکه سیستم عامل بداند چگونه این نوع داده ها را مدیریت کند، لازم است حداکثر و حداقل مقادیر و اندازه داده ها را توصیف کند. در مورد ما، "گاز" یک مقدار 8 بیتی است (report_size = 8، report_count = 1)، و وضعیت دکمه ها به عنوان یک فیلد از مقادیر یک بیتی تعریف می شود. مثال فقط از 2 دکمه استفاده می کند، اما لازم است که فیلد را با یک مقدار بایت تراز کنید (report_size = 1، report_count = 8). در مجموع، میکروکنترلر هنگام درخواست داده از رایانه، باید 2 بایت را ارسال کند - سطح گاز و وضعیت دکمه ها مطابق با توصیفگر دستگاه تولید شده (برای شرح دقیق توصیفگرهای احتمالی، مشخصات دستگاه های HID را ببینید. www.usb.org). شرح ایجاد شده از توصیفگر دستگاه را می توان در قالب های مختلف از جمله به عنوان فایل هدر ذخیره کرد

علاوه بر این، باید اندازه توصیفگر دستگاه دریافتی را در توضیح توصیفگر کلاس HID تنظیم کنید و اندازه داده‌های ارسال شده از طریق نقطه پایانی در توصیفگر نقطه پایانی را تغییر دهید (در مورد ما، ما 2 بایت را انتقال می‌دهیم، بنابراین اندازه HID_INT_IN_EP_SIZE=2 است.

این تغییرات برای ویندوز کافی است تا دستگاه متصل را به عنوان جوی استیک تشخیص دهد. اکنون می‌توانیم داده‌های رشته را طوری تنظیم کنیم که دستگاه نام مورد نظر خود را داشته باشد (مثلاً "PIC18F4550 Joystick"). برای اختصاص یک نام به دستگاه به زبان روسی، باید یک توصیفگر رشته در رمزگذاری یونیکد مشخص کنید. اینجاست که توضیحات جوی استیک به پایان می رسد و باید داده ها را برای انتقال به کامپیوتر آماده کنیم.

ReadPOT(); // شروع بافر اندازه گیری ولتاژ پتانسیومتر = ADRESH; // دکمه handle وضعیت if(sw2==0) بافر |= 0x01; بافر &= ~0x01; if(sw3==0) بافر |= 0x02; بافر &= ~0x02; // انتقال داده Emulate_Joystick();

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


برنج. یازده

از طریق کنترل پنل در ویندوز می‌توانیم دستگاه‌های بازی موجود را باز کنیم، جوی استیک خود را انتخاب کنیم، آن را کالیبره کنیم و عملکرد را آزمایش کنیم.


برنج. 12

هنگام تغییر پیکربندی دستگاه - اضافه کردن کنترل ها یا دکمه ها، نه تنها باید توضیحات توصیفگر دستگاه را تغییر دهید، بلکه داده ها را دقیقاً مطابق با توصیفگر ایجاد شده منتقل کنید. بنابراین، با تغییر حداکثر تعداد دکمه ها از 2 به 8 در توضیحات توصیفگر دستگاه USAGE_MAXIMUM (BUTTON 2)، یک جوی استیک با 8 دکمه دریافت می کنیم.


برنج. 13

وقتی توصیفگر پیچیده‌تر می‌شود، می‌توانیم اجرای کامل‌تری از جوی استیک دریافت کنیم، در حالی که باید به یاد داشته باشید که پارامترهای زیر را تغییر دهید: اندازه توصیفگر، اندازه نقطه پایانی، و باید به همان اندازه داده‌های اطلاعاتی ارسال کنید. همانطور که در توصیف بیان شده است.


برنج. چهارده

نمونه برنامه ها، مستندات و نمودار مورد استفاده در درس 2.

  1. کدهای منبع اصلی برای اجرای موس HID.
  2. کدهای منبع اجرای جوی استیک HID.

درس 3

هر دستگاه USB می تواند چندین پیکربندی داشته باشد و هر پیکربندی دارای چندین رابط است. این ویژگی USB به دستگاه در حال ایجاد اجازه می دهد تا توسط رایانه به عنوان چندین دستگاه USB با رابط های مختلف شناسایی شود. به عنوان مثال، یک ماوس ممکن است یک کارتخوان داخلی داشته باشد و به عنوان دو دستگاه مستقل با رایانه تعامل داشته باشد.

ساختار توصیفگر دستگاه:


برنج. پانزده

بر اساس مثال استاندارد ماوس و جوی استیک ایجاد شده، یک دستگاه USB ترکیبی ایجاد می کنیم که توسط کامپیوتر به عنوان دو دستگاه HID مستقل تعریف می شود.

1. یک توصیفگر ایجاد کنید.

تغییر ساختار توصیفگر (فایل usbdsc.h)

دستگاه دارای 2 رابط خواهد بود که هر کدام یک نقطه پایانی دارند.

#define CFG01 rom struct \(USB_CFG_DSC cd01;\USB_INTF_DSC i00a00;\USB_HID_DSC hid_i00a00;\USB_EP_DSC ep01i_i00a00;\USB_INTFG_DSC cd01;\USB_INTF_DSC i00a00;\USB_HID_DSC hid_i00a00;\USB_EP_DSC ep01i_i00a00;\USB_INTFG_DSC cd01;\USB_INTF_HID_DSC;
  1. مطابق با ساختار تغییر یافته، باید توصیفگر را در فایل usbdsc.c تغییر دهید.
  2. در فایل usbcfg.h، شناسه‌های رابط، نقاط پایانی مورد استفاده، اندازه‌های توصیفگر را گزارش کنید.
  3. در فایل hid.c، باید نقاط پایانی اضافی (در تابع HIDInitEP) را مقداردهی اولیه کنید و تابع پردازش درخواست HID (تابع USBCheckHIDRequest) را تغییر دهید.
  4. هر یک از دستگاه ها، ماوس و جوی استیک، هر کدام باید داده ها را به نقطه پایانی خود منتقل کنند. بنابراین، باید توابعی را برای انتقال داده ها به نقاط پایانی خاص و بررسی رایگان بودن نقطه پایانی مورد نظر اضافه کنیم (توابع مشابه mHIDTxIsBusy و HIDTxReport را در فایل hid.c اضافه کنید).

سپس انتقال داده برای ماوس به نظر می رسد

پس از کامپایل پروژه، فلش کنترلر و اتصال دستگاه به USB، دستگاه کامپوزیت جدید توسط کامپیوتر شناسایی شده و ماوس و جوی استیک به آن اضافه می شود.


برنج. 16


برنج. 17

کدهای منبع دستگاه HID ترکیبی.

اظهار نظر.فراموش نکنید که هنگام ایجاد یک دستگاه جدید، PID را تغییر دهید یا دستگاه قبلی با همان PID را از سیستم حذف کنید.

درس 4

شرکت فناوری ریزتراشه برنامه نویس توسعه دهنده ارزان قیمت را منتشر می کند PICkit2، که در درجه اول برای برنامه نویسی کنترلرهای فلش استفاده می شود. ویژگی بارز این برنامه نویس در دسترس بودن اسناد کامل و کدهای منبع سیستم عامل برای میکروکنترلر و یک برنامه پوسته برای رایانه است. PICkit2 با USB تغذیه می شود، برنامه ریزی قابل تنظیم و ولتاژ برق تولید می کند و همچنین دارای 3 خط ورودی-خروجی برای اتصال به یک دستگاه قابل برنامه ریزی است. برای اینکه بتوانید سیستم عامل برنامه نویس را در PICkit2 به روز کنید، یک برنامه بوت لودر پیاده سازی شده است.


برنج. هجده

دستگاه CDC بر اساس PICkit2

با استفاده از تمام این ویژگی ها، بر اساس برنامه نویس PICkit2، می توان دستگاه USB خود را با قابلیت بازگشت به عملکردهای برنامه نویس خود در هر زمان ایجاد و اشکال زدایی کرد. با کمک بوت لودری که در پروگرامر فلش می شود، می توان برنامه های دیگر را در PICkit2 فلش کرد، مثلاً برنامه پشتیبانی از پورت COM مجازی. برای این کار CDC را مثال می زنیم، نام پروژه را تغییر می دهیم و کارهای زیر را انجام می دهیم

  1. در فایل main.c، آدرس محل سفت‌افزار را تغییر می‌دهیم (بوت‌لودر PICkit2 کنترل را به برنامه کاربر به آدرس 0x002000 منتقل می‌کند.
    #کد پراگما _RESET_INTERRUPT_VECTOR = 0x002000
  2. در فایل io_cfg.h، همه چیز در مورد پورت D را حذف می کنیم (می توانید LED را طوری تنظیم کنید که در PORTC0 چشمک بزند).

    از آنجایی که PICKIT2 همیشه با USB تغذیه می شود، ما تنظیم کردیم

    #define usb_bus_sense 1 // دستگاه همیشه به برق وصل است #define self_power 0 // دستگاه از USB تغذیه می شود

  3. در فایل usbcfg.h نظرات را در 2 خط قرار داده ایم
    //#define USE_SELF_POWER_SENSE_IO //#define USE_USB_BUS_SENSE_IO
  4. در فایل user.c، داده های مورد نیاز را به USB خروجی می دهیم
  5. فایل پیوند دهنده pickit2.lkr را شامل شود

پس از آن، می توانید پروژه را کامپایل کرده و سیستم عامل جدید را از طریق پوسته PICkit2 بارگذاری کنید.

پس از برنامه ریزی مجدد PICkit2، کامپیوتر ظاهر یک پورت COM جدید را تشخیص می دهد و از طریق هایپرترمینال می توانیم ببینیم که PICkit2 داده ها را از طریق پورت COM مجازی ارسال می کند.

کد منبع برای این مثال در دسترس است ارتباط دادن.

بر اساس این مثال و با استفاده از پین های خارجی برنامه نویس PICkit2 می توانید داده ها را از دستگاه های خارجی دریافت کرده و از طریق USB به کامپیوتر انتقال دهید. بنابراین، با استفاده از PICkit2، می توانید داده ها را به نشانگرهای COG LCD، خوانندگان I2C، دستگاه های SPI و 1 سیم مانند سنسورهای دما و غیره خروجی دهید.

صفحه کلید Radio HID بر اساس PICkit2


برنج. 19

بیایید یک مثال دیگر از استفاده "نامناسب" از برنامه نویس PICkit2 را در نظر بگیریم - شبیه ساز صفحه کلید با رابط هوا. از چنین دستگاهی می توان برای مثال برای ارائه - برای ورق زدن اسلایدها از رایانه استفاده کرد.

برای پیاده سازی چنین دستگاهی به موارد زیر نیاز داریم:

  • PIKit2
  • برد نمایشی PICkit2 (DV164120)
  • گیرنده رادیویی (rfRXD0420) و فرستنده رادیویی (rfPIC12F675) از rfPICkit.

گیرنده رادیویی را به برد دمو وصل می کنیم. میکروکنترلر روی برد داده ها را از گیرنده دریافت می کند، آنها را پردازش می کند و با فشار دادن یکی از دو دکمه روی کنترل از راه دور، سطح log.1 را در یکی از 2 خروجی متصل به PICkit2 تنظیم می کند.

PICkit2 عملکردهای زیر را انجام خواهد داد:

  • هنگامی که از طریق USB به رایانه متصل می شود، به عنوان صفحه کلید HID تعریف می شود
  • یک ولتاژ تغذیه + 5 ولت برای یک برد آزمایشی با یک گیرنده تولید کنید
  • 2 خروجی خارجی کنترل کننده گیرنده و در صورت وجود، یک گزارش را بازجویی کنید. 1 کدهایی را برای فشار دادن دکمه های PageUp یا PageDown به رایانه ارسال کنید.

دو پورت COM مجازی (شبیه سازی تراشه FTDI2232) بر اساس PICKit2

این مثال فقط برای یادگیری نحوه عملکرد USB است. قبل از استفاده، الزامات گواهینامه رانندگی FTDI را بررسی کنید!

این مثال نحوه ساخت 2 پورت COM مجازی را بر اساس یک میکروکنترلر با پورت USB نشان می دهد.ابتدا باید درایورهای تراشه FTDI2232 را نصب کنید. سپس، برای بوت شدن در PICkit2، باید آیتم به روز رسانی سیستم عامل را در پوسته PICkit2 انتخاب کنید و به فایل TestVCP2.hex از آن اشاره کنید. بایگانی. پس از برنامه ریزی مجدد PICkit2، 2 پورت COM سریال مستقل در سیستم خود خواهید داشت.

نمونه برگرفته از وب سایت http://forum.microchip.com/tm.aspx?m=261649

برای بازیابی معکوس PICkit2 به عنوان یک برنامه نویس، باید PICkit2 را از USB جدا کنید و در حالی که دکمه را فشار می دهید، کابل USB را مجدداً وصل کنید و سپس بارگذاری سیستم عامل استاندارد برنامه نویس را انتخاب کنید.

تمام مثال های بالا بر اساس MCHFFSUSB Framework v1.3 هستند. با ظهور کنترلرهای PIC24 و PIC32 با USB OTG، Microchip نسخه جدیدی از پشته را منتشر کرد - USB stack v. 2.x.

در نسخه جدید USB stack v. 2.3، علاوه بر پشته های دستگاه USB که عملکرد یک کلاینت USB را اجرا می کند، میزبان USB Embedded که عملکرد میزبان را اجرا می کند، یک پشته دو نقش USB که عملکردهای میزبان و کلاینت را اجرا می کند نیز به دست آمده است. و USB OTG که از پروتکل مذاکره نقش میزبان (HNP)، پروتکل درخواست جلسه (SRP) پشتیبانی می کند و کاملاً با مشخصات USB OTG مطابقت دارد. پیاده سازی شده در نمونه های کاربردی:

  • میزبان تعبیه شده
    • میزبان کلاس چاپگر - پشتیبانی از چاپگرهای ESC/POS، PostScript® و PCL5
    • میزبان کلاس CDC - پشتیبانی از دستگاه های ACM (مدل کنترل انتزاعی)
    • صفحه کلید HID
  • دستگاه
    • بوت لودر HID - پشتیبانی اضافه شده برای خانواده های PIC32MX460F512L و PIC18F14K50
    • صفحه کلید HID، ماوس
    • دمو فلش داخلی MSD - استفاده از فلش داخلی برای ذخیره فایل ها
    • نمونه ترکیبی MSD + HID - نمونه دستگاه کامپوزیت MSD و HID
    • CDC - شبیه سازی پورت COM
    • پشتیبانی خانواده PIC32MX460F512L برای تمام پروژه های نمایشی رایانه شخصی
    • نمونه‌های HID، MCHPUSB و WinUSB اکنون از ویژگی مایکروسافت Plug-and-Play (PnP) برای تشخیص خودکار پشتیبانی می‌کنند.
  • مستندات
    • شرح کامل همه APIها در پوشه "\Microchip\Help" قرار دارد.

Microchip درایورهای رایگان را برای محبوب ترین کلاس های USB فراهم می کند:

  1. رابط کاربری (HID). این حالت تبادل تقریباً در تمام صفحه کلیدها، ماوس ها و سایر دستگاه های ورودی/خروجی استفاده می شود.
  2. دستگاه ارتباطی (CDC). این حالت ساده ترین حالت برای تغییر از سریال RS-232 به USB است. در رایانه‌های WinXP/2K، یک پورت COM مجازی ایجاد می‌شود و هنگامی که یک میکروکنترلر متصل است، شبیه‌سازی می‌شود. برنامه هایی که با COM1.. 4 پورت کار می کنند بدون تغییر با پورت مجازی کار می کنند اما با سرعت بالاتر (حدود 1 مگابیت بر ثانیه)
  3. دستگاه های ذخیره سازی انبوه (MSD). اینها دستگاه هایی هستند که به عنوان رسانه ذخیره سازی کار می کنند - درایوهای فلش، کارت های SD / MMC، دیسک ها و غیره.
  4. دستگاه های کلاس چاپگر. این حالت برای استفاده با چاپگرهای USB طراحی شده است، که به دستگاه نهایی روی یک میکروکنترلر PIC با ماژول USB اجازه می دهد تا اطلاعات لازم را مستقیماً به چاپگر USB ارسال کند.
  5. بوت لودر مقیم ریزتراشه. ساده ترین حالت که فقط برای به روز رسانی نرم افزار میکروکنترلر از طریق USB استفاده می شود. از سمت رایانه شخصی، یک برنامه کوچک، آنالوگ درایور نصب شده است
  6. راننده شخصی (سفارشی). کامل ترین استفاده از منابع USB2.0 برای کاربران پیشرفته: امکان انتخاب حالت های عملکرد اتوبوس (هم زمان، وقفه، فراگیر، کنترل)، سرعت انتقال بالا. به دانش عمیق اتوبوس و مهارت های توسعه نرم افزار ویندوز نیاز دارد

بوت لودر با درایو فلش USB

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

برای به روز رسانی سیستم عامل میکروکنترلر با ماژول USB-OTG (PIC24 یا PIC32)، نیازی به استفاده از نرم افزار خاصی نیست. وجود حالت Host به شما امکان می دهد درایوهای معمولی USB-data (Flash Drive) را به میکروکنترلر متصل کنید. یک نمونه در وب سایت میکروچیپ ( نسخه بتا) که به شما امکان می دهد نرم افزار میکروکنترلر را از یک درایو USB متصل به روز کنید.

برای اجرای مثال، باید سفت‌افزار بوت‌لودر را در یک PIC32 USB Board یا Explorer 16 بارگذاری کنید (با یک ماژول پردازنده PIC32 USB PIM و یک PICtail Plus USB Daughter Board نصب شده است). اگر در حالی که دکمه فشار داده شده است، برق به برد اعمال شود، کنترلر وارد حالت به روز رسانی سیستم عامل می شود. اگر اکنون یک درایو فلش را با یک فایل به روز رسانی سیستم عامل ضبط شده متصل کنید، میکروکنترلر این فایل را می خواند و آن را در حافظه برنامه خود بازنویسی می کند.

بردهای توسعه و ابزارهای توسعه برای USB

برنامه نویس اشکال زدا PICkit2 (شماره سفارش PG164120)

وجود بوت لودر به شما این امکان را می دهد که نرم افزار خود را برای تسلط بر مهارت های کار با USB آپلود کنید


برنج. بیست

برد توسعه PICDEM FS-USB (شماره سفارش DM163025)

طراحی شده برای توسعه و نمایش دستگاه های مبتنی بر میکروکنترلر PIC18F4550 با گذرگاه USB2.0. این برد دارای کنترلر PIC18F4550 در پکیج TQFP44 می باشد.


برنج. 21

کیت توسعه USB کم تعداد پین (شماره سفارش DM164127)

کیت توسعه USB Low Pin Count راه آسانی برای ارزیابی قابلیت‌های میکروکنترلر میکروکنترلرهای 20 پین USB Microchip PIC18F14K50 و PIC18F13K50 ارائه می‌کند. این کیت شامل همه چیزهایی است که برای شروع کار با کنترلرهای USB (نرم افزار، نمونه فایل های منبع، اسناد) نیاز دارید.


برنج. 22

PIC18F87J50 Full Speed ​​USB Board PIC18F87J50 FS USB Demo Board (شماره سفارش MA180021)

PIC18F87J50 FS USB Demo Board برای اشکال زدایی میکروکنترلرهای Full Speed ​​USB 2.0 از خانواده PIC18F87J50 استفاده می شود. این برد علاوه بر عملکرد مستقل، می تواند به عنوان یک ماژول پردازنده برای برد اکسپلورر PIC18 نیز استفاده شود.


برنج. 23

کیت شروع PIC24 (شماره سفارش DM240011)

کیت استارت PIC24F حاوی همه چیزهایی است که برای شروع کار با خانواده کنترلرهای PIC24F با کارایی بالا نیاز دارید. این کیت ارزان قیمت شامل یک دیباگر و برنامه نویس درون مدار یکپارچه، یک کنترلر USB PIC24F (کارکردهای میزبان و دستگاه را می توان بر روی برد اجرا کرد)، یک LED سه رنگ، یک صفحه لمسی خازنی و یک صفحه نمایش گرافیکی OLED. برنامه آزمایشی از طریق منوی گرافیکی به شما امکان می دهد داده ها را در یک درایو فلش USB خارجی بنویسید، صفحه لمسی را پیکربندی کنید و کارهای گرافیکی را اجرا کنید.


برنج. 24

برد USB PIC32 (شماره سفارش DM320003)

به شما امکان می دهد بر ماژول USB-OTG در کنترلرهای PIC32 مسلط شوید


برنج. 25

برد توسعه "Explorer 16 Development Board" (شماره سفارش DM240001)

این یک ابزار اشکال زدایی کم هزینه برای شروع کار با خانواده میکروکنترلرهای 16 بیتی PIC24 و کنترلرهای پردازش سیگنال دیجیتال dsPIC33F است.


برنج. 26

برد دختر "USB PICtali Plus" (شماره سفارش AC164131)

همراه با ماژول‌های پلاگین پردازنده USB، به شما امکان می‌دهد دستگاه‌های USB میزبان، دستگاه، USB-OTG را توسعه و اشکال‌زدایی کنید.


برنج. 27

ایلیا آفاناسیف،
شرکت

بیایید با حداقل ها شروع کنیم:
شامل 18f2455 -- کتابخانه برای MK استفاده شده
--
enable_digital_io() - همه ورودی ها را به حالت دیجیتال تغییر دهید
--
نام مستعاردکمه استپین_B7 -- از آنجایی که یک دکمه وصل شده ایم، آن را اعلام کنید
pin_B7_direction = ورودی -- دکمه در ورودی برای ما کار می کند
--
-- یک خط - و ما همه چیزهایی را که برای کار با USB CDC نیاز دارید در اختیار داریم
شامل usb_serial -- کتابخانه usb
--
usb_serial_init() --- USB CDC را راه اندازی کنید
حلقه برای همیشه- حلقه اصلی، به طور مداوم اجرا می شود
usb_serial_flush() -- به روز رسانی usb. این روش تمام کارهای لازم را انجام می دهد
- اقداماتی برای حفظ ارتباط با رایانه شخصی
حلقه پایانی

پس از کامپایل این کد، نتیجه را بنویسید فایل هگزدر MK با استفاده از بوت لودر و راه اندازی دستگاه، مشاهده نحوه تعریف یک دستگاه جدید در سیستم امکان پذیر خواهد بود: Virtual com-port.

اکنون که دستگاه از قبل کار می کند، بیایید به آن ارتباط برقرار کنیم.

برای خواندن بایت دریافتی یک تابع وجود دارد usb_serial_read(بایت ) :بولی. اگر بایت دریافتی وجود داشته باشد، آن را در متغیر مشخص شده ذخیره می کند و برمی گرداند درست است، واقعی، در غیر این صورت برمی گردد نادرست.

روشی برای ارسال یک بایت وجود دارد usb_serial_data. به عنوان یک متغیر پنهان شده است، بنابراین برای ارسال یک بایت، کافی است مقدار بایت ارسال شده را به آن اختصاص دهید.

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

شامل 18f2455
--
enable_digital_io()
--
نام مستعاردکمه استپین_B7
pin_B7_direction = ورودی
--
--
شامل usb_serial
--
usb_serial_init()
var بایتفصل - یک متغیر را اعلام کنید
حلقه برای همیشه-- حلقه اصلی
usb_serial_flush()
اگر(usb_serial_read(ch)) سپس-- اگر یک بایت دریافت شود، در ch نوشته می شود
usb_serial_data=ch -- بایت دریافتی را پس بفرستید
پایان اگر
حلقه پایانی

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

در حالی که ما خودمان را نداریم، از یک ترمینال آماده استفاده می کنیم: من از برنامه RealTerm استفاده کردم.
پورت را با شماره دلخواه باز می کنیم و دیتا را ارسال می کنیم.


و آنچه را که فرستادیم پس می گیریم. بنابراین همه چیز همانطور که باید کار می کند.

نرم

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

ما یک پروژه جدید ایجاد می کنیم، اجزای لازم را به شکل پراکنده می کنیم:
SpinEdit1 - برای تعیین شماره پورت
دکمه 1 - برای ایجاد یک اتصال
دکمه 2 - برای قطع اتصال
SpinEdit2 - برای وارد کردن یک بایت به شکل اعشاری
Button3 - برای ارسال یک بایت
Memo1 - برای نمایش اطلاعات دریافتی.

همانطور که در بالا ذکر شد، باید مانند یک فایل متنی معمولی با پورت com کار کنید: با استفاده از توابع CreateFile، WriteFile و ReadFile.

برای اینکه وارد جزئیات نشویم، بیایید یک کتابخانه آماده برای کار با پورت com در نظر بگیریم: ComPort.

وظیفه لازم را روی هر دکمه آویزان می کنیم و کد نهایی را دریافت می کنیم:

واحد واحد 1;

رابط

استفاده می کند
ویندوز، پیام‌ها، SysUtils، انواع، کلاس‌ها، گرافیک‌ها، کنترل‌ها، فرم‌ها،
دیالوگ ها، StdCtrls، Spin،ComPort.

نوع
TForm1 = کلاس (TForm)
SpinEdit1: TSpinEdit;
دکمه 1: TButton;
Button2: TButton;
SpinEdit2: TSpinEdit;
Button3: TButton;
Memo1:TMemo;
رویه OnRead(فرستنده: TObject؛ ReadBytes: آرایه بایت)؛
رویه Button1Click(فرستنده: TObject);
procedure Button2Click(فرستنده: TObject);
Procedure FormDestroy(فرستنده: TObject);
procedure Button3Click(فرستنده: TObject);
خصوصی
(اعلامیه خصوصی)
پورت: TComPort;
عمومی
(اعلامیه های عمومی)
پایان؛

var
Form1: TForm1;
تعداد: عدد صحیح
پیاده سازی

روش TForm1.Button1Click(فرستنده: TObject);
شروع
Port:= TComPort.Create(SpinEdit1.Value, br115200); // ایجاد یک اتصال
Port.OnRead:= OnRead; //یک جریان برای خواندن داده های دریافتی ایجاد کنید
Button2.Enabled:= true ; //دکمه بستن اتصال را فعال کنید
پایان؛

روش TForm1.Button2Click(فرستنده: TObject);
شروع
پورت رایگان؛ // اتصال را ببندید
Button2.Enabled:= false ; //دکمه را غیرفعال کنید
پایان؛

روش TForm1.Button3Click(فرستنده: TObject);
شروع
اگر Button2.Enabled سپس Port.Write();
پایان؛

روش TForm1.FormDestroy(فرستنده: TObject);
شروع
اگر Button2.Enabled پس
پورت رایگان؛
پایان؛

روش TForm1.OnRead(فرستنده: TObject; ReadBytes: آرایه بایت);
var
i:integer;
شروع
برای i:= Low (ReadBytes) تا High (ReadBytes) انجام دهید //از آرایه بایت های دریافتی عبور کنید
شروع
Memo1.Text:= Memo1.Text + "." +InttoHex(ReadBytes[i],2); // مقدار HEX آن را به پنجره اضافه کنید
inc(num); //تعداد بایت های دریافتی را بشمارید
پایان؛
اگر عدد > 10 باشد، شروع کنید
Memo1.Lines.Add("" ); //خط انتقال
num:=0;
پایان؛
پایان؛

ما شروع می کنیم، اتصال برقرار می کنیم، بایت ها را ارسال می کنیم:

بنابراین ساده ترین ترمینال ما آماده کار با ساده ترین دستگاه USB است.

همانطور که می بینید، خواندن و نوشتن آرایه های پویا از بایت ها هستند.

با پردازش اطلاعات دریافتی، می توان پروتکل تبادل لازم را متناسب با وظیفه فعلی تنظیم کرد.

شامل 18f2455
--
enable_digital_io()
--
نام مستعاردکمه استپین_B7
pin_B7_direction = ورودی
--
--
شامل usb_serial
--
usb_serial_init()
var بایتفصل
var بایتمن - متغیر دوم را اعلام کنید
حلقه برای همیشه-- حلقه اصلی
usb_serial_flush()
اگر(usb_serial_read(ch)) سپس-- در صورت دریافت بایت، اقدامات لازم را انجام دهید
مورد ch از - روی تعداد بایت تکرار کنید
0: usb_serial_data = 0xff
1: usb_serial_data = دکمه - وضعیت دکمه ارسال
در غیر این صورت مسدود کردن- اگر چیز دیگری دریافت شود
برای 16 استفاده كردنمن حلقه- ارسال 10 بایت داده
usb_serial_data = ch +i -- ch تا ch+15
حلقه پایانی
بلوک انتهایی
مورد نهایی
پایان اگر
حلقه پایانی

ویژگی های اضافی

اگر در آنجا توقف کنید، یک مقاله معمولی دریافت می کنید توصیف همراه با جزئیاتنمونه ای از استفاده از کتابخانه، که به اندازه کافی در وب وجود دارد. بنابراین، من کمی اطلاعات عمیق تر اضافه خواهم کرد.

ارسال داده ها را ساده کنید

ارسال اطلاعات یک بایت در یک زمان همیشه راحت نیست. کتابخانه می تواند بسیار مفید باشد چاپ. این شامل رویه هایی برای ارسال داده ها با تمام طول های ممکن در همه فرمت های ممکن است: بایت، هگز، دس، بین، بولی، که می تواند خروجی داده ها را در برنامه ساده کند.
> شامل چاپ
...
واردوردداده ها
print_dword_hex (usb_serial_data, data)

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

در انتظار اتصال به کامپیوتر

اگر قبل از شروع چرخه اصلی میکروکنترلر لازم است ابتدا با رایانه شخصی ارتباط برقرار کنید، سپس می توانید خطوط قبل از آن را اضافه کنید.
در حالی که(usb_cdc_line_status() == 0x00) حلقه
حلقه پایانی

شماره پورت را به دستگاه متصل کنید

اگر همه چیز را همانطور که هست رها کنید، سیستم اولین شماره پورت رایگان را برای هر اتصال جدید اختصاص می دهد. و این بدان معنی است که شما باید مراقب آن باشید.
برای جلوگیری از این اتفاق، باید قبل از اتصال کتابخانه usb یک مقدار سریال منحصر به فرد به دستگاه اختصاص دهید:
عدد می تواند از هر طولی باشد و دارای کاراکترهای مختلفی باشد.
بایت const USB_STRING3=
{
24 , - طول آرایه
0x03، --bDescriptorType
"0" , 0x00 ,
"1" , 0x00 ,
"2" , 0x00 ,
"3" , 0x00 ,
"4" , 0x00 ,
"5" , 0x00 ,
"6" , 0x00 ,
"7" , 0x00 ,
"8" , 0x00 ,
"9" , 0x00 ,
"ایکس" 0x00
}

نام دستگاه را به نام خود تغییر دهید

شما می توانید با اعلام آرایه ای با نام، مانند شماره سریال، نام دستگاه قابل مشاهده در سیستم را قبل از نصب درایورها تغییر دهید، این کار باید قبل از اتصال کتابخانه USB انجام شود.
بایت const USB_STRING2=
{
28 , --
0x03، --bDescriptorType
"د", 0x00 ,
"e", 0x00 ,
"م", 0x00 ,
"o", 0x00 ,
" " , 0x00 ,
"ب", 0x00 ,
"o", 0x00 ,
"آ", 0x00 ,
"ر", 0x00 ,
"د", 0x00 ,
" " , 0x00 ,
"=" , 0x00 ,
")" 0x00
}

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


DESCRIPTION="CDC آزمایشی"

ما اتصال خودکار دستگاه را سازماندهی می کنیم

افسوس، هیچ راه مستقیمی برای تکمیل این کار وجود ندارد، بنابراین باید تدبیر کنید.

اول از همه، شما باید یک سازنده و ارزش محصول منحصر به فرد را به دستگاه خود اختصاص دهید تا به راحتی آن را در میان صدها سیستم عامل CDC استاندارد دیگر شناسایی کنید.
VID و PID در ازای پول داده می‌شوند، بنابراین بیایید در مسیر چینی‌ها پیش برویم: بی‌صدا از ارزش‌های آشکارا آزاد استفاده کنیم.

سیستم عامل:
قبل از اتصال کتابخانه USB باید دو متغیر در سیستم عامل اعلان شود

کلمه const USB_SERIAL_PRODUCT_ID = 0xFF10
کلمه const USB_SERIAL_VENDOR_ID = 0xFF10

به جای FF10، می توانید هر دو کلمه (2 بایت) را وارد کنید. نتیجه نهایی در آرشیو پیوست موجود است.

رانندگان:
از آنجایی که درایورها برای ترکیب VID و PID ما طراحی نشده اند، مقادیر خود را به صورت دستی به فایل .inf اضافه می کنیم:


%DESCRIPTION%=درایور نصب، USB\VID_FF10&PID_FF10


%DESCRIPTION%=درایور نصب، USB\VID_FF10&PID_FF10

نرم:
برای دریافت رویدادهای اتصال / قطع اتصال دستگاه، کتابخانه ComponentUSB را متصل می کنیم. توضیح هر خط را لازم نمی دانم: تمام تغییرات در پروژه پیوست قابل مشاهده است.

نتیجه

دیدن آن در اسکرین شات سخت است، اما دکمه ارسال تنها زمانی فعال است که یک دستگاه متصل باشد، و برنامه هر 50 میلی ثانیه یک درخواست برای دریافت وضعیت دکمه ارسال می کند (که البته اشتباه است، زیرا فشار دادن دکمه باید پردازش شود. در MK).

همانطور که می بینید، سازماندهی تبادل داده بین MK و PC از طریق USB سخت ترین کار نیست. اتصال حاصل می تواند نه تنها برای اهداف نهایی استفاده شود: همچنین برای اشکال زدایی یک برنامه مناسب است. از این گذشته، ارسال نتایج محاسبات، وضعیت فعلی رجیسترها و متغیرها به رایانه بسیار واضح تر از چشمک زدن یک جفت LED در کد مورس است.

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

اما فقط اتصال فیزیکی دستگاه به رایانه کافی نیست، بلکه باید تبادل داده بین آنها برقرار شود. چگونه یک پورت را انتخاب کنیم و یک اتصال را سازماندهی کنیم؟ چند سال پیش راه حل استاندارد استفاده از پورت COM بود. به هر حال، متخصصان مختلف هنوز 8، 16 یا حتی 32 پورت COM را روی رایانه های صنعتی نصب می کنند (یک دسته کلی از کارت های توسعه PCI مختلف برای پورت های سریال، کنترلرها و غیره وجود دارد). بنابراین، اگر نیاز به اتصال چندین دستگاه خارجی با رابط RS-232 دارید، ممکن است به آداپتورهای گران قیمت و تخته های توسعه عجیب و غریب نیاز داشته باشید، که طبق سنت قدیمی، هفته ها با قایق های بخار به روسیه سفر می کنند. به هر حال، نام یک آداپتور معمولی "آداپتور DB9m / DB25f" فقط می تواند باعث تحریک مدیر فروشگاه رایانه شود.

دستگاه HID چیست؟

اکنون تقریباً همه دستگاه ها از طریق رابط USB به رایانه متصل می شوند. بنابراین، بسیاری از رایانه های شخصی جدید اصلاً پورت COM ندارند.

رابط USB - یک راه حل معمولی برای جفت کردن یک جدید دستگاه خارجیبا کامپیوتر، به طور دقیق تر، یک رابط HID بر اساس پروتکل USB 1.1 است.

اگرچه بسیاری از مردم فکر می کنند که رابط HID (دستگاه رابط انسانی) منحصراً برای صفحه کلید، ماوس و جوی استیک است، اما برای بسیاری از راه حل های مربوط به رابط دستگاه های خارجی و رایانه مناسب است.

اگر کاربر نیاز به تبادل داده با سرعت پایین (تا 64 کیلوبیت در ثانیه) دارد و در عین حال مطلوب است که زمان توسعه خسته کننده درایورهای خود را کاهش دهد، HID برای آنها کاملاً مناسب است. خروجی ساده و کامل خواهد بود راه حل مدرنبر اساس یک رابط نرم افزار استاندارد USB با پشتیبانی تضمینی در تمام پلت فرم های نرم افزار رایج.

ویژگی های دستگاه HID

از نقطه نظر سازماندهی پشتیبانی نرم افزار برای یک دستگاه HID، همه چیز کاملاً جذاب به نظر می رسد: برای کار در ویندوز، می توانید به سرعت کد فشرده قابل درک را بر اساس الگوریتم های اثبات شده آماده ایجاد کنید. در این مورد، توسعه‌دهنده زمان زیادی برای پیاده‌سازی پروتکل تبادل داده سطح بالای خود خواهد داشت، زیرا سطح انتزاع لازم قبلاً توسط پروتکل HID سازماندهی شده است (جدول را ببینید). علاوه بر این، برای یک برنامه نویس آسان است که یک پروتکل تبادل نوشتاری را اشکال زدایی کند (البته، اگر دستگاه HID در حال کار باشد) - به دلیل استحکام نسبی خود پروتکل، کافی است به سادگی برنامه ای برای پشتیبانی از دستگاه ایجاد کند. توسط یک کامپیوتر هنوز هم می خواهد! تاکنون کارهای زیادی توسط سازنده دستگاه HID انجام شده است.

ایجاد تبادل داده بین یک دستگاه HID و یک کامپیوتر

برای توصیف تعامل یک دستگاه HID با یک کامپیوتر، ما از عبارت "میزبان" استفاده می کنیم. در این مورد، به یک دستگاه کنترل در معماری فیزیکی عمومی ارتباط بر روی پروتکل USB اشاره دارد. بنابراین، تمام پورت ها در یک کامپیوتر میزبان هستند. شما می توانید دستگاه های USB مختلف (درایوهای فلش، ماوس، وب کم، دوربین و غیره) را که هاست ندارند به آنها متصل کنید. میزبان اکتشاف، اتصال، قطع اتصال، پیکربندی دستگاه، و همچنین جمع آوری آمار و مدیریت توان را ارائه می دهد.

خود دستگاه HID می تواند فرکانس نظرسنجی را تنظیم کند که طی آن وجود هر داده جدید مشخص می شود. این بدان معناست که حتی در چنین سطح پایینی، برنامه نویس می تواند به سیستم اعتماد کند، زیرا نرخ نظرسنجی و سایر پارامترهای ارتباطی باید در برنامه کنترل کننده دستگاه HID از پیش تنظیم شده باشند. در این، پروتکل HID با توضیحات کلی USB 1.1 یا USB 2.0 متفاوت است، که الزامات سختگیرانه ای برای سازماندهی پروتکل ندارد. با این حال، برای کارهای خاصی که به سطح بالایی از امنیت نیاز دارند، خلاص شدن از نظرسنجی های چرخه ای می تواند بسیار دشوار باشد، زمانی که تقریباً همان بلوک های داده دائماً منتقل می شوند.

ویژگی های برنامه نویسی دستگاه های HID

دستگاه های HID دارای توصیفگرهای خاصی هستند. هنگامی که میزبان تشخیص می دهد که دستگاه متعلق به کلاس HID است، کنترل آن را به درایور مناسب منتقل می کند. فرض بر این است که تبادل اطلاعات بیشتر تحت رهبری او انجام می شود.

در ویندوز، دسترسی به دستگاه های HID توسط کنترل می شود سرویس سیستم HidServ. جزئیات بیشتر در مورد عملکرد درخواست ها به دستگاه های HID و سایر ویژگی های کار با درایور HID در کار P. V. Agurov "رابط USB" توضیح داده شده است. تمرین استفاده و برنامه نویسی» (سنت پترزبورگ: BHV-Petersburg, 2005).

برنامه نویسی دستگاه های HID در « سطح بالا»

زندگی سخت برنامه نویسان "کاربردی" که روی پاسکال کار می کنند توسط ماژول HID اثبات شده تسهیل می شود. PAS، پوسته ای برای مخفی شدن. dll (کتابخانه کاربر مخفی - همانطور که در مشخصات فایل مشخص شده است). نظرات فایل می گوید که این فایل بر اساس ماژول های hidsdi.h و hidpi.h از شرکت مایکروسافت است. و خود فایل HID. PAS بخشی از بسته JEDI() است.

برای کار با یک دستگاه HID در محیط دلفی برای win32، از مؤلفه TJvHidDeviceController استفاده می شود که یک مدیر جهانی مناسب برای دسترسی به دستگاه های HID است. و در حال حاضر بر اساس آن، می توانید یک نمونه شی برای کار با یک دستگاه خاص دریافت کنید.

ویژگی ها و رویدادهای اصلی جزء TJvHidDeviceController

بیایید جزء TJvHidDeviceController را با جزئیات بیشتری در نظر بگیریم. رویداد OnArrival زمانی فعال می شود که یک دستگاه HID به سیستم می رسد (وصل می شود)، دسترسی به دستگاه در کنترل کننده این رویداد از طریق نمونه ای از کلاس TJvHidDevice فراهم می شود. رویداد ساده OnDeviceChange به تغییر وضعیت دستگاه واکنش نشان می دهد و فقط تغییرات در سیستم را نشان می دهد. رویداد OnDeviceData زمانی فعال می شود که داده از یکی از دستگاه های HID می رسد و موارد زیر را به کنترل کننده می دهد: HidDev: TJvHidDevice; - دستگاهی که داده ها از آن دریافت شده است.

رویداد OnDeviceDataError با ارسال پارامترهای HidDev به رویه پردازش، خطای انتقال داده را مطلع می کند: TJvHidDevice; - دستگاه HID و خطا: DWORD. - کد خطا. رویداد OnDeviceUnplug به شما اطلاع می دهد که یک دستگاه از لیست دستگاه های نصب شده در سیستم حذف شده است. انواع کنترل کننده رویداد در Plug و Unplug یکسان هستند (در متن منبع: TJvHidUnplugEvent = TJvHidPlugEvent). یک شی از کلاس TJvHidDevice مربوط به دستگاه HID به کنترل کننده ارسال می شود.

برای شمارش متوالی دستگاه های HID موجود در سیستم با فراخوانی متد Enumerate، رویداد OnEnumerate در نظر گرفته شده است، یعنی در کنترل کننده رویداد، دستگاه های یافت شده به صورت متوالی به عنوان اشیا منتقل می شوند. این رویداد به اجبار توسط روش Enumerate فعال می‌شود، که برای «عبور» دستگاه‌های HID موجود از طریق کنترل‌کننده استفاده می‌شود، به عنوان مثال، هنگام بررسی وضعیت دستگاه‌های HID که توسط میزبان (رایانه) آغاز شده است.

رویداد OnRemoval زمانی فعال می شود که دستگاه به طور فیزیکی از سیستم حذف شود و دارای همان نوع کنترل کننده TJvHidUnplugEvent مانند OnDeviceUnplug باشد. تابع CountByProductName تعداد دستگاه هایی را برمی گرداند که با نام محصول مشخص شده در آرگومان مطابقت دارند و CountByVendorName تعداد نام های فروشنده مشخص شده در آرگومان را برمی گرداند.

ویژگی ها و رویدادهای اصلی کلاس TJvHidDevice

کلاس TJvHidDevice یک نمایش مجازی از یک دستگاه HID منفرد است. همانطور که قبلا ذکر شد، می توان یک شی جدید از این کلاس را از رویداد OnArrival یا OnEnumerate بدست آورد. عملکرد کلاس های TJvHidDeviceController و TJvHidDevice تا حدی تکراری است، زیرا اولین آنها یک جعبه ابزار معمولی برای کار با مجموعه ای از دستگاه های HID موجود در سیستم و مکانیزمی برای دسترسی به یکی از آنها را ادغام می کند. یک دستگاه را می‌توان به‌طور منحصربه‌فرد با ویژگی‌های SerialNumber، ProductName و VendorName آن شناسایی کرد. می توانید از رویداد OnData برای دریافت اطلاعات در مورد ورود داده ها با استفاده از چنین شی استفاده کنید. داده ها از طریق روش WriteFile (به معنای دقیق، از طریق یک تابع) ارسال می شوند. WriteFile یک بسته بندی است عملکرد سیستم WriteFile (kernel32).

برای کنترل این واقعیت که دستگاه حذف شده است، باید کنترلر خود را به رویداد OnUnplug اختصاص دهید. قبل از شروع تبادل داده با دستگاه HID، باید مطمئن شوید که چنین تبادلی با استفاده از HasReadWriteAccess امکان پذیر است. این کلاس حتی یک رویداد OnDataError جداگانه برای بروز خطای تبادل داده دارد.

و اکنون بیایید به قطعات کد از یک پروژه "زنده" نگاه کنیم که یک برنامه مشتری آزمایشی را برای سازماندهی تبادل داده با یک دستگاه غیر استاندارد - کارت های تراشه پلاستیکی مبتنی بر HID اجرا می کند. در مبارزه برای واقع گرایی، نویسنده این آزادی را گرفت که پیوندهای کد فناوری «اضافی» را از فهرست ها بیرون نریزد.

روش ScanDevices (فهرست 1) برای شروع فرآیند جستجوی سیستم برای دستگاه HID مورد نیاز طراحی شده است. بیشتر کدها، به استثنای فراخوانی روش Enumerate، اختیاری هستند و برای مثال، انعطاف‌پذیری برنامه را فراهم می‌کنند، به طوری که می‌توانید توانایی کار بر روی یک رابط غیر HID را به همان برنامه آزمایشی اضافه کنید. روش AddError اطلاعات اشکال زدایی را در حین اجرای برنامه در پنجره چاپ می کند.

فهرست 2 کنترل کننده رویداد OnEnumerate را برای یافتن دستگاه خارجی مورد نیاز نشان می دهد. برای سادگی، فرض می کنیم که برنامه می تواند تنها با یک دستگاه از نوع مورد نیاز خود کار کند.

قبل از در نظر گرفتن اجرای بیشتر پروژه، باید کمی در مورد فرمت تبادل داده سطح بالای پذیرفته شده صحبت کنیم، یعنی در مورد ساختار طراحی شده برای واسطه بین روش های دریافت و انتقال داده ها و وظیفه کاربردی خاص در حال حل. . واقعیت این است که در اینجا به توسعه دهنده فرصت داده می شود تا توانایی های خلاقانه خود را درک کند. یا بهتر بگوییم، توسعه دهندگان، زیرا فرآیند ایجاد یک پروتکل جدید اغلب دو طرفه است و اولین ویولن توسط کسی که اجرای الگوریتم تبادل را دشوارتر می داند، نواخته می شود. به طور کلی، پروتکل تبادل هر چه که باشد، همیشه خوب است که هر موجودیت نرم افزاری را تا حد امکان بصری و خودکفا کنیم، حتی به ضرر برخی سنت های پذیرفته شده عمومی. برای بهترین راه حل راه حلی است که در مدت زمان کوتاهی با حداقل اتصال به محیط نرم افزار و با پیاده سازی شود فرصت های بزرگپیشرفتهای بعدی. بر اساس این اصول، یک پروتکل تبادل سطح بالا ایجاد شد که در آن مفهوم اصلی "فرمان" است. فهرست 3 نشان می دهد که نویسنده چقدر داده های رشته ای را دوست دارد، که او را بیش از یک بار هنگام اشکال زدایی ماژول های برنامه ذخیره کرد. چقدر عالی است که ما حتی یک نوع رشته ای داریم! تمام دستورات پروتکل به دسته‌ها (کلاس‌ها) تقسیم می‌شوند که در آن کد دستوری وجود دارد که هدف آن را به طور منحصربه‌فرد مشخص می‌کند. پارامتر edParam برای ارسال داده به دستگاه استفاده می شود و پارامتر edAnswerData حاوی داده های دریافتی از دستگاه است. نوع رشته اعضای رکورد توصیف شده به شما امکان می دهد آزادانه و به صورت بصری داده ها را در قالب رشته HEX دستکاری کنید. و آنچه که از همه خوشایندتر است، فرمت رکورد توصیف شده از نظر ایدئولوژیک جایی در وسط بین هدف مستقیم و اشکال مختلف ارائه آن (INI، HEX، XML، و غیره) قرار دارد.

اجرای دستور، یعنی ارسال داده به دستگاه، با استفاده از ارسال بسته های داده به طول 8 بایت اجرا می شود (فهرست 4). این طول تنها تصمیم نیست، این انتخاب توسط الزامات پروتکل لایه بالایی دیکته می شود و ممکن است در هر مورد خاص متفاوت باشد. این همان چیزی است که به آن سلیقه می گویند. پرچم عجیب و غریب IsUSBMode در روش ExecuteCommand (Listing 5 در PC Disk World) به عنوان یادآوری باقی مانده است که به جای کار با USB، ممکن است نیاز به استفاده از یک پورت COM یا یک رابط دیگر داشته باشیم. در ابتدای گروه داده ارسالی، یک دنباله همگام سازی با فرمت دلخواه انتخاب شده (به عنوان مثال، 3E3E3E2B) به دستگاه منتقل می شود و به دستگاه اطلاع می دهد که داده های کاملاً قانونی در ورودی دارد. اجازه دهید به شما یادآوری کنم که در این مورد ما نه چندان در مورد HID، بلکه در مورد یک پروتکل سطح بالا صحبت می کنیم که از نظر ایدئولوژیکی از سخت افزار جدا شده و برای حل مشکلات کاربردی خاص طراحی شده است.

در کنترلر GetDataExecutor داده های دریافتی از دستگاه (بسته 8 بایتی)، یک رویداد OnNewInputData ایجاد شده ویژه برای انتقال داده های اولیه پردازش شده برای پردازش بیشتر استفاده شد که مقادیر قدیمی و جدید آنها را نشان می دهد (فهرست 6 در "World" از دیسک کامپیوتر"). بنابراین، رویدادهای ورود داده‌های خام و نشانه‌ای از پردازش بیشتر جدا می‌شوند، که اجازه می‌دهد برخی از الگوریتم‌های هشدار خاص در مراحل اولیه برای اطلاعات ورودی اشتباه، مکرر یا غیر ضروری اضافه شود.

نمونه های کار با دستگاه HID ارائه شده در اینجا ایده کلی مقاله را نشان می دهد - سادگی نسبی برنامه نویسی دستگاه های HID غیر استاندارد با استفاده از ابزار دلفی.

گذرگاه USB (Universal Serial Bus - Universal Serial Bus) در 15 ژانویه 1996 با تایید اولین نسخه استاندارد توسط Intel، DEC، IBM، NEC، Northen Telecom و Compaq ظاهر شد.

هدف اصلی مجموعه استاندارد پیش روی توسعه دهندگان آن این است که کاربران را قادر سازد در حالت Plug&Play با دستگاه های جانبی کار کنند. این بدان معنی است که باید امکان اتصال دستگاه به رایانه در حال اجرا وجود داشته باشد، بلافاصله پس از اتصال آن را به طور خودکار شناسایی کرده و سپس درایورهای مناسب را نصب کنید. علاوه بر این، تامین برق دستگاه های کم مصرف از خود اتوبوس مطلوب است. سرعت اتوبوس باید برای اکثر تجهیزات جانبی کافی باشد. کنترل‌کننده USB باید صرف‌نظر از تعداد دستگاه‌های متصل به گذرگاه، فقط یک وقفه داشته باشد، یعنی مشکل کمبود منابع در گذرگاه‌های داخلی رایانه سازگار با IBM PC را حل کند.

تقریباً تمام وظایف در استاندارد USB حل شد و در بهار سال 1997 رایانه های مجهز به اتصال دهنده ها ظاهر شدند. اتصالات USBدستگاه ها اکنون USB چنان فعالانه توسط سازندگان لوازم جانبی رایانه پیاده سازی شده است که به عنوان مثال، در رایانه iMAC از رایانه های اپل، فقط USB به عنوان یک گذرگاه خارجی وجود دارد.

قابلیت های USB 1.0 به شرح زیر است:

1. تبادل داده با سرعت بالا (با سرعت کامل) - 12 مگابایت آی تی/با؛

2. حداکثر طولکابل برای تبادل با سرعت بالا - 5 متر؛

3. نرخ تبادل داده کم (سرعت کم) - 1.5 مگابایت آی تی/با؛

4. حداکثر طول کابل برای نرخ مبادله کم - 3 متر.

5. حداکثر تعداد دستگاه های متصل 127 است.

6. ممکن است اتصال همزماندستگاه هایی با نرخ های مختلف ارز؛

8. حداکثر جریان مصرفی در هر دستگاه - 500 میلی آمپر.

بنابراین، توصیه می شود تقریباً هر دستگاه جانبی را به USB 1.0 وصل کنید، به جز دوربین های ویدیویی دیجیتال و هارد دیسک های پرسرعت. این رابط به ویژه برای اتصال دستگاه هایی که اغلب متصل/قطع می شوند مانند دوربین های دیجیتال مفید است.
توانایی استفاده از تنها دو نرخ داده، کاربرد گذرگاه را محدود می کند، اما به طور قابل توجهی تعداد خطوط رابط را کاهش می دهد و اجرای سخت افزار را ساده می کند.
برق رسانی مستقیم از USB فقط برای دستگاه های کم مصرف مانند صفحه کلید، ماوس، جوی استیک و غیره امکان پذیر است.

سیگنال های USB از طریق یک کابل 4 سیم منتقل می شوند که به صورت شماتیک در شکل زیر نشان داده شده است:

شکل 2.6.1 - سیم های سیگنال USB

در اینجا GND یک مدار سیم معمولی برای تغذیه دستگاه های جانبی، Vbus - +5 V همچنین برای مدارهای قدرت است. گذرگاه D+ برای انتقال داده روی گذرگاه و گذرگاه D- برای دریافت داده است.
کابل برای پشتیبانی از سرعت اتوبوس کامل (سرعت کامل) به صورت یک جفت پیچ خورده ساخته شده است که توسط یک محافظ محافظت می شود و همچنین می تواند برای عملکرد در حالت حداقل سرعت (سرعت کم) استفاده شود. کابل برای کار فقط در حداقل سرعت (مثلاً برای اتصال ماوس) می تواند بدون محافظ باشد.
کانکتورهای مورد استفاده برای اتصال لوازم جانبی به سری تقسیم می شوند: کانکتورهای سری "A" (نر و ماده) فقط برای اتصال به یک منبع مانند کامپیوتر هستند، کانکتورهای سری "B" (نر و ماده) فقط برای اتصال به یک منبع هستند. دستگاه ثانوی.

کانکتورهای USB دارای شماره پین ​​زیر هستند که در جدول 2.6.1 نشان داده شده است.

جدول 2.6.1 - هدف و علامت گذاری مخاطبین USB

در سال 1999 همان کنسرسیوم شرکت های کامپیوتری، که توسعه اولین نسخه استاندارد اتوبوس USB را آغاز کرد، شروع به توسعه فعال نسخه 2.0 USB کرد که با معرفی حالت پرسرعت اضافی (سرعت بالا) متمایز می شود. پهنای باند باس 40 برابر افزایش یافته و تا 480 مگابیت در ثانیه افزایش یافته است که امکان انتقال داده های ویدئویی از طریق USB را فراهم می کند.
سازگاری تمام تجهیزات جانبی و کابل های پرسرعت که قبلا منتشر شده اند کاملاً حفظ می شود. کنترل کننده استاندارد 2.0 قبلاً در مجموعه منطق سیستم دستگاه های قابل برنامه ریزی ادغام شده است (به عنوان مثال، مادربردکامپیوتر شخصی).

در سال 2008، Intel، Microsoft، Hewlett-Packard، Texas Instruments، NEC و NXP Semiconductors مشخصات USB 3.0 را ایجاد کردند. در مشخصات USB 3.0، کانکتورها و کابل های استاندارد به روز شده از نظر فیزیکی و عملکردی با USB 2.0 سازگار هستند، اما علاوه بر چهار خط ارتباطی، چهار خط دیگر اضافه شده است. با این حال، پین های جدید در کانکتورهای USB 3.0 جدا از پین های قدیمی در یک ردیف پین متفاوت قرار دارند. مشخصات USB 3.0 حداکثر سرعت انتقال داده را به 5 گیگابیت در ثانیه افزایش می دهد - مرتبه ای بزرگتر از 480 مگابیت در ثانیه که USB 2.0 می تواند ارائه دهد. علاوه بر این، حداکثر جریان از 500 میلی آمپر به 900 میلی آمپر در هر دستگاه افزایش یافته است که به شما امکان می دهد برخی از دستگاه هایی را که قبلاً به منبع تغذیه جداگانه نیاز داشتند، تغذیه کنید.

فرض کنید یک دستگاه USB ساخته اید که می خواهید با استفاده از رایانه با آن کار کنید. این امر حداقل از دو طریق قابل دستیابی است:

1. توسعه یک درایور سیستم عامل با امکانات کامل.

2. با استفاده از یک رابط USB کلاس ویژه - دستگاه هایی به نام دستگاه های HID (دستگاه رابط انسانی).

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

راه دوم به شرح زیر است. یک رابط پشتیبانی شده توسط سیستم عامل های مدرن برای دستگاه های تعامل کامپیوتر و انسان یا دستگاه های HID وجود دارد، مانند:

1. صفحه کلید، موس، جوی استیک.

2. سنسورهای مختلفو خوانندگان؛

3. فرمان بازی و پدال.

4. دکمه ها، سوئیچ ها، رگولاتورها.

هر چنین دستگاهی، در صورتی که الزامات دستگاه های HID را برآورده کند، به طور خودکار توسط سیستم شناسایی می شود و نیازی به نوشتن درایورهای خاص نخواهد داشت. همچنین، برنامه‌نویسی آنها معمولاً بسیار ساده‌تر از نوشتن یک درایور دستگاه سفارشی است. متأسفانه، این روش یک اشکال قابل توجه دارد: سرعت تبادل اطلاعات با دستگاه HID بسیار محدود است و حداکثر به 64 کیلوبایت بر ثانیه می رسد.

اساساً، بر اساس فناوری HID، سازماندهی تعامل با هر وسیله ای امکان پذیر است، حتی اگر به معنای دقیق یک وسیله واسط بین یک شخص و یک رایانه نباشد. این امر توسعه زمان‌بر یک درایور دستگاه منحصربه‌فرد را حذف می‌کند و در زمان توسعه یک دستگاه USB جدید صرفه‌جویی می‌کند. در سمت میزبان، تبادل با دستگاه توسط یک درایور استاندارد HID موجود در توزیع سیستم عامل مدیریت خواهد شد. شما فقط باید از سمت دستگاه اجرا کنید حداقل الزاماتپروتکل USB HID.

شایان ذکر است که بسیاری از دستگاه‌های USB، که در نگاه اول تحت تعریف دستگاه‌های تعامل انسانی قرار نمی‌گیرند، هنوز منطقی‌تر برای پیاده‌سازی به عنوان دستگاه‌های HID هستند. این پدیده اغلب در زمینه تجهیزات تولید رخ می دهد که اخیراً با معرفی گسترده فناوری های USB مواجه شده است. به عنوان مثال، منبع تغذیه آزمایشگاهی را با قابلیت تنظیم پارامترهای سیگنال های خروجی از رایانه با استفاده از رابط USB در نظر بگیرید. بدون شک منبع تغذیه خود وسیله ای برای تعامل با شخص نیست. با این حال، در این مورد، عملکردهایی که از طریق اتصال USB اجرا می شوند، صفحه کلید، کنترل ها و نشانگرهای نصب شده روی خود دستگاه را کپی می کنند. و این کنترل ها فقط تحت تعریف HID قرار می گیرند. بر این اساس، منبع تغذیه با این عملکردهای USB به طور منطقی به عنوان یک دستگاه HID سازماندهی شده است.

در مثال در نظر گرفته شده برای عملکرد عادینرخ انتقال داده پایین کافی خواهد بود؛ در موارد دیگر، دستگاه ها می توانند نسبت به نرخ مبادله بسیار مطالبه کنند. نرخ انتقال پایین محدودیت اصلی طراحی دستگاه HID است که در مقایسه با 12 مگابیت بر ثانیه از سرعت کامل گذرگاه USB 1.0، به نظر یک نقطه ضعف بزرگ فناوری HID در انتخاب یک پیاده سازی خاص USB است. با این حال، برای بسیاری از وظایف ارتباطی، این سرعت کاملاً کافی است و معماری HID به عنوان یک ابزار تخصصی، جایگاه شایسته ای را در بین راه های سازماندهی تبادل داده ها اشغال می کند.

دو نوع دستگاه HID وجود دارد: مشارکت کننده (بوت) و غیر مشارکتی. بوت استرپکامپیوتر. بارزترین نمونه دستگاه USB-HID قابل بوت، صفحه کلید است که با شروع کامپیوتر شروع به کار می کند.

هنگام توسعه یک دستگاه HID، الزامات زیر که توسط مشخصات تحمیل شده است باید برآورده شوند:

1. دستگاه HID با سرعت کامل می تواند 64000 بایت در هر ثانیه یا 64 بایت در هر 1 میلی ثانیه انتقال دهد. یک دستگاه HID با سرعت پایین توانایی انتقال تا 800 بایت در ثانیه یا 8 بایت در هر 10 میلی ثانیه را دارد.

2. دستگاه HID می تواند نرخ نظرسنجی خود را تعیین کند تا مشخص کند آیا داده های جدیدی برای انتقال دارد یا خیر.

3. تبادل داده با دستگاه HID از طریق ساختار خاصی به نام گزارش (گزارش) انجام می شود. هر گزارش تعریف شده می تواند تا 65535 بایت داده داشته باشد. ساختار گزارش دارای یک سازماندهی بسیار انعطاف پذیر است که به شما امکان می دهد هر قالب انتقال داده را توصیف کنید. برای اینکه یک فرمت گزارش خاص برای میزبان شناخته شود، میکروکنترلر باید حاوی توضیحات خاصی باشد - توصیفگر گزارش.

ارتباط USB به چندین روش مستقیماً روی میکروکنترلر پیاده سازی می شود:

1. استفاده از یک کنترلر با پشتیبانی سخت افزاری، مانند AT90USB*، از atmega.

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

برای پیاده سازی نرم افزار، در حال حاضر تعدادی راه حل آماده برای خانواده های مختلف میکروکنترلرها وجود دارد. برای میکروکنترلرهای AVRبه عنوان مثال، Atmega8 می توانید از کتابخانه های رایگان C زیر استفاده کنید:

استفاده از هر دو نسبتاً آسان است، شبیه سازی کامل دستگاه های کم سرعت USB 1.1 به استثنای رسیدگی به خطاهای ارتباطی و مشخصات الکتریکیو تقریباً روی تمام کنترلرهای AVR با حداقل 2 کیلوبایت حافظه فلش، 128 بایت رم و فرکانس 12 تا 20 مگاهرتز اجرا شود.

برای نوشتن برنامه های کاربردی با پشتیبانی USB ویندوزدستگاه‌های HID به فایل‌های هدر مخفی* موجود در WDK (کیت درایور ویندوز) نیاز دارند، یا می‌توانید از کتابخانه مخفی رایگان یا موارد مشابه استفاده کنید.

بنابراین، در مورد کلیبرنامه نویسی USB یک کار کاملاً پیچیده است که به یک میکروکنترلر ویژه با پشتیبانی سخت افزاری و نوشتن درایور سیستم عامل نیاز دارد. با این حال، در عمل، هنگام توسعه دستگاه ها، می توان از یک رابط HID بسیار ساده تر استفاده کرد - دستگاه هایی که پشتیبانی از آنها در سطح یک درایور سیستم استاندارد اجرا می شود و برنامه نویسی با استفاده از کتابخانه های تابع موجود ساده شده است.

سوالات تستی

  1. تفاوت بین سیم های D- و GND در USB چیست؟ چرا نمی توانید از یک سیم مشترک برای برق و سیگنال استفاده کنید؟
  2. امروزه چند حالت سرعت USB (از جمله نسخه 3.0) وجود دارد؟
  3. دستگاه HID چیست؟ چرا برای کار در سیستم عامل های مدرن به درایورهای نوشتن نیاز ندارند؟
  4. آیا می توان دستگاه های USB را با استفاده از ریزپردازنده ای که پشتیبانی داخلی داخلی ندارد، پیاده سازی کرد؟
  5. تفاوت اصلی USB 3.0 با نسخه های قبلی چیست؟