PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : Usb در بیست دقیقه



sajjad_AD
30-10-2014, 03:03
سلام :hi:

این آموزش راه اندازی پورت usb stm32 برای کسانی آماده شده که می خوان از USB به عنوان یک روش راحت و ارزان برای ارتباط با PC استفاده کنن ولی از وارد شدن بهش کمی واهمه دارن.
و ای کسانی تنها دلیلتون برای استفاده از AVR صرفه اقتصادیه (با کسانی که دلایل دیگه ای دارن کار ندارم) در حالی که با 20-15 چوخ یه میکرو و یه مبدل USB به Com برای چنین پروژه هایی استفاده می کنید
برید آرم کار کنید که با 8 چوخ , هزار جور کار میکنه براتون.(اینو گفتم که اعلام انزجاری کرده باشم وگرنه که لایبرری USB برا AVR (You can see links before reply) داریم هلو :mrgreen: )

استفاده از USB این روز ها خیلی ساده شده هم به خاطر لایبراری هایی که برای اپلیکیشن ها ایجاد شده (که ما قراره با libusbdotnet کار کنیم) و هم بخاطر توابعی که کامپایلر های میکروکنترولر ها برای این کار در نظر گرفتن.

آموزشی که تو این تاپیک قرار دادم مرحله به مرحله ساخت یک usb Device هست که با نرم افزاری در کامپیوتر قراره ارتباط بر قرار کنه و یه سری دیتا بینشون رد و بدل شه

قراره با میکروکنترولر STM32F103RBT6 و کامپایلر MikroC ARM و نرم افزار ویندوز مون هم با #Visual Studio C نوشته بشه.

خب از برنامه و شماتیک میکروکنترولر شروع می کنیم , در کامپایلر MikroC ARM برای ساخت یه USB Device مراحل زیر باید طی شه:

اول از همه MikroC رو باز و یه پروژه ایجاد کنید و سپس از منوی Tools بر روی گزینه HID Terminal کلیک کرده و پس از باز شدن پنجره HID Terminal پارامتر های زیر را وارد کنید:

You can see links before reply

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 رو باز کنید و تغییرات زیر رو اعمال کنید:

You can see links before reply

بایت USB_TRANSFER_TYPE رو که مقدارش به طور پیش فرض 0x03 بوده رو طبق عکس به 0x02 تغییر بدید (نوع انتقال دیتا با این بایت تعیین میشه که مقدار 3 وقفه ای هست و مقدار 2 توده ای)
USB_INTERRUPT رو هم چون فعلا نمی خوایم از وقفه usb استفاده کنیم طبق عکس به 0 تغییر بدید.
تغییرات اعمال شده رو ذخیره کنید.

بعد از این نوبت به برنامه خودمون می رسه که به این صورت نوشته میشه
(یه برنامه سادس که بعد از دریافت دیتا از USB , همان دیتای دریافت شده را به Port ارسال می کنه و سپس اگر شرط برقرار بود LED رو روشن و اگر اون یکی شرط :mrgreen: برقرار بود 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 مربوط میشه:

You can see links before reply

حالا بریم سراغ برنامه ای که قراره با نرم افزار Visual Studio 2013 نوشته شه :

اول از همه برنامه LibUsbDotNet_Setup.2.2.8 رو که پیوست شده دانلود و نصب کنید (آخرین ورژن کلاس LibUsbDotNet رو هم از این لینک (You can see links before reply) می تونید دانلود کنید)

حالا یه پروژه 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.Te xt + "\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) پیوست شدن


استفاده از رویداد USB در #C (پست شماره 11 همین تاپیک) (You can see links before reply)


در نهایت تشکر می کنم از جناب esisafa (You can see links before reply) و hessam2013 (You can see links before reply) بخاطر کمک ها شون.

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

paradox7
30-10-2014, 16:11
سلام اجرتون با امام حسین (ع).
توضیحاتتون عالیه واقعا ممنونم .
من اولین باره با mikroc کار میکنم .تو همون قسمت اول گیر کردم !
تو VID و PID نمیتونم عدد هگز بنویسم (C,D)
توضیح اینکه سربرگ teminal رو تو همین قسمت اصلا دست نزدم میکرو رو باید به usb وصل کنیم بعد اینکارا رو انجام بدیم ؟(موس م که به صورت usb تو قسمت terminal بخش usb devicesاسمش اومده بود!منم جداش کردم )

sajjad_AD
30-10-2014, 18:46
سلام



تو VID و PID نمیتونم عدد هگز بنویسم (C,D)


مگه میشه نتونید این حروف رو تایپ کنید؟! با حروف بزرگ تایپ کن حتما می شه اگه غیر از این باشه دیگه نمیدونم ii998)



توضیح اینکه سربرگ teminal رو تو همین قسمت اصلا دست نزدم میکرو رو باید به usb وصل کنیم بعد اینکارا رو انجام بدیم ؟(موس م که به صورت usb تو قسمت terminal بخش usb devicesاسمش اومده بود!منم جداش کردم )


نه نیاز به جدا کردن هیچ Device یی هست نه متصل کردن میکرو , اون قسمتی هم که موس تو لیست هست مربوط به HID Terminal میشه و برای ارسال و دریافت دیتا بین PC و Device به کار میره یه چیزی شبیه به Hyperterminal

NoBoko
30-10-2014, 21:19
با تشکر از شما ...این هم یک مثال که با برد دیسکاوری که از VCP استفاده می کنه
و نیازی به رفرنس و dll نیست
You can see links before reply (You can see links before reply X%2FCoIDE_USB_CDC_Example.html&sa=D&sntz=1&usg=AFQjCNFYUtj4ITK6Oj9z_MkbhMmlxd1wcQ)

paradox7
31-10-2014, 19:42
اون مشکلم رو حل کردم یه مشکل دیگه دارم ممنون میشم راهنمایی کنید .
برنامه رو که build میکنم ارر دارم مربوط به کرک میشه ؟(ببخشید من تابحال با mikroc کار نکردم)
You can see links before reply


بله مربوط به کرک بود حل شد .:0013:

من مشکل unknown device دارم چیکار کنم ؟cry::
و اینکه اگه بخوایم مقادیر adc و تایمر رو از میکرو بفرستیم چیکار باید بکنیم ؟lov:

sajjad_AD
02-11-2014, 02:27
من مشکل unknown device دارم چیکار کنم ؟


شما احتمالا کلاک USB رو 48MHz تنظیم نکردی برای این کار وقتی پروژه mikroC ت رو باز کردی از منوی Project گزینه Edit Project رو بزن
پنجره پیکربندی میکرو باز میشه که باید با توجه به کریستال خارجی که به میکروت وصله رجیستر ها رو تنظیم کنی
با فرض اینکه کریستال متصل به میکرو 8MHz هست و کلاک cpu رو 72MHz بخوایم تنظیم کنیم طبق این عکس مقادیر رو بذار (همه مقادیر عینا مثل عکس باشن غیر از PLL که با توجه به کریستال مقدار دهی میشه) :

8202

ضریب pll بر اساس کریستال متصل به میکرو انتخاب شده , با توجه به اینکه می خوایم کلاک CPU مقدارش 72MHz باشه پس ضریب PLL رو 9 قرار می دیم (8MHz * 9 = 72MHz)
و با توجه به اینکه کلاک USB بر اساس تنظیمات انجام شده , از خروجی PLL تقسیم بر 1.5 بدست میاد پس کلاک USB برابر میشه با 72MHz / 1.5 = 48MHz
بعد از اینکه تنظیمات لازم رو انجام دادی OK کن و برنامه رو دوباره کامپایل و میکرو رو پروگرام کن

این مشکل رو حل کن تا بریم سراغ ارسال مقادیر ADC یا مثلا Timer

paradox7
02-11-2014, 16:59
سلام مجدد ممنون بایت راهنماییتون .
شماتیکusb من به این صورته(از فروشگاه خریدم )
You can see links before reply
میکرو به عنوان دیوایس شناخته میشه ولی مشکل اینجاست که pd.2 من به usb وصله! اولش که میکرو رو وصل میکنم LEDروشنه بعد در textعبارت LED OFF رو که مینویسم عکس العملی نشون نمیده ولی وقتی LED ON رو مینویسم LED من خاموش میشه و usb قطع میشه !
برنامه رو تغییر دادم و هرجا GPIOD نوشته شده بود رو کردم GPIOA چون رو PA.2 یه LED دارم وقتی usb رو وصل میکنم انگار نه انگار !هیچ اتفاقی نمی افته یعنی usb شناخته نمیشه !

sajjad_AD
02-11-2014, 21:13
میکرو به عنوان دیوایس شناخته میشه ولی مشکل اینجاست که pd.2 من به usb وصله! اولش که میکرو رو وصل میکنم LEDروشنه بعد در textعبارت LED OFF رو که مینویسم عکس العملی نشون نمیده ولی وقتی LED ON رو مینویسم LED من خاموش میشه و usb قطع میشه !
برنامه رو تغییر دادم و هرجا GPIOD نوشته شده بود رو کردم GPIOA چون رو PA.2 یه LED دارم وقتی usb رو وصل میکنم انگار نه انگار !هیچ اتفاقی نمی افته یعنی usb شناخته نمیشه !


حدس میزنم شما تو کانفیگ پورت ها دچار اشتباه شدی , این برنامه رو امتحان کن ( هر دو pin رو باید خروجی می کردی و PD2 باید صفر باشه ) :



char readbuff[64];
char writebuff[64];

void main() {

GPIO_Config(&GPIOA_BASE,
_GPIO_PINMASK_2 ,
_GPIO_CFG_DIGITAL_OUTPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);

GPIO_Config(&GPIOD_BASE,
_GPIO_PINMASK_2 ,
_GPIO_CFG_DIGITAL_OUTPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);

GPIOD_ODR.B2 = 0;

HID_Enable(&readbuff,&writebuff);

while(1) {

USB_Polling_Proc();

if(HID_Read()){

if(StrCmp(readbuff,"LED ON") == 0)
GPIOA_ODR.B2 = 1;
else if(StrCmp(readbuff,"LED OFF") == 0)
GPIOA_ODR.B2 = 0;

HID_Write(&readbuff,64);

}

}

}

paradox7
03-11-2014, 17:29
خیلی خیلی ممنونم جواب داد:018::o

حواسم نبود که D رو کانفیگ نکردم :sa:

میشه زود بریم سر آموزش ADC و تایمر؟ :018:

glassybox
04-11-2014, 21:49
سلام آیا با این روش میشه به حداکثر سرعت 12mbit/s رسید؟ و اگه نه پس چه طوری میشه به این سرعت رسید؟

sajjad_AD
05-11-2014, 12:24
خیلی خیلی ممنونم جواب داد:018::o

خوب خدارو شکر منم :oaa):D2



میشه زود بریم سر آموزش ADC و تایمر؟ :018:


نه متاسفانه نمیشه :mrgreen: خارج از بحث تاپیکه امااااااااااااااااا برای ارسال دیتا از سمت میکرو به PC باید یه سر فصل دیگه به این تاپیک usb در بیست دقیقه اضافه کنم اونم رویداد usb هست :

فرض کنید قرار نیست از PC یه دیتا به Device ارسال و بلافاصله دیتا هایی رو از میکرو دریافت کنید و فقط قراره میکرو مثلا هر ثانیه یه دیتا به PC ارسال کنه , برای این کار از رویداد دریافت usb استفاده می کنیم
وقتی این کار رو کنیم برنامه #C یی که نوشتیم به محض دریافت اطلاعات از USB رویداد دریافت رو فراخوانی می کنه ( یه چیزی تو مایه های وقفه ) و کدی رو که ما تو اون رویداد نوشتیم اجرا می کنه
خوب برنامه #C مون به این صورت نوشته میشه اینم تا تونستم سادش کردم : (برنامه بعد از دریافت اطلاعات از Device هرچی دریافت کرده رو در textbox1 نمایش میده)



using System;
using System.Windows.Forms;
using LibUsbDotNet;
using LibUsbDotNet.Main;

namespace Windows_Form_USB_App
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

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,64);

Reader.DataReceived += Reader_DataReceived;
Reader.DataReceivedEnabled = true;

if (Device != null)
button1.Text = "Device Found.";

}

private void Reader_DataReceived(object sender, EndpointDataEventArgs e)
{

this.Invoke((MethodInvoker)delegate()
{
textBox1.Text = System.Text.Encoding.Default.GetString(e.Buffer);
});

}

}

}



برنامه میکرو هم برای اینکه کار شما راه بیوفته برا ارسال مقدار ADC مثال زدم به این صورته که هر ثانیه یه بار مقدار کانال ADC0 رو می خونه و به usb ارسال می کنه :



char readbuff[64];
char writebuff[64];

void main() {

ADC1_Init();
ADC_Set_Input_Channel(_ADC_CHANNEL_0);

HID_Enable(&readbuff,&writebuff);

while(1) {

USB_Polling_Proc();

//if(HID_Read()){

//}

IntToStr(ADC1_Get_Sample(0),writebuff);

HID_Write(&writebuff,64);

Delay_ms(1000);

}

}


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

فایل های این فصل هم پیوست شدن

موفق باشید :hi:

sajjad_AD
05-11-2014, 12:59
سلام آیا با این روش میشه به حداکثر سرعت 12mbit/s رسید؟ و اگه نه پس چه طوری میشه به این سرعت رسید؟

سلام
حداکثر سرعتی که من بدست اوردم 3Mbit/s بود! شاید باید میکروی با فرکانس بالاتری استفاده شه مثلا STM32F2 به بالا

paradox7
08-11-2014, 20:39
سلام
ممنونم خیلی خیلی ممنونم که سوالامون رو پاسخ میدین.
خودتون مثال event رو تست کردین ؟من تست کردم ولی pc نمیشناسه usbرو .پورت Dرو نباید کانفیگ کنیم ؟میشه دو تا برنامه رو هم مخلوط کرد دیگه؟

sajjad_AD
08-11-2014, 23:55
خواهش می کنم وظیفمه



خودتون مثال event رو تست کردین ؟من تست کردم ولی pc نمیشناسه usbرو .پورت dرو نباید کانفیگ کنیم ؟


بله معلومه که تست کردم و کار می کنه , در مورد پورت d فکر نمی کردم دیگه نیاز به خاطر نشان کردن باشه بله باید به صورت خروجی کانفیگش می کردی و مقدار 0 بهش میدادی عین قبل
علتش اینه که پول آپ usb ت به واسطه مداری که براش طراحی شده به صفر بودن pd2 وابستس



میشه دو تا برنامه رو هم مخلوط کرد دیگه؟


بله میشه

paradox7
09-11-2014, 21:59
مشکل نشناخته شدن حل شد ممنونم .
مشکل جدید اینجاست که من اصلا ADC رو وصل نکردم ولی عدد نشون میده !مشکل کجا میتونه باشه؟:(یعنی اصلا با ADC کار نداره !سنسور به ADCوصل کردم عدد درستی نشون نمیده !
امتحان کردم اگه PA.0 رو کانفیگ کنم جواب میده یا نه به این صورت کانفیگ کردم


GPIO_Config(&GPIOA_BASE,
_GPIO_PINMASK_0 ,
_GPIO_CFG_ANALOG_INPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP);

ولی جواب نداد.

(توضیح اینکه از فتوسل که سنسور نوره استفاده میکنم و قبلا ازش جواب گرفتم .میکرو من همstm32f103rb هستش و به PA.0 وصل کردم )

paradox7
11-11-2014, 23:00
سلام خسته نباشید و خدا قوت .یه سوال دیگه میشه بپرسم ؟
میشه این فایل c. که ساخته شده رو هدر کرد و تو keil ازش استفاده کرد؟اگه نمیشه چطور میشه این برنامه رو تو keil نوشت ؟

NoBoko
11-11-2014, 23:44
از دوستان اگر کسی کد ارسال داده ADC به کامپیوتر از طریق USB با برد دیسکاوری stm32f4 توسط نرم افزار keil با سرعت بالا و کلاس VCP می خواد، منو پخ کنه...یعنی ایملشو واسم پخ کنه.:wink:
البته با اجازه صاحب تاپیک.

behnam6500
30-03-2015, 12:18
سلام استاتید...

مثالی از نحوه راه اندازی usb device در keil ندارید برای همین میکرو f103rbt6؟

esisafa
31-03-2015, 01:40
اگر سافت پک های middleware و cmsis و میکرو مورد نظر رو نصب کنید، با استفاده از داکیومنت usb میتونید پروژه ایجاد کنید. نحوه ی ایجاد پروژه بسیار راحته در keil5.
در سافت پک میکرو مورد نظر حتما مثال usb وجود داره

alho777
20-07-2016, 11:05
سلام :hi:

این آموزش راه اندازی پورت usb stm32 برای کسانی آماده شده که می خوان از usb به عنوان یک روش راحت و ارزان برای ارتباط با pc استفاده کنن ولی از وارد شدن بهش کمی واهمه دارن.
و ای کسانی تنها دلیلتون برای استفاده از avr صرفه اقتصادیه (با کسانی که دلایل دیگه ای دارن کار ندارم) در حالی که با 20-15 چوخ یه میکرو و یه مبدل usb به com برای چنین پروژه هایی استفاده می کنید
برید آرم کار کنید که با 8 چوخ , هزار جور کار میکنه براتون.(اینو گفتم که اعلام انزجاری کرده باشم وگرنه که لایبرری usb برا avr (You can see links before reply) داریم هلو :mrgreen: )

استفاده از usb این روز ها خیلی ساده شده هم به خاطر لایبراری هایی که برای اپلیکیشن ها ایجاد شده (که ما قراره با libusbdotnet کار کنیم) و هم بخاطر توابعی که کامپایلر های میکروکنترولر ها برای این کار در نظر گرفتن.

آموزشی که تو این تاپیک قرار دادم مرحله به مرحله ساخت یک usb device هست که با نرم افزاری در کامپیوتر قراره ارتباط بر قرار کنه و یه سری دیتا بینشون رد و بدل شه

قراره با میکروکنترولر stm32f103rbt6 و کامپایلر mikroc arm و نرم افزار ویندوز مون هم با #visual studio c نوشته بشه.

خب از برنامه و شماتیک میکروکنترولر شروع می کنیم , در کامپایلر mikroc arm برای ساخت یه usb device مراحل زیر باید طی شه:

اول از همه mikroc رو باز و یه پروژه ایجاد کنید و سپس از منوی tools بر روی گزینه hid terminal کلیک کرده و پس از باز شدن پنجره hid terminal پارامتر های زیر را وارد کنید:

You can see links before reply

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 رو باز کنید و تغییرات زیر رو اعمال کنید:

You can see links before reply

بایت usb_transfer_type رو که مقدارش به طور پیش فرض 0x03 بوده رو طبق عکس به 0x02 تغییر بدید (نوع انتقال دیتا با این بایت تعیین میشه که مقدار 3 وقفه ای هست و مقدار 2 توده ای)
usb_interrupt رو هم چون فعلا نمی خوایم از وقفه usb استفاده کنیم طبق عکس به 0 تغییر بدید.
تغییرات اعمال شده رو ذخیره کنید.

بعد از این نوبت به برنامه خودمون می رسه که به این صورت نوشته میشه
(یه برنامه سادس که بعد از دریافت دیتا از usb , همان دیتای دریافت شده را به port ارسال می کنه و سپس اگر شرط برقرار بود led رو روشن و اگر اون یکی شرط :mrgreen: برقرار بود 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 مربوط میشه:

You can see links before reply

حالا بریم سراغ برنامه ای که قراره با نرم افزار visual studio 2013 نوشته شه :

اول از همه برنامه libusbdotnet_setup.2.2.8 رو که پیوست شده دانلود و نصب کنید (آخرین ورژن کلاس libusbdotnet رو هم از این لینک (You can see links before reply) می تونید دانلود کنید)

حالا یه پروژه 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.te xt + "\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) پیوست شدن


استفاده از رویداد usb در #c (پست شماره 11 همین تاپیک) (You can see links before reply)


در نهایت تشکر می کنم از جناب esisafa (You can see links before reply) و hessam2013 (You can see links before reply) بخاطر کمک ها شون.

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


دوست عزیر hid نباید نیاز به هیچ گونه نصب درایور داشته باشه .... میشه مثال بزنین که نیاز به نصب درایور نداشته باشه ؟؟؟؟

30m
22-12-2017, 20:52
سلام. من نیاز به یک پورت کامل سریال دارم. مخصوصا پین 6 پورت کام... این پین وقتی تغییر وضعیت پیدا میکنه کاملا میشه روی ترمینالها وضعیتش رو مشاهده کرد. و به نوعی یک از ورودیهای پورت کام محسوب میشه....

آیا میشه در قسمت usbcdc این پین رو برنامه نویسی کرد یا نه؟

میخوام فرض مثال از طریق usb به کاپیوتر بگم که یک ثانیه این پین فعال هست و یک ثانیه غیر فعال... یه جورایی میخوام مجازی وضعیت این پین رو از طریق یو اس بی به کامپیوتر ارسال کنم....

ممنون میشم اگه کمکی ازتون بر میاد کمکم کنید. ضمنا مثال cdc با lpc1768 رو مطالعه کردم و استفاده کردم ولی چیزی از این پین اونجا ندیدم.

ممنونم از دوستان

mzarkoob
30-12-2017, 01:26
سلام
در lpc1768 فقط com1 است که سریال کامل است و می توان از تمام پایه های سریال استفاده کرد.
چرا از همین com1 استفاده نمی کنید؟
cdc به طور معمول از tx و rx استفاده می کند.

mzarkoob
23-01-2018, 13:32
سلام. من نیاز به یک پورت کامل سریال دارم. مخصوصا پین 6 پورت کام... این پین وقتی تغییر وضعیت پیدا میکنه کاملا میشه روی ترمینالها وضعیتش رو مشاهده کرد. و به نوعی یک از ورودیهای پورت کام محسوب میشه....
آیا میشه در قسمت usbcdc این پین رو برنامه نویسی کرد یا نه؟
میخوام فرض مثال از طریق usb به کاپیوتر بگم که یک ثانیه این پین فعال هست و یک ثانیه غیر فعال...
من در مثال cdcدیدم این اپشن گذاشته اگر بخواهید از دو پایه دیگر پورت سریال استفاده کنید:

#if USE_RTS_CTS_PINS
GPIOD->CRL &= 0xFFF00FFF;
GPIOD->CRL |= 0x00044000;
#endif
و در سایر توابعی هم که نیاز بوده دیفین مربوطه قرار داده شده است.
پس این امکان هست