Estoy aprendiendo sobre las clases de USB usando STM32F429ZI (en la placa Discovery). Ya traté de implementar la clase de dispositivo de comunicaciones (CDC) y funcionó bien, ahora traté de hacer una prueba simple con la clase de dispositivo de audio.
Estoy usando CubeMX para generar un proyecto, elegí Audio Device Class allí, creó archivos de biblioteca predeterminados. uVision cumplió sin errores ni advertencias. Mostré mi MCU y en el administrador de dispositivos se ve así:
Después de aprender sobre CDC USB, supe que necesitaba aumentar Stack_Size y Heap_Size en el archivo de inicio. Lo probé - nada cambia. También encontré algunos consejos para disminuir HS_MAX_PACKET_SIZE, aún sin efecto.
Bueno, las preguntas son:
El error debajo del dispositivo es simplemente un error genérico "Este dispositivo no puede iniciarse".
EDIT 1
En realidad, no sé qué tipo de código adjuntar, ya que todo se genera con CubeMX. Puedo dar fragmentos a pedido, si es necesario.
Descripción del dispositivo USB generada por CubeMX.
#define USBD_VID 1155
#define USBD_LANGID_STRING 1033
#define USBD_MANUFACTURER_STRING "STMicroelectronics"
#define USBD_PID_HS 22336
#define USBD_PRODUCT_STRING_HS "STM32 Audio Class"
/* USER CODE BEGIN SERIALNUMBER_STRING_HS */
#define USBD_SERIALNUMBER_STRING_HS "00000000001A"
/* USER CODE END SERIALNUMBER_STRING_HS */
#define USBD_CONFIGURATION_STRING_HS "AUDIO Config"
#define USBD_INTERFACE_STRING_HS "AUDIO Interface"
#define USB_SIZ_BOS_DESC 0x0C
EDIT 2
Descubrí que USBD_AUDIO_Init() no se llama en ningún lugar de forma predeterminada y este puede ser el problema. Pero tengo problemas para entender cómo puedo llamarlo cuando es "Static uint8_t", por lo que básicamente no se puede llamar desde main. Aquí está la descripción:
usbd_audio.c
/**
* @brief USBD_AUDIO_Init
* Initialize the AUDIO interface
* @param pdev: device instance
* @param cfgidx: Configuration index
* @retval status
*/
static uint8_t USBD_AUDIO_Init (USBD_HandleTypeDef *pdev,
uint8_t cfgidx)
{
bunch of code
}
¿Has probado esta función?
USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id)
La documentación de esta biblioteca se encuentra aquí , pero no es excelente. En general, el HAL le brinda algunas funciones y, si las usa correctamente, muchas otras cosas suceden detrás de escena. Su USBD_AUDIO_Init puede ser una de esas cosas.
Verifique USBD_malloc()
las USBD_AUDIO_Init()
asignaciones de memoria solicitada. USBD_AUDIO_HandleTypeDef
contiene:
buffer[AUDIO_TOTAL_BUF_SIZE]
AUDIO_TOTAL_BUF_SIZE = AUDIO_OUT_PACKET * AUDIO_OUT_PACKET_NUM
AUDIO_OUT_PACKET_NUM = 80
AUDIO_OUT_PACKET = (22100 * 2 * 2)/1000
Entonces, el tamaño total de asignación de memoria es de aproximadamente 7100 bytes. Configuré el tamaño del montón en el proyecto CubeMx 10KB (2800h). Después de eso, Windows (yo uso win10) reconoce stm32f4 como dispositivo de audio.
En el administrador de dispositivos, haga clic derecho en el dispositivo de puerto COM virtual y desinstale el dispositivo. Marque eliminar el software del controlador para este dispositivo. Reinicie el dispositivo. Ahora Windows debería instalar el controlador para la clase de dispositivo de audio USB.
Deberá cambiar el PID del nuevo dispositivo. O su dispositivo de audio tendrá el mismo PID que el dispositivo CDC anterior. El sistema reconocerá esos dos dispositivos como el mismo entonces.
Kevin nieve