USB HID Isochronous Veri Transfer

Bowman

Üye
Katılım
7 Ekim 2022
Mesajlar
98
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: 61
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 üyeler

Forum istatistikleri

Konular
5,844
Mesajlar
99,713
Üyeler
2,481
Son üye
rfdog12

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top