سلام
این آموزش راه اندازی پورت usb stm32 برای کسانی آماده شده که می خوان از usb به عنوان یک روش راحت و ارزان برای ارتباط با pc استفاده کنن ولی از وارد شدن بهش کمی واهمه دارن.
و ای کسانی تنها دلیلتون برای استفاده از avr صرفه اقتصادیه (با کسانی که دلایل دیگه ای دارن کار ندارم) در حالی که با 20-15 چوخ یه میکرو و یه مبدل usb به com برای چنین پروژه هایی استفاده می کنید
برید آرم کار کنید که با 8 چوخ , هزار جور کار میکنه براتون.(اینو گفتم که اعلام انزجاری کرده باشم وگرنه که
لایبرری usb برا avr داریم هلو
)
استفاده از usb این روز ها خیلی ساده شده هم به خاطر لایبراری هایی که برای اپلیکیشن ها ایجاد شده (که ما قراره با libusbdotnet کار کنیم) و هم بخاطر توابعی که کامپایلر های میکروکنترولر ها برای این کار در نظر گرفتن.
آموزشی که تو این تاپیک قرار دادم مرحله به مرحله ساخت یک usb device هست که با نرم افزاری در کامپیوتر قراره ارتباط بر قرار کنه و یه سری دیتا بینشون رد و بدل شه
قراره با میکروکنترولر stm32f103rbt6 و کامپایلر mikroc arm و نرم افزار ویندوز مون هم با #visual studio c نوشته بشه.
خب از برنامه و شماتیک میکروکنترولر شروع می کنیم , در کامپایلر mikroc arm برای ساخت یه usb device مراحل زیر باید طی شه:
اول از همه mikroc رو باز و یه پروژه ایجاد کنید و سپس از منوی tools بر روی گزینه hid terminal کلیک کرده و پس از باز شدن پنجره hid terminal پارامتر های زیر را وارد کنید:
vid و pid ترجیحا همین ها باشن که گذاشتم ولی صاحب اختیاری هر عدد 16 بیتی در مبنای هگز خواستی وارد کنی.
Report length هم طول بافر های ارسال و دریافت هست که اینام فعلا بذار همین 64 باشه دنبال دردسر که نمی گردی اگه دنبال دردسر بودی که میکرو سی کار نمی کردی.
Bus powered هم که از اسمش معلومه , حد اکثر جریانی رو که device ت قرار از پورت بکشه وارد کن.
Endpoints ها رو هم بذار همین 1 باشن.
Vendor name و product name هم که نام های تولید کننده و نام محصول هستن هرچه می خواهد دل تنگت بذار.
برای این پارامتر هایی که گفتم اگه خواستی بدونی چی هستن تو نت مطلب هست , اگرم نخواستی که نخواستی.
بعد وارد کردن پارامتر ها روی دکمه save descriptor کلیک کرده و فایل usbdsc رو در پوشه پروژه تون save کنید.
بعد از ذخیره فایل در محل پروژه , در پنجره project manager روی پوشه پروژه راست کلیک کرده و از طریق گزینه add file to project فایل ذخیره شده (usbdsc.c) رو به source های پروژه اضافه کنید و سپس usbdsc.c رو باز کنید و تغییرات زیر رو اعمال کنید:
بایت usb_transfer_type رو که مقدارش به طور پیش فرض 0x03 بوده رو طبق عکس به 0x02 تغییر بدید (نوع انتقال دیتا با این بایت تعیین میشه که مقدار 3 وقفه ای هست و مقدار 2 توده ای)
usb_interrupt رو هم چون فعلا نمی خوایم از وقفه usb استفاده کنیم طبق عکس به 0 تغییر بدید.
تغییرات اعمال شده رو ذخیره کنید.
بعد از این نوبت به برنامه خودمون می رسه که به این صورت نوشته میشه
(یه برنامه سادس که بعد از دریافت دیتا از usb , همان دیتای دریافت شده را به port ارسال می کنه و سپس اگر شرط برقرار بود led رو روشن و اگر اون یکی شرط
برقرار بود led رو خاموش می کنه):
کد:
sbit noerrorled at gpiod_odr.b2;
char readbuff[64];
char writebuff[64];
void main() {
gpio_config(&gpiod_base,
_gpio_pinmask_2 ,
_gpio_cfg_digital_output | _gpio_cfg_speed_max | _gpio_cfg_otype_pp);
hid_enable(&readbuff,&writebuff);
while(1) {
usb_polling_proc();
if(hid_read()){
if(strcmp(readbuff,"led on") == 0)
noerrorled = 1;
else if(strcmp(readbuff,"led off") == 0)
noerrorled = 0;
hid_write(&readbuff,64);
}
}
}
این از برنامه میکرو فقط حواستون باشه که کانفیگ کلاک میکرو جوری باشه که به واحد usb فرکانس 48mhz اعمال شه.
برنامه رو کامپایل و میکرو رو پروگرام کنید.
شماتیک قسمتی که به usb مربوط میشه:
حالا بریم سراغ برنامه ای که قراره با نرم افزار visual studio 2013 نوشته شه :
اول از همه برنامه libusbdotnet_setup.2.2.8 رو که پیوست شده دانلود و نصب کنید (آخرین ورژن کلاس libusbdotnet رو هم از
این لینک می تونید دانلود کنید)
حالا یه پروژه windows form application به زبان #c با ویژوال استودیو ایجاد کنید و در قسمت solution explorer بر روی references کلیک راست کرده و ...add reference رو بزنید
و در پنجره باز شده از طریق browse فایل libusbdotnet.dll رو که در محل نصب libusbdotnet_setup.2.2.8 قرار داره رو وارد برنامه کرده و تیکش رو بزنید و به ریفرنس ها اضافش کنید...
بعد از این کار نوبت به نوشتن برنامه #c مون می رسه که سعی کردم به ساده ترین صورت ممکن نوشته شه و نیاز به توضیح نداشته باشه:
کد:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.windows.forms;
using libusbdotnet;
using libusbdotnet.main;
namespace windows_form_usb_app
{
public partial class form1 : Form
{
public form1()
{
initializecomponent();
}
private void form1_load(object sender, eventargs e)
{
}
private void button1_click(object sender, eventargs e)
{
int bytesread;
int byteswritten;
byte[] readbuffer = new byte[64];
byte[] writebuffer = new byte[64];
usbdevicefinder devicefinder = new usbdevicefinder(0x16c0, 0x05dc);
usbdevice device = usbdevice.openusbdevice(devicefinder);
if (device == null)
{
button1.text = "device not found.";
return;
}
iusbdevice wholeusbdevice = device as iusbdevice;
if (!referenceequals(wholeusbdevice, null))
{
wholeusbdevice.setconfiguration(1);
wholeusbdevice.claiminterface(0);
}
usbendpointwriter writer = device.openendpointwriter(writeendpointid.ep01);
usbendpointreader reader = device.openendpointreader(readendpointid.ep01);
writer.write(encoding.default.getbytes(textbox1.text + "\0"), 100, out byteswritten);
reader.read(readbuffer, 100, out bytesread);
textbox2.text = encoding.default.getstring(readbuffer);
if (device != null)
button1.text = "device found.";
}
}
}
در برنامه نوشته شده اگر در textbox1 عبارت led on نوشته شود و روی button1 کلیک شود led روشن شده و اگر led off نوشته و ارسال شود led متصل به میکرو خاموش می شود
textbox2 هم دیتای دریافتی توسط نرم افزار را که همان دیتای ارسالیست (چون میکرو همان دیتا را بعد از دریافت ارسال می کند) نمایش می دهد.
فقط یه نکته بگم با توجه به vid و pid یی که تو نرم افزار usb hid terminal برا میکرو انتخاب کردیم , تو برنامه #c مون هم همین دو عدد رو باید به devicefinder بدیم که به این صورت در برنامه نوشته شده:
کد:
usbdevicefinder devicefinder = new usbdevicefinder(0x16c0, 0x05dc);
و آخرین مرحله اضافه کردن درایور libusb0.sys به لیست درایور های device می باشد به این صورت که بعد از اتصال پورت usb بورد تون به pc با استفاده از نرم افزار install-filter-win که در محل نصب libusbdotnet قرار دارد device تون رو انتخاب و درایور رو نصب می کنید تمام شد حالا می متونید نرم افزار #c رو باز و امتحان کنید. (اگه device رو به پورت دیگه ای زدید که قبلا برای اون پورت درایور libusb0.sys رو نصب نکرده بودید باید دوباره این مرحله آخر رو انجام بدید)
همه فایل ها (پروژه mikroc , فایل نصب کتابخونه libusbdotnet و پروژه #c) پیوست شدن
در نهایت تشکر می کنم از جناب
esisafa و
hessam2013 بخاطر کمک ها شون.
امیدوارم استفاده ببرید و کاربردی باشه براتون.