Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F107 USB-CDC
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
slavokhire5
Всем приветsm.gif Понадобилось мне поднять USB CDC на STM32F107. С ЮСБ, как и с STM32 опыта практически нет. Работаю в CooCox. Скачал STM32_USB-Host-Device_Lib_V2.1.0, накидал оттуда файлов в проект. кучу ошибок выгреб. сейчас в основном остались такого типа:
D:\code\beer\trunk\stm32f107\usb_otg_lib\usb_hcd.c:101:7: error: 'USB_OTG_CORE_HANDLE' has no member named 'host'
я подозреваю, что где-то не раскомментил какой-то дейфайн. Можете подсказать что не правильно может быть?

Прикрепляю проект
A. Fig Lee
Цитата(slavokhire5 @ Jul 11 2014, 11:46) *
Всем приветsm.gif Понадобилось мне поднять USB CDC на STM32F107. С ЮСБ, как и с STM32 опыта практически нет. Работаю в CooCox. Скачал STM32_USB-Host-Device_Lib_V2.1.0, накидал оттуда файлов в проект. кучу ошибок выгреб. сейчас в основном остались такого типа:
D:\code\beer\trunk\stm32f107\usb_otg_lib\usb_hcd.c:101:7: error: 'USB_OTG_CORE_HANDLE' has no member named 'host'
я подозреваю, что где-то не раскомментил какой-то дейфайн. Можете подсказать что не правильно может быть?

Прикрепляю проект


Ну если CDC, то host-а быть и не должно, я так понимаю.

usb_conf.h:

Код
/****************** USB OTG MODE CONFIGURATION ********************************/
//#define USE_HOST_MODE
#define USE_DEVICE_MODE
//#define USE_OTG_MODE
slavokhire5
Цитата(A. Fig Lee @ Jul 11 2014, 20:37) *
Ну если CDC, то host-а быть и не должно, я так понимаю.

usb_conf.h:

Код
/****************** USB OTG MODE CONFIGURATION ********************************/
//#define USE_HOST_MODE
#define USE_DEVICE_MODE
//#define USE_OTG_MODE



у меня так и выставлено sad.gif
A. Fig Lee
Цитата(slavokhire5 @ Jul 12 2014, 08:26) *
у меня так и выставлено sad.gif

А кто и откуда тогда обращается к хосту?
У меня тоже СТМ32107, тоже USB-CDC, все работает.

В Кокосе там баги, кстати..
Да, hcd.c файл у меня не подключен:

slavokhire5
Цитата(A. Fig Lee @ Jul 12 2014, 16:54) *
А кто и откуда тогда обращается к хосту?
У меня тоже СТМ32107, тоже USB-CDC, все работает.

В Кокосе там баги, кстати..
Да, hcd.c файл у меня не подключен:



Можете показать все файлы, которые вы использовали для подключения USB? Я подключил все, что у вас на скрине есть (+ соответствующие h-файлы), добавил usb_conf.h и usbd_conf.h, проект собрался, но никакого нового устройства компьюетр не обнаружил. Я так понимаю, не хватает еще usb_conf.h/c, но его подключение тянет за собой еще кучу файлов sad.gif
slavokhire5
Собрал проект на основе этой статьи: http://www.promelec.ru/support/prom/usb-virtual/
частоту PLL/2 вывожу на МСО. Осциллограф показывает 24МГц. USB_Prescaler выставил в значение div2, т.е. итоговая частота на модуль USB должна выйти 48МГц. Комп ничего по-прежнему не видит sad.gif
Может в железе что не так? На плате стоит разъем USB-B, от компа беру землю, USB_DM и USB_DP. Завожу их через 22 Ом на РА11 и РА12 соответственно. PA10 через 10к повешен на землю. Линия USB_DP через 1.5к подтянута к 3V3. На DP вижу 3.2В, на DM 4.6. Никаких посылок невидно sad.gif
A. Fig Lee
Цитата(slavokhire5 @ Jul 14 2014, 03:51) *
Можете показать все файлы, которые вы использовали для подключения USB? Я подключил все, что у вас на скрине есть (+ соответствующие h-файлы), добавил usb_conf.h и usbd_conf.h, проект собрался, но никакого нового устройства компьюетр не обнаружил. Я так понимаю, не хватает еще usb_conf.h/c, но его подключение тянет за собой еще кучу файлов sad.gif

У меня не тянет:

CODE
/**
******************************************************************************
* @file usb_conf.h
* @author MCD Application Team
* @version V1.1.0
* @date 19-March-2012
* @brief General low level driver configuration
******************************************************************************
* @attention
*
* <h2><center>&copy; COPYRIGHT 2012 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.
*
******************************************************************************
*/

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USB_CONF__H__
#define __USB_CONF__H__

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#if 0
#include "stm3210c_eval.h"
#include "stm3210c_eval_lcd.h"
#include "stm3210c_eval_ioe.h"
#include "stm3210c_eval_spi_sd.h"
#endif


/** @addtogroup USB_OTG_DRIVER
* @{
*/

/** @defgroup USB_CONF
* @brief USB low level driver configuration file
* @{
*/

/** @defgroup USB_CONF_Exported_Defines
* @{
*/

/* USB Core and PHY interface configuration.
Tip: To avoid modifying these defines each time you need to change the USB
configuration, you can declare the needed define in your toolchain
compiler preprocessor.
*/
/****************** USB OTG FS PHY CONFIGURATION *******************************
* The USB OTG FS Core supports one on-chip Full Speed PHY.
*
* The USE_EMBEDDED_PHY symbol is defined in the project compiler preprocessor
* when FS core is used.
*******************************************************************************/
#ifndef USE_USB_OTG_FS
#define USE_USB_OTG_FS
#endif /* USE_USB_OTG_FS */

#ifdef USE_USB_OTG_FS
#define USB_OTG_FS_CORE
#endif

/****************** USB OTG HS PHY CONFIGURATION *******************************
* The USB OTG HS Core supports two PHY interfaces:
* (i) An ULPI interface for the external High Speed PHY: the USB HS Core will
* operate in High speed mode
* (ii) An on-chip Full Speed PHY: the USB HS Core will operate in Full speed mode
*
* You can select the PHY to be used using one of these two defines:
* (i) USE_ULPI_PHY: if the USB OTG HS Core is to be used in High speed mode
* (ii) USE_EMBEDDED_PHY: if the USB OTG HS Core is to be used in Full speed mode
*
* Notes:
* - The USE_ULPI_PHY symbol is defined in the project compiler preprocessor as
* default PHY when HS core is used.
* - On STM322xG-EVAL and STM324xG-EVAL boards, only configuration(i) is available.
* Configuration (ii) need a different hardware, for more details refer to your
* STM32 device datasheet.
*******************************************************************************/
#ifndef USE_USB_OTG_HS
//#define USE_USB_OTG_HS
#endif /* USE_USB_OTG_HS */

#ifndef USE_ULPI_PHY
//#define USE_ULPI_PHY
#endif /* USE_ULPI_PHY */

#ifndef USE_EMBEDDED_PHY
//#define USE_EMBEDDED_PHY
#endif /* USE_EMBEDDED_PHY */

#ifdef USE_USB_OTG_HS
#define USB_OTG_HS_CORE
#endif

/*******************************************************************************
* FIFO Size Configuration in Device mode
*
* (i) Receive data FIFO size = RAM for setup packets +
* OUT endpoint control information +
* data OUT packets + miscellaneous
* Space = ONE 32-bits words
* --> RAM for setup packets = 10 spaces
* (n is the nbr of CTRL EPs the device core supports)
* --> OUT EP CTRL info = 1 space
* (one space for status information written to the FIFO along with each
* received packet)
* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces
* (MINIMUM to receive packets)
* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces
* (if high-bandwidth EP is enabled or multiple isochronous EPs)
* --> miscellaneous = 1 space per OUT EP
* (one space for transfer complete status information also pushed to the
* FIFO with each endpoint's last packet)
*
* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for
* that particular IN EP. More space allocated in the IN EP Tx FIFO results
* in a better performance on the USB and can hide latencies on the AHB.
*
* (iii) TXn min size = 16 words. (n : Transmit FIFO index)
* (iv) When a TxFIFO is not used, the Configuration should be as follows:
* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes)
* --> Txm can use the space allocated for Txn.
* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes)
* --> Txn should be configured with the minimum space of 16 words
* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top
* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones.
* (vi) In HS case 12 FIFO locations should be reserved for internal DMA registers
* so total FIFO size should be 1012 Only instead of 1024
*******************************************************************************/

/****************** USB OTG HS CONFIGURATION **********************************/
#ifdef USB_OTG_HS_CORE
#define RX_FIFO_HS_SIZE 512
#define TX0_FIFO_HS_SIZE 64
#define TX1_FIFO_HS_SIZE 372
#define TX2_FIFO_HS_SIZE 64
#define TX3_FIFO_HS_SIZE 0
#define TX4_FIFO_HS_SIZE 0
#define TX5_FIFO_HS_SIZE 0

// #define USB_OTG_HS_SOF_OUTPUT_ENABLED

#ifdef USE_ULPI_PHY
#define USB_OTG_ULPI_PHY_ENABLED
#endif
#ifdef USE_EMBEDDED_PHY
#define USB_OTG_EMBEDDED_PHY_ENABLED
/* wakeup is working only when HS core is configured in FS mode */
#define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT
#endif
/* #define USB_OTG_HS_INTERNAL_DMA_ENABLED */ /* Be aware that enabling DMA mode will result in data being sent only by
multiple of 4 packet sizes. This is due to the fact that USB DMA does
not allow sending data from non word-aligned addresses.
For this specific application, it is advised to not enable this option
unless required. */
#define USB_OTG_HS_DEDICATED_EP1_ENABLED
#endif

/****************** USB OTG FS CONFIGURATION **********************************/
#ifdef USB_OTG_FS_CORE
#define RX_FIFO_FS_SIZE 128
#define TX0_FIFO_FS_SIZE 32
#define TX1_FIFO_FS_SIZE 128
#define TX2_FIFO_FS_SIZE 32
#define TX3_FIFO_FS_SIZE 0

// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
// #define USB_OTG_FS_SOF_OUTPUT_ENABLED
#endif

/****************** USB OTG MISC CONFIGURATION ********************************/
#define VBUS_SENSING_ENABLED

/****************** USB OTG MODE CONFIGURATION ********************************/
//#define USE_HOST_MODE
#define USE_DEVICE_MODE
//#define USE_OTG_MODE

#ifndef USB_OTG_FS_CORE
#ifndef USB_OTG_HS_CORE
#error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined"
#endif
#endif

#ifndef USE_DEVICE_MODE
#ifndef USE_HOST_MODE
#error "USE_DEVICE_MODE or USE_HOST_MODE should be defined"
#endif
#endif

#ifndef USE_USB_OTG_HS
#ifndef USE_USB_OTG_FS
#error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined"
#endif
#else //USE_USB_OTG_HS
#ifndef USE_ULPI_PHY
#ifndef USE_EMBEDDED_PHY
#error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined"
#endif
#endif
#endif

/****************** C Compilers dependant keywords ****************************/
/* In HS mode and when the DMA is used, all variables and data structures dealing
with the DMA during the transaction process should be 4-bytes aligned */
#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED
#if defined (__GNUC__) /* GNU Compiler */
#define __ALIGN_END __attribute__ ((aligned (4)))
#define __ALIGN_BEGIN
#else
#define __ALIGN_END
#if defined (__CC_ARM) /* ARM Compiler */
#define __ALIGN_BEGIN __align(4)
#elif defined (__ICCARM__) /* IAR Compiler */
#define __ALIGN_BEGIN
#elif defined (__TASKING__) /* TASKING Compiler */
#define __ALIGN_BEGIN __align(4)
#endif /* __CC_ARM */
#endif /* __GNUC__ */
#else
#define __ALIGN_BEGIN
#define __ALIGN_END
#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */

/* __packed keyword used to decrease the data type alignment to 1-byte */
#if defined (__CC_ARM) /* ARM Compiler */
#define __packed __packed
#elif defined (__ICCARM__) /* IAR Compiler */
#define __packed __packed
#elif defined ( __GNUC__ ) /* GNU Compiler */
#define __packed __attribute__ ((__packed__))
#elif defined (__TASKING__) /* TASKING Compiler */
#define __packed __unaligned
#endif /* __CC_ARM */

/**
* @}
*/


/** @defgroup USB_CONF_Exported_Types
* @{
*/
/**
* @}
*/


/** @defgroup USB_CONF_Exported_Macros
* @{
*/
/**
* @}
*/

/** @defgroup USB_CONF_Exported_Variables
* @{
*/
/**
* @}
*/

/** @defgroup USB_CONF_Exported_FunctionsPrototype
* @{
*/
/**
* @}
*/


#endif //__USB_CONF__H__


/**
* @}
*/

/**
* @}
*/

/************************ © COPYRIGHT STMicroelectronics *****END OF FILE****/


Цитата(slavokhire5 @ Jul 14 2014, 06:31) *
Собрал проект на основе этой статьи: http://www.promelec.ru/support/prom/usb-virtual/
частоту PLL/2 вывожу на МСО. Осциллограф показывает 24МГц. USB_Prescaler выставил в значение div2, т.е. итоговая частота на модуль USB должна выйти 48МГц. Комп ничего по-прежнему не видит sad.gif
Может в железе что не так? На плате стоит разъем USB-B, от компа беру землю, USB_DM и USB_DP. Завожу их через 22 Ом на РА11 и РА12 соответственно. PA10 через 10к повешен на землю. Линия USB_DP через 1.5к подтянута к 3V3. На DP вижу 3.2В, на DM 4.6. Никаких посылок невидно sad.gif


Нет, USB_DP у меня никуда не подтянута. PA10 работает на выход.
Можно поставить Device Studio посмотреть что творится на USB
slavokhire5
*я имел ввиду не usb_config.h/c, a hw_config.h/c. Там устанавливается тактирование USB. Его же нужно подключать?
Поставил HDD device monitoring studio, она видит не больше, чем винда - только стандартные устройства, на подключение-отключение платы с STM никак не реагирует.
Может проблема в выводах ID? на плате установлен USB-B (большой такой разъем, как на принтере), там нет ID-вывода

A. Fig Lee
Цитата(slavokhire5 @ Jul 14 2014, 07:48) *
*я имел ввиду не usb_config.h/c, a hw_config.h/c. Там устанавливается тактирование USB. Его же нужно подключать?
Поставил HDD device monitoring studio, она видит не больше, чем винда - только стандартные устройства, на подключение-отключение платы с STM никак не реагирует.
Может проблема в выводах ID? на плате установлен USB-B (большой такой разъем, как на принтере), там нет ID-вывода

у меня в проекте нет такого файла. Все что есть по USB, в картинке которую я привел.
Вы уверены, что резистор подтяжки на DP нужен?
slavokhire5
перевел код на stm32f4discovery, там работает. видимо железные проблемы. sm.gif резистор подтяжки снял, стала одна линия в "0", другая в "1", на дискавери тоже так, только там еще посылки по линиям бегают. у меня же посылок никаких по-прежнему нет.
*CDC это же device режим? т.е. мне нужно на МК заводить линию VBus от USB? а то у меня просто заведено DP, DM от USB и нога, которая отвечает за ID, повешена в "0" через резистор (на разъем не идет)
A. Fig Lee
Цитата(slavokhire5 @ Jul 14 2014, 10:11) *
перевел код на stm32f4discovery, там работает. видимо железные проблемы. sm.gif резистор подтяжки снял, стала одна линия в "0", другая в "1", на дискавери тоже так, только там еще посылки по линиям бегают. у меня же посылок никаких по-прежнему нет.
*CDC это же device режим? т.е. мне нужно на МК заводить линию VBus от USB? а то у меня просто заведено DP, DM от USB и нога, которая отвечает за ID, повешена в "0" через резистор (на разъем не идет)


Да, по моему это оно! Надо питание USB на PA9 подать.
Тогда STM32 увидит питание и начнет дрыгатся. По моему так.
slavokhire5
Завел VBus на PA9, ситуация не поменялась. Может что не так в инициализации ног USB на моем 107?
Вот код:
Код
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA , ENABLE);
  RCC_OTGFSCLKConfig(RCC_OTGFSCLKSource_PLLVCO_Div2);
  
  /* Configure SOF VBUS ID DM DP Pins */
  GPIO_InitStructure.GPIO_Pin = /*GPIO_Pin_8  |*/
    GPIO_Pin_9  |
      GPIO_Pin_11 |
        GPIO_Pin_12;
  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
  
  /*GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG_FS);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_OTG_FS);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG_FS);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG_FS);*/
  
  /* this for ID line debug */

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;
  /*GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; */
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
  //GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG_FS);

  //RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  //RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE);

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_OTG_FS, ENABLE);


Закомменченые части остались от F407. Установка частоты. Кварц стоит на 24МГц. Результирующая SysClk меньше 72 МГц, но на USB должно подаваться 48:
Код
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/    
  /* Enable HSE */    
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer */
    FLASH->ACR |= FLASH_ACR_PRFTBE;

    /* Flash 2 wait state */
    FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
    FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;    


    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK2 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;
    
    /* PCLK1 = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2;

#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: HSE / 4 = 6 */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_HSE | RCC_CFGR2_PREDIV1_DIV4);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
    
  
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL6);
#else    
    /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
                                        RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
#endif /* STM32F10X_CL */

    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }
    
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;    

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }
}


Ну и еще остается вариант подгоревшего USB на МК sad.gif
A. Fig Lee
Цитата(slavokhire5 @ Jul 15 2014, 03:33) *
Завел VBus на PA9, ситуация не поменялась. Может что не так в инициализации ног USB на моем 107?
Вот код:
Код
  
#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: HSE / 4 = 6 */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_HSE | RCC_CFGR2_PREDIV1_DIV4);

....

/* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL6);


Ну и еще остается вариант подгоревшего USB на МК sad.gif


Не нравится мне эта часть кода.
Кварц имеем на 24 МГц.
Смотри Fig. 11 из Reference Manual RM008:
1) Выбираем 24 Mгц клок (RCC_CFGR2_PREDIV1SRC_HSE)
2) Делим 24/4 = 6MГц (RCC_CFGR2_PREDIV1_DIV4)
3) Умножжаем на 6 (RCC_CFGR_PLLMULL6) - получаем частоту 36 МГц для USB???
Я чтото пропустил? Внутрення тоже не 72 будет.

Надо как минимум RCC_CFGR_PLLMULL8 вместо RCC_CFGR_PLLMULL6.

Но лучше и другие клоки подровнять.
slavokhire5
Цитата(A. Fig Lee @ Jul 15 2014, 14:13) *
Не нравится мне эта часть кода.
Кварц имеем на 24 МГц.
Смотри Fig. 11 из Reference Manual RM008:
1) Выбираем 24 Mгц клок (RCC_CFGR2_PREDIV1SRC_HSE)
2) Делим 24/4 = 6MГц (RCC_CFGR2_PREDIV1_DIV4)
3) Умножжаем на 6 (RCC_CFGR_PLLMULL6) - получаем частоту 36 МГц для USB???
Я чтото пропустил? Внутрення тоже не 72 будет.

Надо как минимум RCC_CFGR_PLLMULL8 вместо RCC_CFGR_PLLMULL6.

Но лучше и другие клоки подровнять.


Поставил кварц на 25МГц, поменял настройку клоков. Вроде как по даташиту (в конце даташита табличка есть с рекомендуемыми значениями):
Код
#ifdef STM32F10X_CL
    /* Configure PLLs ------------------------------------------------------*/
    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    /* PREDIV1 configuration: HSE / 4 = 6 */
        
    RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL |
                              RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC);
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
  
    /* Enable PLL2 */
    RCC->CR |= RCC_CR_PLL2ON;
    /* Wait till PLL2 is ready */
    while((RCC->CR & RCC_CR_PLL2RDY) == 0)
    {
    }
    
  
    /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */
    RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL);
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 |
                            RCC_CFGR_PLLMULL9);

на МСО вывожу частоту RCC_MCO_PLLCLK_Div2, вижу 36.00хх МГц. следовательно на USB_Prescaler поступает частота 144 МГц. я ее делю на 3. результат тот же - тишина.

Полез по регистрам USB, меня смущает установленный в "1" бит MMIS (Mode mismatch interrupt). я так понимаю, что это нехорошо. Как бы отловить, почему он ставится
A. Fig Lee
Цитата(slavokhire5 @ Jul 15 2014, 08:44) *
Поставил кварц на 25МГц, поменял настройку клоков. Вроде как по даташиту (в конце даташита табличка есть с рекомендуемыми значениями):

Полез по регистрам USB, меня смущает установленный в "1" бит MMIS (Mode mismatch interrupt). я так понимаю, что это нехорошо. Как бы отловить, почему он ставится

Да, с частотой хорошо. Вот и USB начал ругатся:

Цитата
When the OTG_FS controller is operating in one mode, either device or host, the application
must not access registers from the other mode. If an illegal access occurs, a mode
mismatch interrupt is generated and reflected in the Core interrupt register (MMIS bit in the
OTG_FS_GINTSTS register).


То бишь, 2 мода как минимум задействованы: девайс и хост получается?
Похоже на программный косяк. Если никаких резисторов на DP, DM нет.
slavokhire5
а у вас объявлен #define VBUS_SENSING_ENABLED? если да, то в каком файле? а то я на PA9 VBus завел, но VBUS_SENSING_ENABLED у меня запрещен и не нашел где объявлять правильно
A. Fig Lee
usb_conf.h

Цитата
...
/****************** USB OTG FS CONFIGURATION **********************************/
#ifdef USB_OTG_FS_CORE
#define RX_FIFO_FS_SIZE 128
#define TX0_FIFO_FS_SIZE 32
#define TX1_FIFO_FS_SIZE 128
#define TX2_FIFO_FS_SIZE 32
#define TX3_FIFO_FS_SIZE 0

// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT
// #define USB_OTG_FS_SOF_OUTPUT_ENABLED
#endif

/****************** USB OTG MISC CONFIGURATION ********************************/
#define VBUS_SENSING_ENABLED
...
slavokhire5
Были "железные" проблемы в плате. Достал плату stm32p107, залил в нее пример отсюда: http://cxem.net/mc/mc269.php
работает sm.gif у меня разъем USB коротил как-то по-хитрому, USB работал только в одном положении кабеля, хотя вроде все очень крепко держалось. Завтра переберу проект под CooCox и выложу, вдруг кому пригодится sm.gif
slavokhire5
что-то задержался с выкладыванием ...
прикрепляю проект с USB CDC под RTOS, выдернул его из живого проекта, кое-что осталось лишнего, комментов правда нету sm.gif
slavokhire5
Подскажите пожалуйста, как узнать, отправились ли данные по USB_CSC?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.