STM32F10x USB Library Problemi

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

Mucit23

Daha önce STM32F10X de USB HID çalıştıran oldumu.

Şuradaki ST'nin UM0424 kodlu kütüphanesini indiriyorum.
http://www.st.com/web/en/catalog/tools/PF258157#
Ama kütüphaneyi ekleyemedim bir türlü kendi projeme. bir sürü hata alıyorum. Kütüphaneyi eklemek için izleyebileceğim bir klavuz varmı? Veya STM32F103 için yazılmış bir örnek program olsa çok güzel olacak.

LukeSkywalker

MikroC altinda hid kullandim   stm32f103c8 ile.

Mucit23

MikroC olmaz hocam keil kullanıyorum.

diot

32f407 discovery kitinde usb hid örnekleri var indirip inceleyebilirisiniz.

Mucit23

Hocam benzer örnekler stm32f10x icinde var. Aslinda Stm32f10x için indirdiğim usb kutuphanesinin içindeki örneklere bakıyorum.  Bu örnekleri benim projeye dahil etmeye çalışıyorum.  Fakat bu kodlar stnin eval boardlari için hazırlanmış.  Farklı model işlemciler için hazirlandigindan benim stm32f103ve de zilyon tane hata alıyorum.   Şöyle herhangi bir board için özel olarak hazırlanmamış örnek varmı.  USB HID  uygulaması yapacam

Mucit23

#5
ST'nin USB library'si içerisindeki USB Joystick Mouse örneğinden yola çıkarak kütüphaneyi kendime göre sadeleştirmeye çalıştım. Orjinal uygulamada ST'nin kendi EVALboardları için tanımlamalar vardı. Hatalarınbüyük bir kısmı bunlardanmış. Bunları kendi programıma göre düzenledim. En son bir hata veriyor çözemedim. Hata metni budur.

Alıntı Yaplinking...
.\Objects\USB_Test.axf: Error: L6200E: Symbol NOP_Process multiply defined (by usb_endp.o and usb_core.o).
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 0 warning and 1 error messages.
".\Objects\USB_Test.axf" - 1 Error(s), 0 Warning(s).
Target not created.

Buradaki hatayı çözemedim bir türlü. usb_core.c içerisinde NOP_Process adında bir fonksiyon var. Ama fonksiyon tanımlamasında vs bir hata yok. Dün bayağı uğraştım ama bir türlü hatayı gideremedim. Yeterli bilgi yok diyor? Nereyi bilgilendireceğim anlamadım. Fikri olan varmı?

JKramer

Hatada yazdığı gibi, bir tane de usb_endp.c içinde varmış. O dosyayı bir inceleyin.

justice_for_all

#7
bir header dosyasını iki kez include yapmaktan olabilirmi o hata?

mesaj birleştirme:: 08 Temmuz 2015, 11:14:31

usb_core.h dosyasında fonksiyon prototipinin başına extern ekleyin bakalım hata gidecekmi?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

Evet aslında dolaylı olarak ondanmış.

Aslında usb_endp. içerisine ben kendim  EP1_OUT_Callback fonksiyonunu ekledim. Normalde usb_endp.c içerisinde NOP_Process fonksiyonuna yönelik bir tanımlama yokmuş. Herneyse Projenin tümünde NOP_Process kelimesini arattım. Sonunda usb_conf.h aşağıdaki tanımlamaları farkettim.
/* CTR service routines */
/* associated to defined endpoints */
//#define  EP1_IN_Callback   NOP_Process*/
#define  EP2_IN_Callback   NOP_Process
#define  EP3_IN_Callback   NOP_Process
#define  EP4_IN_Callback   NOP_Process
#define  EP5_IN_Callback   NOP_Process
#define  EP6_IN_Callback   NOP_Process
#define  EP7_IN_Callback   NOP_Process

//#define  EP1_OUT_Callback   NOP_Process
#define  EP2_OUT_Callback   NOP_Process
#define  EP3_OUT_Callback   NOP_Process
#define  EP4_OUT_Callback   NOP_Process
#define  EP5_OUT_Callback   NOP_Process
#define  EP6_OUT_Callback   NOP_Process
#define  EP7_OUT_Callback   NOP_Process


usb_endp.c içerisinde hangi fonksiyonu tanımlarsan yukarıdaki kodlarda o fonksiyona ait satırı kapatmak gerekiyormuş. Bende EP1_IN_Callback tanımlıydı. EP1_OUT_Callback fonksiyonunuda kendim kapatınca hatasız derlendi.

Şimdi Başka bir problem var. USB kütüphanesinin nasıl kullanılacağını bilmiyorum. usb_prob.c dosyası var. Kütüphaneyi USB_Mouse Joystick programından aldığım için usb_prop.c içerisinde ona mouse için gerekli tanımlamalar var
/**
  ******************************************************************************
  * @file    usb_prop.c
  * @author  MCD Application Team
  * @version V4.0.0
  * @date    21-January-2013
  * @brief   All processing related to Joystick Mouse Demo
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software 
  * distributed under the License is distributed on an "AS IS" BASIS, 
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */


/* Includes ------------------------------------------------------------------*/
#include "usb_lib.h"
#include "usb_conf.h"
#include "usb_prop.h"
#include "usb_desc.h"
#include "usb_pwr.h"
#include "hw_config.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
uint32_t ProtocolValue;

/* -------------------------------------------------------------------------- */
/*  Structures initializations */
/* -------------------------------------------------------------------------- */

DEVICE Device_Table =
  {
    EP_NUM,
    1
  };

DEVICE_PROP Device_Property =
  {
    Joystick_init,
    Joystick_Reset,
    Joystick_Status_In,
    Joystick_Status_Out,
    Joystick_Data_Setup,
    Joystick_NoData_Setup,
    Joystick_Get_Interface_Setting,
    Joystick_GetDeviceDescriptor,
    Joystick_GetConfigDescriptor,
    Joystick_GetStringDescriptor,
    0,
    0x40 /*MAX PACKET SIZE*/
  };
USER_STANDARD_REQUESTS User_Standard_Requests =
  {
    Joystick_GetConfiguration,
    Joystick_SetConfiguration,
    Joystick_GetInterface,
    Joystick_SetInterface,
    Joystick_GetStatus,
    Joystick_ClearFeature,
    Joystick_SetEndPointFeature,
    Joystick_SetDeviceFeature,
    Joystick_SetDeviceAddress
  };

ONE_DESCRIPTOR Device_Descriptor =
  {
    (uint8_t*)Joystick_DeviceDescriptor,
    JOYSTICK_SIZ_DEVICE_DESC
  };

ONE_DESCRIPTOR Config_Descriptor =
  {
    (uint8_t*)Joystick_ConfigDescriptor,
    JOYSTICK_SIZ_CONFIG_DESC
  };

ONE_DESCRIPTOR Joystick_Report_Descriptor =
  {
    (uint8_t *)Joystick_ReportDescriptor,
    JOYSTICK_SIZ_REPORT_DESC
  };

ONE_DESCRIPTOR Mouse_Hid_Descriptor =
  {
    (uint8_t*)Joystick_ConfigDescriptor + JOYSTICK_OFF_HID_DESC,
    JOYSTICK_SIZ_HID_DESC
  };

ONE_DESCRIPTOR String_Descriptor[4] =
  {
    {(uint8_t*)Joystick_StringLangID, JOYSTICK_SIZ_STRING_LANGID},
    {(uint8_t*)Joystick_StringVendor, JOYSTICK_SIZ_STRING_VENDOR},
    {(uint8_t*)Joystick_StringProduct, JOYSTICK_SIZ_STRING_PRODUCT},
    {(uint8_t*)Joystick_StringSerial, JOYSTICK_SIZ_STRING_SERIAL}
  };

/* Extern variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Extern function prototypes ------------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : Joystick_init.
* Description    : Joystick Mouse init routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_init(void)
{

  /* Update the serial number string descriptor with the data from the unique
  ID*/
 // Get_SerialNum();

  pInformation->Current_Configuration = 0;
  /* Connect the device */
  PowerOn();

  /* Perform basic device initialization operations */
  USB_SIL_Init();

  bDeviceState = UNCONNECTED;
}

/*******************************************************************************
* Function Name  : Joystick_Reset.
* Description    : Joystick Mouse reset routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_Reset(void)
{
  /* Set Joystick_DEVICE as not configured */
  pInformation->Current_Configuration = 0;
  pInformation->Current_Interface = 0;/*the default Interface*/

  /* Current Feature initialization */
  pInformation->Current_Feature = Joystick_ConfigDescriptor[7];
  SetBTABLE(BTABLE_ADDRESS);
  /* Initialize Endpoint 0 */
  SetEPType(ENDP0, EP_CONTROL);
  SetEPTxStatus(ENDP0, EP_TX_STALL);
  SetEPRxAddr(ENDP0, ENDP0_RXADDR);
  SetEPTxAddr(ENDP0, ENDP0_TXADDR);
  Clear_Status_Out(ENDP0);
  SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
  SetEPRxValid(ENDP0);

  /* Initialize Endpoint 1 */
  SetEPType(ENDP1, EP_INTERRUPT);
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  SetEPTxCount(ENDP1, 4);
  SetEPRxStatus(ENDP1, EP_RX_DIS);
  SetEPTxStatus(ENDP1, EP_TX_NAK);

  /* Set this device to response on default address */
  SetDeviceAddress(0);
  bDeviceState = ATTACHED;
}
/*******************************************************************************
* Function Name  : Joystick_SetConfiguration.
* Description    : Update the device state to configured.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_SetConfiguration(void)
{
  DEVICE_INFO *pInfo = &Device_Info;

  if (pInfo->Current_Configuration != 0)
  {
    /* Device configured */
    bDeviceState = CONFIGURED;
  }
}
/*******************************************************************************
* Function Name  : Joystick_SetConfiguration.
* Description    : Update the device state to addressed.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_SetDeviceAddress (void)
{
  bDeviceState = ADDRESSED;
}
/*******************************************************************************
* Function Name  : Joystick_Status_In.
* Description    : Joystick status IN routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_Status_In(void)
{}

/*******************************************************************************
* Function Name  : Joystick_Status_Out
* Description    : Joystick status OUT routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Joystick_Status_Out (void)
{}

/*******************************************************************************
* Function Name  : Joystick_Data_Setup
* Description    : Handle the data class specific requests.
* Input          : Request Nb.
* Output         : None.
* Return         : USB_UNSUPPORT or USB_SUCCESS.
*******************************************************************************/
RESULT Joystick_Data_Setup(uint8_t RequestNo)
{
  uint8_t *(*CopyRoutine)(uint16_t);

  CopyRoutine = NULL;
  if ((RequestNo == GET_DESCRIPTOR)
      && (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
      && (pInformation->USBwIndex0 == 0))
  {
    if (pInformation->USBwValue1 == REPORT_DESCRIPTOR)
    {
      CopyRoutine = Joystick_GetReportDescriptor;
    }
    else if (pInformation->USBwValue1 == HID_DESCRIPTOR_TYPE)
    {
      CopyRoutine = Joystick_GetHIDDescriptor;
    }

  } /* End of GET_DESCRIPTOR */

  /*** GET_PROTOCOL ***/
  else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
           && RequestNo == GET_PROTOCOL)
  {
    CopyRoutine = Joystick_GetProtocolValue;
  }
  if (CopyRoutine == NULL)
  {
    return USB_UNSUPPORT;
  }
  pInformation->Ctrl_Info.CopyData = CopyRoutine;
  pInformation->Ctrl_Info.Usb_wOffset = 0;
  (*CopyRoutine)(0);
  return USB_SUCCESS;
}

/*******************************************************************************
* Function Name  : Joystick_NoData_Setup
* Description    : handle the no data class specific requests
* Input          : Request Nb.
* Output         : None.
* Return         : USB_UNSUPPORT or USB_SUCCESS.
*******************************************************************************/
RESULT Joystick_NoData_Setup(uint8_t RequestNo)
{
  if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
      && (RequestNo == SET_PROTOCOL))
  {
    return Joystick_SetProtocol();
  }

  else
  {
    return USB_UNSUPPORT;
  }
}

/*******************************************************************************
* Function Name  : Joystick_GetDeviceDescriptor.
* Description    : Gets the device descriptor.
* Input          : Length
* Output         : None.
* Return         : The address of the device descriptor.
*******************************************************************************/
uint8_t *Joystick_GetDeviceDescriptor(uint16_t Length)
{
  return Standard_GetDescriptorData(Length, &Device_Descriptor);
}

/*******************************************************************************
* Function Name  : Joystick_GetConfigDescriptor.
* Description    : Gets the configuration descriptor.
* Input          : Length
* Output         : None.
* Return         : The address of the configuration descriptor.
*******************************************************************************/
uint8_t *Joystick_GetConfigDescriptor(uint16_t Length)
{
  return Standard_GetDescriptorData(Length, &Config_Descriptor);
}

/*******************************************************************************
* Function Name  : Joystick_GetStringDescriptor
* Description    : Gets the string descriptors according to the needed index
* Input          : Length
* Output         : None.
* Return         : The address of the string descriptors.
*******************************************************************************/
uint8_t *Joystick_GetStringDescriptor(uint16_t Length)
{
  uint8_t wValue0 = pInformation->USBwValue0;
  if (wValue0 > 4)
  {
    return NULL;
  }
  else
  {
    return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]);
  }
}

/*******************************************************************************
* Function Name  : Joystick_GetReportDescriptor.
* Description    : Gets the HID report descriptor.
* Input          : Length
* Output         : None.
* Return         : The address of the configuration descriptor.
*******************************************************************************/
uint8_t *Joystick_GetReportDescriptor(uint16_t Length)
{
  return Standard_GetDescriptorData(Length, &Joystick_Report_Descriptor);
}

/*******************************************************************************
* Function Name  : Joystick_GetHIDDescriptor.
* Description    : Gets the HID descriptor.
* Input          : Length
* Output         : None.
* Return         : The address of the configuration descriptor.
*******************************************************************************/
uint8_t *Joystick_GetHIDDescriptor(uint16_t Length)
{
  return Standard_GetDescriptorData(Length, &Mouse_Hid_Descriptor);
}

/*******************************************************************************
* Function Name  : Joystick_Get_Interface_Setting.
* Description    : tests the interface and the alternate setting according to the
*                  supported one.
* Input          : - Interface : interface number.
*                  - AlternateSetting : Alternate Setting number.
* Output         : None.
* Return         : USB_SUCCESS or USB_UNSUPPORT.
*******************************************************************************/
RESULT Joystick_Get_Interface_Setting(uint8_t Interface, uint8_t AlternateSetting)
{
  if (AlternateSetting > 0)
  {
    return USB_UNSUPPORT;
  }
  else if (Interface > 0)
  {
    return USB_UNSUPPORT;
  }
  return USB_SUCCESS;
}

/*******************************************************************************
* Function Name  : Joystick_SetProtocol
* Description    : Joystick Set Protocol request routine.
* Input          : None.
* Output         : None.
* Return         : USB SUCCESS.
*******************************************************************************/
RESULT Joystick_SetProtocol(void)
{
  uint8_t wValue0 = pInformation->USBwValue0;
  ProtocolValue = wValue0;
  return USB_SUCCESS;
}

/*******************************************************************************
* Function Name  : Joystick_GetProtocolValue
* Description    : get the protocol value
* Input          : Length.
* Output         : None.
* Return         : address of the protocol value.
*******************************************************************************/
uint8_t *Joystick_GetProtocolValue(uint16_t Length)
{
  if (Length == 0)
  {
    pInformation->Ctrl_Info.Usb_wLength = 1;
    return NULL;
  }
  else
  {
    return (uint8_t *)(&ProtocolValue);
  }
}

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


Bu kodlara ihtiyacım yok. Benim için paket veri gönderme ve Paket veri almak için iki adet fonksiyon olması yeterli şimdilik. Bu kısmı nasıl yapacam anlamadım.

Etraftaki örnek projelere bakıyorum. Hep sağlam projeler var. Mesela bir tanesi SD kartı hafıza olarak kullanıp USB flash disk programı yazmış. Başka bir tanesi işlemcinin program hafızasında aynı işlemi yapmış!! Diğeri USB-RS232 dönüştürücü yapmış. Bunların hepsi USB kütüphanesinin içerisindeki örneklerde var. Bu projelerin hepsinde usb_prob.c dosyası yapılan işe göre yeniden düzenlenmiş. Ben ise Haliyle bu kadar kod kalabalığı içerisinde istediğimi yapmakta zorlanıyorum. Daha önce ST'nin USB kütüphanesini kullanan varmı? USB_HID bağlantısı kurup en basit şekilde PC ye paket gönderip almak için bundan sonra ne yapmam gerekiyor?


justice_for_all

#9
uint32_t USB_SIL_Init(void);
uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t wBufferSize);
uint32_t USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer);


mesaj birleştirme:: 08 Temmuz 2015, 11:44:54

bu örneği denedin mi ?
http://www.keil.com/download/files/stm32_usbhid.zip

mesaj birleştirme:: 08 Temmuz 2015, 11:59:57


...\STM32_USB-FS-Device_Lib_V4.0.0\Projects\Custom_HID\src\stm32_it.c
void DMA1_Channel1_IRQHandler(void)
{  
  Send_Buffer[0] = 0x07;
  
  if((ADC_ConvertedValueX >>4) - (ADC_ConvertedValueX_1 >>4) > 4)
  {
    if ((PrevXferComplete) && (bDeviceState == CONFIGURED))
    {
      Send_Buffer[1] = (uint8_t)(ADC_ConvertedValueX >>4);
      
      /* Write the descriptor through the endpoint */
      USB_SIL_Write(EP1_IN, (uint8_t*) Send_Buffer, 2);  
      SetEPTxValid(ENDP1);
      ADC_ConvertedValueX_1 = ADC_ConvertedValueX;
      PrevXferComplete = 0;
    }
  }
  
  DMA_ClearFlag(DMA1_FLAG_TC1);
}
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

Bu kodu ilk başta bakmıştım ama derlenmesinde nedense hata aldım. O yüzden pek ilgilenmemiştim. Hocam ben bunun üzerinde biraz çalışayım.

justice_for_all

Yukarıda verdiğim kod örneği adc ölçümlerini usbye basıyor hocam sizin kullanmak istediğiniz şekilde?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

Evet aynen öyle veri alma ve gönderme fonksiyonlarını sadeleştirmem lazım.

Mucit23

Hocam Custom HID projesini referans alarak kendi projemdeki USB kodlarını düzenledim. Şimdi Proje hatasız bir şekilde derleniyor. Programı işlemciye yüklediğimde iki adet sorun ortaya çıktı.

1. Bilgisayar USB den aygıtı görüyor. Fakat aygıt tanımlanamıyor. Unkown Device diye takılıp kalıyor.
2. Sistemde TFT ekran var. USB yi aktif edince TFT çalışmayı durduruyor. TFT'yi sürmek için herhangi bir donanım kullanılmıyor. Ayrıca DMA kesmesi vs oluşuyor.

Bu sorunların sebebi ne olabilir?  Özellikle 1. sorun sebebi hangi dosyadan kaynaklıdır? usb_desc.c dosyasına hiç karışmadım. Descriptor bilgileri Custom_HID Projesi ile aynı.

Fikri olan varmı?

justice_for_all

usb için clock ayarını ne yaptın?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay