STM32F10x USB Library Problemi

Başlatan Mucit23, 07 Temmuz 2015, 15:47:03

Mucit23

Aynı kart değilmi nasıl olur anlamıyorum???

Acaba board uzerinde diger ekipmanlardanmı etkileniyor çok ilginç

Elimde bir tane daha aynısından olacak birde onunla deneyeyim. Isletim sistemi ile farketmez değilmi?

M_B

Hocam aynı kart
işletim sistemim ise win7 Enterprise 64Bit.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

İşletim sistemi ile alakalı değil. Şuanda bazen görüyor bazen görmüyor. Elimde iki tane aynı karttan  var. İkisindede aynı durum geçerli.


Ben şu USB-DP hattındaki R10 direncinden şüpheleniyorum



Eğer şema doğru ise R10 benim kartta 10K kullanılmış. Normalde ise 1K5 kullanılıyor. 10K yüksek olabilir diye düşünüyorum. Eğer USB bağlantısını yapınca hemen bağlantı sesi gelirse problem olmuyor ama eğer bağlantı yaptıktan sonra yaklaşık 3-4 sn kadar bekleyip bağlantı sesi gelirse usb aygıt tanınmadı diyor.


@Zoroaster  Bu konuda bir tavsiyen olabilirmi? USB neden bu şekilde dengesiz çalışıyor?

Mucit23

İlginç bir şekilde R10 direncini 1K5 Yapınca bilgisayar hiç görmüyor. Yani hiç tepki vermiyor. Tekrar eski 10K direnci taktım böyle arada bir görüyordu yine

@M_B Sizde böyle arada görmeme oluyormu? Yada programa başka eklentiler yapınca görmeme gibi durumlar oluşuyormu? Bu durum diğer program parcacıklarını ekleyince daha çok artıyor. Örneğin P10 Panel sürüyorum. Arka planda sürekli timer çalışıp kesme oluşturuyor. Eğer bu kısımlar aktif ise çok fazla problem oluyor. 10 kez usb bağlantısı yapsam 2 defa ya görür yada görmez. Ama P10 Panel kütüphanelerini devre dışı bırakınca 10 kez usb bağlantısı yapsam 8 defa felan problemsiz görüyor. Çözümü bulamadım bir türlü.  ???

M_B

@Mucit23  Hocam R10 direnci bende de 10K
Hocam bende arada görmeme yapmadı. Cıkarıp taktım hep gördü.
Hocam isterseniz toplam kodu verin. Yani derlenmiş olarak module yukleyim o zaman dediğiniz gibi yapacak mı bakalım.


@Mucit23  ne yaptınız sorunu bulabildiniz m i ?
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

Beslemeyle ilgili olabileceğini düşünüyorum. Ben karti harici bir 3.3v regülatör ile besliyorum. Fakat usb taktığım zaman kartin üzerindeki regülatör devreye girip islemciyi besliyor. Iki besleme ayni anda devrede oldugu zaman genellikle görmüyor. Fakat harici beslemeyi devre dışı bıraktığımda büyük bir çoğunlukla problemsiz görüyor. Bir sekilde usb beslemesini devre dışı bırakmam lazim.
Pazartesi tekrar deneyeceğim. 

Okan AKÇA

Dirençleri sökün kisa devre yapın

Zoroaster

Islemcie enerji verdiginizde reset rutinleri init rutinleri varsa abuk subuk bir suru kod calisir nihatetinde usb init rutinine sira gelir. Halbuki kodlarinizin yazilisina bagli olarak power on asamasindan bu yana yuzlerce mili saniye gecmis olacaktir.

Power on asamasinda usb hat 1K5 ile pull up yapildigi icin PC islerim sistemi derhal usb sorgulamalara baslar. Halbuki MCU tarafinda daha usb init islemi bile yapilmamistir.

Peki ne yapacaksiniz?

1K5 i dogrudan 3V3 e degil bir porta baglayacak ve bu pini reset rutininde low yapacaksiniz. USB init rutininde ise portu high yapacaksiniz.

Boylece power on asamasindan PCnin haberi olmayacak ve sorgulama yapmayacak. Ne zaman usb init yaptiniz iste o an 1K5 pull up olacak ve PC nin dikkati cekilecek.

Seytan deliginden kacti.

Mucit23

@Okan AKÇA


R9 ve R11 den bahsediyorsun değilmi?


@Zoroaster


Normalde system_init den sonra hemen usb init rutinleri başlatıyorum. Ama yeterli gelmiyor sanırım. Dediğini pazartesi bi uygulayayım


1k5 ile 10k uygulamada cok farkedermi? Şu haliyle 10k yi söküp 1k5 taktığımda hiç çalışmıyor.

Okan AKÇA

Evet Dirençlerden kaynaklanabilir

Mucit23

#55
@OkanAkça Dirençleri söktüm ama değişen birşey olmadı.

@Zoroaster Pull-up Beslemesini GPIO ile kontrol etmek için harici bir devre yaptım. Ama değişen birşey yok. Durum aynı gibi.

Ayrıca anlamadığım bir nokta var. Senin dediğin gibi USB init aşamasında PC sorgulama yapıyorsa neden sonradan usb bağlantısı yaptığımda problem olsun ki?

İşlemci init aşamasından Hat pull-up yapılsa bile ben USB kablosunu takmadığım için sorun yok. İşlemci çalışıyor usb init rutinleri felan bitti ana programda çalışıyorken USB bağlantısını yaptığımda zaten usb modülü init edilmiş çalışıyor olacaktır. Bu durumdayken sıkıntı oluyor. Gerçi sorunu büyük bir oranda çözdüm gibi. Şuan daha az yapıyor ama bazen tuttumu tuyor inadı.

Son olarak USB den gelen 5V beslemeyi ayıracağım. Kart sadece benim verdiğim 3.3V ile çalışsın istiyorum. USB den enerji çekmesin.
Birde 1K5 kesinlikle olmuyor. PC hiç tepki vermiyor. R10 direnci en az 10K olmalı.




Mucit23

#56
Sorun aynı şekilde devam ediyor arkadaşlar.


Kullandığım logitech kablosuz fareden şüphelenmeye başladım. Çünkü Yazdığım C# yazılımı kablosuz farenin alıcısını bilgisayara taktığımda aygıt bağlandı, çıkardığımda ise aygıt çıkarıldı eventlerini oluşturuyor. Halbuki VID ve PID ler farklı. Bu neden oluyor anlamış değilim. Farklı bir PC ile denedim. Ne fare nede benim STM daha önce o pcye takılmadı. Ama ondada Aygıt tanınmadı hatası alıyorum. Bazen diyorum tamam oldu daha artık o hatayı vermiyor ama sürekli aynı sorun... Kafayı yememek elde değil.


Sorum şu? Descriptor dosyasını nasıl düzenlerim?. Bildiğim kadarıyla VID ve PID değiştirmek yetmiyor. Bilgisayar STM kitimi tamamen farklı bir kimlikle tanısın istiyorum.
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name          : usb_desc.c
* Author             : MCD Application Team
* Version            : V2.2.1
* Date               : 09/22/2008
* Description        : Descriptors for Custom HID Demo
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/


/* Includes ------------------------------------------------------------------*/
#include "usb_lib.h"
#include "usb_desc.h"


/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Extern variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/


/* USB Standard Device Descriptor */
const u8 CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] =
  {
    0x12,                       /*bLength */
    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
    0x00,                       /*bcdUSB */
    0x02,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    0x40,                       /*bMaxPacketSize40*/
    0x83,                       /*idVendor (0x0483)*/
    0x04,
    0x50,                       /*idProduct = 0x5750*/
    0x57,
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    1,                          /*Index of string descriptor describing
                                              manufacturer */
    2,                          /*Index of string descriptor describing
                                             product*/
    3,                          /*Index of string descriptor describing the
                                             device serial number */
    0x01                        /*bNumConfigurations*/
  }
  ; /* CustomHID_DeviceDescriptor */




/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const u8 CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
  {
    0x09, /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
    CUSTOMHID_SIZ_CONFIG_DESC,
    /* wTotalLength: Bytes returned */
    0x00,
    0x01,         /* bNumInterfaces: 1 interface */
    0x01,         /* bConfigurationValue: Configuration value */
    0x00,         /* iConfiguration: Index of string descriptor describing
                                 the configuration*/
    0xC0,         /* bmAttributes: Bus powered */
                  /*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */
    0x32,         /* MaxPower 100 mA: this current is used for detecting Vbus */
//    0x96,         /* MaxPower 300 mA: this current is used for detecting Vbus */
    /************** Descriptor of Custom HID interface ****************/
    /* 09 */
    0x09,         /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */
    0x00,         /* bInterfaceNumber: Number of Interface */
    0x00,         /* bAlternateSetting: Alternate setting */
    0x02,         /* bNumEndpoints */
    0x03,         /* bInterfaceClass: HID */
    0x00,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
    0x00,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
    0,            /* iInterface: Index of string descriptor */
    /******************** Descriptor of Custom HID HID ********************/
    /* 18 */
    0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x10,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country */
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
    0x22,         /* bDescriptorType */
    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
    0x00,
    /******************** Descriptor of Custom HID endpoints ******************/
    /* 27 */
    0x07,          /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */


    0x82,          /* bEndpointAddress: Endpoint Address (IN) */               
                   // bit 3...0 : the endpoint number
                   // bit 6...4 : reserved
                    // bit 7     : 0(OUT), 1(IN)
    0x03,          /* bmAttributes: Interrupt endpoint */
    0x40,//0x02,          /* wMaxPacketSize: 20 Bytes max */
    0x00,
    0x20,          /* bInterval: Polling Interval (21 ms) */
    /* 34 */
    	
    0x07,	/* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,	/* bDescriptorType: */
			/*	Endpoint descriptor type */
    0x01,	/* bEndpointAddress: */
			/*	Endpoint Address (OUT) */
    0x03,	/* bmAttributes: Interrupt endpoint */
    0x40,//0x02,	/* wMaxPacketSize: 20 Bytes max  */
    0x00,
    0x10,	/* bInterval: Polling Interval (32 ms) */
    /* 41 */
  }
  ; /* CustomHID_ConfigDescriptor */
const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = 
{ 
//#ifdef 0 
0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 
0x09, 0x01, /* USAGE (Demo Kit) */ 
0xa1, 0x01, /* COLLECTION (Application) */ 
/* 6 */ 


// The Input report 
0x09,0x03, // USAGE ID - Vendor defined 
0x15,0x00, // LOGICAL_MINIMUM (0) 
0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255) 
0x75,0x08, // REPORT_SIZE (8) 
0x95,0x16, // REPORT_COUNT (20) 
0x81,0x02, // INPUT (Data,Var,Abs) 
//19
// The Output report 
0x09,0x04, // USAGE ID - Vendor defined 
0x15,0x00, // LOGICAL_MINIMUM (0) 
0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 
0x75,0x08, // REPORT_SIZE (8) 
0x95,0x16, // REPORT_COUNT (20) 
0x91,0x02, // OUTPUT (Data,Var,Abs) 
//32
// The Feature report
/*
0x09, 0x05, // USAGE ID - Vendor defined 
0x15,0x00, // LOGICAL_MINIMUM (0) 
0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255) 
0x75,0x08, // REPORT_SIZE (8) 
0x95,0x02, // REPORT_COUNT (2) 
0xB1,0x02, 
*/
/* 45 */ 
0xc0 /* END_COLLECTION */ 
//#endif 
}; /* CustomHID_ReportDescriptor */ 




/* USB String Descriptors (optional) */
const u8 CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] =
  {
    CUSTOMHID_SIZ_STRING_LANGID,
    USB_STRING_DESCRIPTOR_TYPE,
    0x09,
    0x04
  }
  ; /* LangID = 0x0409: U.S. English */


const u8 CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] =
  {
    CUSTOMHID_SIZ_STRING_VENDOR, /* Size of Vendor string */
    USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType*/
    // Manufacturer: "STMicroelectronics" 
    'M', 0, 'y', 0, 'U', 0,'S', 0,'B', 0, '_', 0, 'H', 0,'I',0,'D',0
  };


const u8 CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] =
  {
    CUSTOMHID_SIZ_STRING_PRODUCT,          /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'B', 0, 'y', 0, ' ', 0, 'D', 0, 'Z', 0, '5', 0,'6',0,'1',0
  };
u8 CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL] =
  {
    CUSTOMHID_SIZ_STRING_SERIAL,           /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'x', 0, 'x', 0, 'x', 0,'x', 0,'x', 0, 'x', 0, 'x', 0
  };


/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/


Ekleme: C# yazılımında sıkıntı yokmuş. Kullandığım USB kütüphanesinde bütün HID aygıtlarının takılıp çıkarıldığında oluşan eventlar var. Onlar oluşuyormuş. Fakat asıl sorun devam ediyor.

baran123

Hocam siz bu çalışmayı STM32F103 ile mi yapıyorsunuz ?
Eğer donanımdan emin değilseniz ST'nin "CubeMx USB Mouse" örneğini deneyin.
Eğer donanımda problem yok ise kendi örneğinizde descriptor dosyasındaki aygıt stringini ve VID,PID değiştirirseniz tekrar bir driver yüklemesi yaparak farklı cihaz olarak algılayabilir.
Ama bunu denemedim emin değilim.


USBLibrary.dll dosyası her usb cihazı için event oluşturuyor bildiğim kadarıyla
Acaba kendi cihazımızın eventlerini nasıl oluşturabiliriz ?

Mucit23

USB Hid için CubeMX ile proje oluşturdum. Hiçbir sıkıntı olmadı. Doğrudan aygıtımı tanıyıp yazılımını kurdu. Donanımda hiçbir değişiklik olmamasına rağmen tak çıkar aygıt tanınmadı hatası almadım. Bu kadar kolay olması çok hoşuma gitti.

Demekki benim descriptor dosyam ile ilgili sıkıntı var.

HAL kütüphanesine geçmek istemiyorum. STD library ile yazılmış bir çok kütüphanem var. Bunları taşımak zor olur diye düşünüyorum. Birde alışmışlık var aslında.
Descriptor ile ilgili ne problem olabilir. Onu biraz araştırayım.

Alıntı yapılan: baran123 - 31 Temmuz 2017, 22:39:52
USBLibrary.dll dosyası her usb cihazı için event oluşturuyor bildiğim kadarıyla
Acaba kendi cihazımızın eventlerini nasıl oluşturabiliriz ?

@baran123 Yok kendi cihazımız içinde event oluşuyor.

usbHidPort1_OnSpecifiedDeviceArrived kendi cihazımız bağlandığı zaman çalışır.
usbHidPort1_OnSpecifiedDeviceRemoved kendi cihazımız çıkarıldığı zaman çalışır.

volkanunal

Cubemx ile hazırladığım bir kaç usb hid uygulaması mevcut pc tarafına veri gönderme amaçlı
https://www.youtube.com/watch?v=0zoeLBUxpLI ( Mouse )
Şuda media keyleri üzerine https://engineeringvolkan.wordpress.com/2017/06/22/stm32f103xx-usb-media-hid-uygulamasi/
Primum nil nocere