STM32F10x USB Library Problemi

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

Mucit23

#60
Arkadaşlar şöyle birşey yaptım. CubeMX ile Custom hid projesi oluşturup doğrudan karta yükledim. Sıkıntı yok. PC cihazımı görüyor. Fakat aygıt yöneticisinde cihazıma baktığımda Bu aygıt başlatılamıyor şeklinde bir uyarı alıyorum.


Bu uyarı ne anlama geliyor?

volkanunal

" Aygıtın donanım anahtarı genellikle bir "FailReasonString" değeri içerir ve değer dizesi, donanım üreticisi tarafından tanımlanan bir hata iletisi görüntüler. Donanım anahtarı "FailReasonString" değeri içermiyorsa, yukarıdaki hata iletisi görüntülenir." diyor şurada https://support.microsoft.com/tr-tr/help/310123/error-codes-in-device-manager-in-windows  daha önce hid uygulaması yapmıştım , akşam tekrar kartı takıp bakayım bende hid olarak görmüş müydü yoksa hata mı vermişti bakıp döneyim.
Primum nil nocere

Mucit23

Sorunu anladım.

CubeMX ile USB Custom HID projesi oluşturduğumda usb_custom_hid_if.c dosyası içerisinde CUSTOM_HID_ReportDesc_FS bir fonksiyon oluşturuluyor. Bu fonksiyon içerisinde anladığım kadarıyla nasıl bir haberleşme yapılacağı bazı parametrelerle USB üzerinden bildiriliyor.

CubeMX ile boş USB Custom HID projesi oluşturduğumda fonksiyonun içi aşağıdaki gibi geliyor
__ALIGN_BEGIN static uint8_t CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
  /* USER CODE BEGIN 0 */ 
  0x00, 
  /* USER CODE END 0 */ 
  0xC0    /*     END_COLLECTION	             */
   
};


Burada anladığım kadarıyla USB haberleşmesi nasıl yapılacağına dair bilgi göndermem gerekiyor. Yine ST'nin örneklerinden bir Custom HID örneğini açıp bu fonksiyon içerisine baktım.
  0x06, 0xFF, 0x00,             /* USAGE_PAGE (Vendor Page: 0xFF00) */
  0x09, 0x01,                   /* USAGE (Demo Kit) */
  0xa1, 0x01,                   /* COLLECTION (Application) */
  /* 6 */

  /* Led 1 */
  0x85, LED1_REPORT_ID,         /* REPORT_ID (1) */
  0x09, 0x01,                   /* USAGE (LED 1) */
  0x15, 0x00,                   /* LOGICAL_MINIMUM (0) */
  0x25, 0x01,                   /* LOGICAL_MAXIMUM (1) */
  0x75, 0x08,                   /* REPORT_SIZE (8) */
  0x95, LED1_REPORT_COUNT,      /* REPORT_COUNT (1) */
  0xB1, 0x82,                   /* FEATURE (Data,Var,Abs,Vol) */

  0x85, LED1_REPORT_ID,         /* REPORT_ID (1) */
  0x09, 0x01,                   /* USAGE (LED 1) */
  0x91, 0x82,                   /* OUTPUT (Data,Var,Abs,Vol) */
  /* 26 */

  /* Led 2 */
  0x85, LED2_REPORT_ID,         /* REPORT_ID 2 */
  0x09, 0x02,                   /* USAGE (LED 2) */
  0x15, 0x00,                   /* LOGICAL_MINIMUM (0) */
  0x25, 0x01,                   /* LOGICAL_MAXIMUM (1) */
  0x75, 0x08,                   /* REPORT_SIZE (8) */
  0x95, LED2_REPORT_COUNT,      /* REPORT_COUNT (1) */
  0xB1, 0x82,                   /* FEATURE (Data,Var,Abs,Vol) */

  0x85, LED2_REPORT_ID,         /* REPORT_ID (2) */
  0x09, 0x02,                   /* USAGE (LED 2) */
  0x91, 0x82,                   /* OUTPUT (Data,Var,Abs,Vol) */
  /* 46 */

  /* Led 3 */
  0x85, LED3_REPORT_ID,         /* REPORT_ID (3) */
  0x09, 0x03,                   /* USAGE (LED 3) */
  0x15, 0x00,                   /* LOGICAL_MINIMUM (0) */
  0x25, 0x01,                   /* LOGICAL_MAXIMUM (1) */
  0x75, 0x08,                   /* REPORT_SIZE (8) */
  0x95, LED3_REPORT_COUNT,      /* REPORT_COUNT (1) */
  0xB1, 0x82,                   /* FEATURE (Data,Var,Abs,Vol) */

  0x85, LED3_REPORT_ID,         /* REPORT_ID (3) */
  0x09, 0x03,                   /* USAGE (LED 3) */
  0x91, 0x82,                   /* OUTPUT (Data,Var,Abs,Vol) */
  /* 66 */

  /* Led 4 */
  0x85, LED4_REPORT_ID,         /* REPORT_ID 4) */
  0x09, 0x04,                   /* USAGE (LED 4) */
  0x15, 0x00,                   /* LOGICAL_MINIMUM (0) */
  0x25, 0x01,                   /* LOGICAL_MAXIMUM (1) */
  0x75, 0x08,                   /* REPORT_SIZE (8) */
  0x95, LED4_REPORT_COUNT,      /* REPORT_COUNT (1) */
  0xB1, 0x82,                   /* FEATURE (Data,Var,Abs,Vol) */

  0x85, LED4_REPORT_ID,         /* REPORT_ID (4) */
  0x09, 0x04,                   /* USAGE (LED 4) */
  0x91, 0x82,                   /* OUTPUT (Data,Var,Abs,Vol) */
  /* 86 */

  /* key Push Button */
  0x85, KEY_REPORT_ID,          /* REPORT_ID (5) */
  0x09, 0x05,                   /* USAGE (Push Button) */
  0x15, 0x00,                   /* LOGICAL_MINIMUM (0) */
  0x25, 0x01,                   /* LOGICAL_MAXIMUM (1) */
  0x75, 0x01,                   /* REPORT_SIZE (1) */
  0x81, 0x82,                   /* INPUT (Data,Var,Abs,Vol) */

  0x09, 0x05,                   /* USAGE (Push Button) */
  0x75, 0x01,                   /* REPORT_SIZE (1) */
  0xb1, 0x82,                   /* FEATURE (Data,Var,Abs,Vol) */

  0x75, 0x07,                   /* REPORT_SIZE (7) */
  0x81, 0x83,                   /* INPUT (Cnst,Var,Abs,Vol) */
  0x85, KEY_REPORT_ID,          /* REPORT_ID (2) */

  0x75, 0x07,                   /* REPORT_SIZE (7) */
  0xb1, 0x83,                   /* FEATURE (Cnst,Var,Abs,Vol) */
  /* 114 */

  /* Tamper Push Button */
  0x85, TAMPER_REPORT_ID,       /* REPORT_ID (6) */
  0x09, 0x06,                   /* USAGE (Tamper Push Button) */
  0x15, 0x00,                   /* LOGICAL_MINIMUM (0) */
  0x25, 0x01,                   /* LOGICAL_MAXIMUM (1) */
  0x75, 0x01,                   /* REPORT_SIZE (1) */
  0x81, 0x82,                   /* INPUT (Data,Var,Abs,Vol) */

  0x09, 0x06,                   /* USAGE (Tamper Push Button) */
  0x75, 0x01,                   /* REPORT_SIZE (1) */
  0xb1, 0x82,                   /* FEATURE (Data,Var,Abs,Vol) */

  0x75, 0x07,                   /* REPORT_SIZE (7) */
  0x81, 0x83,                   /* INPUT (Cnst,Var,Abs,Vol) */
  0x85, TAMPER_REPORT_ID,       /* REPORT_ID (6) */

  0x75, 0x07,                   /* REPORT_SIZE (7) */
  0xb1, 0x83,                   /* FEATURE (Cnst,Var,Abs,Vol) */
  /* 142 */

  /* ADC IN */
  0x85, ADC_REPORT_ID,          /* REPORT_ID */
  0x09, 0x07,                   /* USAGE (ADC IN) */
  0x15, 0x00,                   /* LOGICAL_MINIMUM (0) */
  0x26, 0xff, 0x00,             /* LOGICAL_MAXIMUM (255) */
  0x75, 0x08,                   /* REPORT_SIZE (8) */
  0x81, 0x82,                   /* INPUT (Data,Var,Abs,Vol) */
  0x85, ADC_REPORT_ID,          /* REPORT_ID (7) */
  0x09, 0x07,                   /* USAGE (ADC in) */
  0xb1, 0x82,                   /* FEATURE (Data,Var,Abs,Vol) */
  /* 161 */


Bu şekilde bir yapı gördüm. Bu yapıyı hiç bozmadan Benim kendi oluşturduğum projedeki fonksiyon içerisine kopyalayıp derledim. Ve bingo!!. Aygıtım Problemsiz bir şekilde PC tarafından tanınıp çalıştı.

Şimdi ben kendi oluşturduğum projede de bu fonksiyonu kendime göre düzenlemem lazım ama nasıl olacak bilmiyorum. Bu kodlar ne anlama geliyor? Report Description nasıl oluşturulur hiç bir bilgim yok.

Bunları nasıl öğrenebilirim? @Zoroaster bilgin var mı bu konularda.
Benim amacım Düz mantık PC den 64 bytelık bir paket göndereyim STM kitimden alayım. Bu kadar.. Report  Description bu iş için nasıl düzenlenir?

baran123


Mucit23

Baran Link İçin teşekkürler

@muhittin_kaplan Abi sanada video için teşekkürler. İzledim baya faydalı oldu. Şimdi biraz taşlar yerine oturmaya başladı baya şey öğrendim. HAL library'e de alıştım sayılır.

Videoyu izlemeden önce aslında bir deneme yaptım. CCS sağolsun oradaki USB çalışamlarıma bakarak USB Report Descriptor için kullanılan tanımlamaları aynen kullandım ve çalıştı. Şuanda PC'ye aşağıdaki gibi bir yapı ile veri gönderebiliyorum.

     USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, SendBuffer, 64);

Fakat veri alma işini henüz çözemedim. Ver geldiği zaman sanırım aşağıdaki fonksiyona evet düşüyor
static int8_t CUSTOM_HID_OutEvent_FS  (uint8_t event_idx, uint8_t state)
{
  return (0);
}
Fakat event_idx ve state değerlerini çözemedim. Gelen 64 byte'lık paketide alırsam USB işini Şimdilik halletmiş olurum.

baran123

#65
Sanırım orası şu şekilde olacak

        uint8_t i;
        uint8_t dataToReceive[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE];
	USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceHS.pClassData;

	for (i = 0; i < USBD_CUSTOMHID_OUTREPORT_BUF_SIZE; i++)
		dataToReceive[i] = hhid->Report_buf[i];

	if ((dataToReceive[0] == 0) && (dataToReceive[1] == 0))
		HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);

	if ((dataToReceive[0] == 0) && (dataToReceive[1] == 1))
		HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);

	if ((dataToReceive[0] == 1) && (dataToReceive[1] == 0))
		HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);

	if ((dataToReceive[0] == 1) && (dataToReceive[1] == 1))
		HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);


Ekleme :
USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef*)hUsbDeviceHS.pClassData;


Burada "HS" yerine "FS" yapman gerekecek.

Mucit23

Anladım sayılır. Bir deneme yaptım ama bir terslik var


PC den aygıtıma 64 bytelık bir paket gönderdiğim zaman CUSTOM_HID_OutEvent_FS fonksiyonu içine bir sürü olay düşüyor. Fonksiyon içerisinde muhittin hocamızın yaptığı gibi gelen paketi alıyorum. İlk gelen paket benim datalar, ama sonraki olaylar ile gelen paketler bana ait değil.