USB HID Isochronous Veri Transfer

Bowman

Aktif Üye
Katılım
7 Ekim 2022
Mesajlar
112
Nuvoton'un M032SG8AE işlemcisi ile USB üzerinden bilgisayara veri gönderme işlemini yapıyorum. Veri transfer yöntemlerinden interruptı kullanarak gerçekleştirdim. Ben isochronous olarak da veri göndermek istiyorum.

İşlemcinin HID_Transfer diye bir örnek projesi var. Bu projede interrupt ile göndermişler. Ben bazı ayarları değiştirdim. Öncelikle configDescriptor'da EP_INT olan yerleri EP_ISO yaptım. 40. ve 53. satırlar.
C:
uint8_t gu8ConfigDescriptor[] =
{
    LEN_CONFIG,     /* bLength */
    DESC_CONFIG,    /* bDescriptorType */
    /* wTotalLength */
    (LEN_CONFIG+LEN_INTERFACE+LEN_HID+LEN_ENDPOINT*2) & 0x00FF,
    (((LEN_CONFIG+LEN_INTERFACE+LEN_HID+LEN_ENDPOINT*2) & 0xFF00) >> 8),
    0x01,           /* bNumInterfaces */
    0x01,           /* bConfigurationValue */
    0x00,           /* iConfiguration */
    0x80 | (USBD_SELF_POWERED << 6) | (USBD_REMOTE_WAKEUP << 5),/* bmAttributes */
    USBD_MAX_POWER,         /* MaxPower */

    /* I/F descr: HID */
    LEN_INTERFACE,  /* bLength */
    DESC_INTERFACE, /* bDescriptorType */
    0x00,           /* bInterfaceNumber */
    0x00,           /* bAlternateSetting */
    0x02,           /* bNumEndpoints */
    0x03,           /* bInterfaceClass */
    0x00,           /* bInterfaceSubClass */
    0x00,           /* bInterfaceProtocol */
    0x00,           /* iInterface */

    /* HID Descriptor */
    LEN_HID,        /* Size of this descriptor in UINT8s. */
    DESC_HID,       /* HID descriptor type. */
    0x10, 0x01,     /* HID Class Spec. release number. */
    0x00,           /* H/W target country. */
    0x01,           /* Number of HID class descriptors to follow. */
    DESC_HID_RPT,   /* Descriptor type. */
    /* Total length of report descriptor. */
    sizeof(HID_DeviceReportDescriptor) & 0x00FF,
    ((sizeof(HID_DeviceReportDescriptor) & 0xFF00) >> 8),

    /* EP Descriptor: interrupt in. */
    LEN_ENDPOINT,                       /* bLength */
    DESC_ENDPOINT,                      /* bDescriptorType */
    (INT_IN_EP_NUM | EP_INPUT),         /* bEndpointAddress */
    EP_ISO,                             /* bmAttributes */
    /* wMaxPacketSize */
    EP2_MAX_PKT_SIZE & 0x00FF,
    ((EP2_MAX_PKT_SIZE & 0xFF00) >> 8),
    HID_DEFAULT_INT_IN_INTERVAL,        /* bInterval */

    /* EP Descriptor: interrupt out. */
    LEN_ENDPOINT,                       /* bLength */
    DESC_ENDPOINT,                      /* bDescriptorType */
    (INT_OUT_EP_NUM | EP_OUTPUT),   /* bEndpointAddress */
    EP_ISO,                             /* bmAttributes */
    /* wMaxPacketSize */
    EP3_MAX_PKT_SIZE & 0x00FF,
    ((EP3_MAX_PKT_SIZE & 0xFF00) >> 8),
    HID_DEFAULT_INT_IN_INTERVAL         /* bInterval */
};
Sonrasında endpoint konfigürasyonlarını yine isochronous moduna aldım. EP2 ile bilgisayara veri göndereceğim için onu seçtim isochronous olarak.
C:
void HID_Init(void)
{
    /* Init setup packet buffer */
    /* Buffer range for setup packet -> [0 ~ 0x7] */
    USBD->STBUFSEG = SETUP_BUF_BASE;
    
    /*****************************************************/
    /* EP0 ==> control IN endpoint, address 0 */
    USBD_CONFIG_EP(EP0, USBD_CFG_CSTALL | USBD_CFG_EPMODE_IN | 0);
    /* Buffer range for EP0 */
    USBD_SET_EP_BUF_ADDR(EP0, EP0_BUF_BASE);
    
    /* EP1 ==> control OUT endpoint, address 0 */
    USBD_CONFIG_EP(EP1, USBD_CFG_CSTALL | USBD_CFG_EPMODE_OUT | 0);
    /* Buffer range for EP1 */
    USBD_SET_EP_BUF_ADDR(EP1, EP1_BUF_BASE);
    
    /*****************************************************/
    /* EP2 ==> Isochronous IN endpoint, address 1 */
    //USBD_CONFIG_EP(EP2, USBD_CFG_EPMODE_IN | INT_IN_EP_NUM);
     USBD_CONFIG_EP(EP2, USBD_CFG_TYPE_ISO | INT_IN_EP_NUM);
    /* Buffer range for EP2 */
    USBD_SET_EP_BUF_ADDR(EP2, EP2_BUF_BASE);
    
    /* EP3 ==> Isochronous OUT endpoint, address 2 */
    //USBD_CONFIG_EP(EP3, USBD_CFG_TYPE_ISO | INT_OUT_EP_NUM);
     USBD_CONFIG_EP(EP3, USBD_CFG_EPMODE_IN | INT_OUT_EP_NUM);
    /* Buffer range for EP3 */
    USBD_SET_EP_BUF_ADDR(EP3, EP3_BUF_BASE);
    /* trigger to receive OUT data */
    USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE);
}
Veri göndermek için ise şöyle bir fonksiyon yazdım.
C:
void sending_data_to_pc(void)
{
     int testData[64];
     int i;
    
     for(i = 0; i < 64; i++)
     {
          testData[i] = i;
     }
    
     USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP2)), (void *)testData, 64);
     USBD_SET_PAYLOAD_LEN(EP2, 64);
    
     USBD_Start();
}

Gönderdiğim veriyi görebilmek için ise USB Trace isimli bir uygulama indirdim. Mikroişlemcimin USB çevresel birimini bağladığım yeri port2 olarak görüyorum. VID-PID falan uyuşuyor. Fakat veri gönderme işlemini bir türlü yapamadım. Acaba nerede hata yapıyorum ?
 
  • Beğen
Reactions: nt

HID ile Isochronous​

transfer yapılamaz. Sadece interrupt transfer olur. HID tanımı böyledir. Aynı cihaza başka interface eklenirse yapılabilir. Örneğin aygıt hem HID hem de ses kartı gibi görünür. Ses kartı isoc. transfer yapar. Piyasada bulunabilen USB ses aygıtı inceleyebilirsiniz. Multi interface aygıt yapmak özel maharet gerektirir. Çok zordur
 
USB trafiğini gözlemlemek için Wireshark da kullanabilirsin. Hem ağ, hem USB, hem de Bluetooth için aynı yazılımı kullanma olanağı sunuyor, bence bu büyük bir avantaj.
 

HID ile Isochronous​

transfer yapılamaz. Sadece interrupt transfer olur. HID tanımı böyledir. Aynı cihaza başka interface eklenirse yapılabilir. Örneğin aygıt hem HID hem de ses kartı gibi görünür. Ses kartı isoc. transfer yapar. Piyasada bulunabilen USB ses aygıtı inceleyebilirsiniz. Multi interface aygıt yapmak özel maharet gerektirir. Çok zordur
Çok teşekkür ederim. Peki şu an USB ile isochronous transfer yapabilmem için ne yapmam gerekli ? Yol haritası çıkartma konusunda yardımcı olabilir misiniz?
 
isochronous transfer için uygun interface ayarlamış ve aygıt veriyi sorunsuz gönderebilir olsun. Verileri nasıl alacaksınız? Örneğin bu aygıt ses kartı olsun. Mikrofondan kayıt yapıyormuş gibi olur. buna uygun pc tarafında kod parçacığı veya bileşenler bulabilirsiniz. Fakat gerçekte aygıt böyle mi görünecek? Asıl proje böyle mi olacak? Ses kartı gibi görünen cihaz Windows tarafında kolayca tanınıyor gibi olsa da sahada sorun yaşarsınız. Kullanıcı mikrofonu iptal olur vb.. durumlar

Öncelikle isochronous transfer yapabilecek aygıt interface'i hangisi olacak buna karar vermeli. Ses kartı olmayan sürücü gerektirmeyen güzel bir aygıt seçiniz. Webcam olabilir. Webcam gibi görünen fakat gerçekte sıcaklık ölçümü yapan absürt bir cihaz yakışmaz tabi ki. Sürücü gereitmeyen başka güzel interface çıkmış olabilir.

isochronous transfer seçmek için geçerli nedenleriniz vardır umarım.

USB ses kartı interface için descriptor ekteki gibidir. Gerçek cihazdan okuttum
 

Ekler

  • USB seskartı.zip
    3.6 KB · Görüntüleme: 105
Son düzenleme:
Ben şöyle bir şey yapacağım. Bir mesaj formatım var. Atıyorum bir örnek mesajım şöyle olsun. "GHJ01AHT00011100T4" tamamen farazi sadece örnek olması amaçlı. Bu mesaj içerisinde belli başlı şeyler barındıracak. Mesela sicaklık = 25, basınç = 0.01 gibi sensör değerleri. Ben bu mesajları bilgisayardan alıp okuyacağım. Isochronous denememin nedeni internette araştırma yaparken hızlı olmasından kaynaklıydı. Interrupt yöntemiyle de gönderebilirim mesajı tabi ki fakat her mesaj göndermek istediğim zaman bir interrupta gitsin istemedim. Sizce uygun değil mi isochronous kullanmak bu durumda?
 
Saniyedeki bayt sayısı 64.000'den küçükse hid aygıt rahatlıkla kullanılır.

Fakat çok zahmet gerekiyor. Kopukluk olmaması lazım. Profesyonel çözüm gerekir.

Bir rivayete göre hid aygıtı çok interface'li yaparak hız artırılabilir
Örn 4 interface varsa
4 x 64000 bayt mümkün gibi görünüyor.

Fazla zorlanmasın (?)diye
4 x 60000 olarak da yapılabilir.

Multi interface hid aygıt yapmak da zordur
 
Son düzenleme:
Hocam kusura bakmayın ama ne demek istediğinizi tam olarak anlayamadıım. Ben mikroişlemciden bilgisayara mesaj metni yollacağım. Burada hid aygıtı benim mikroişlemcim mi oluyor?
 
Aynen o oluyor. aygıt hid olur veya başka sınıf olur.
Kolay olsun sürücü gerekmesin diye mümkün olabilirse hız yeterliyse HID aygıt seçilir.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,957
Mesajlar
118,806
Üyeler
2,825
Son üye
karahanli7

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top