stm32 usb做host 驱动ch340 接收数据的问题
目前可以正常枚举设备 发送数据但是接收数据这边有点问题。现在只能轮询USBH_CDC_Receive(USBH_HandleTypeDef *phost, uint8_t *pbuff, uint32_t length) 这个函数去接收数据但是没法判断啥时候来数据
而且也不进USBH_CDC_TransmitCallback(USBH_HandleTypeDef *phost)这个回调不知道为啥?大家都是怎么接收数据的
接收回调函数不进吗。 eric2013 发表于 2024-2-28 01:09
接收回调函数不进吗。
嗯现在可以进了要一直接收数据有数据来会进回调 现在有另一个问题:怎么修改ch340的波特率硬汉这个接触过吗? years 发表于 2024-2-28 10:08
嗯现在可以进了要一直接收数据有数据来会进回调 现在有另一个问题:怎么修改ch340的波特率硬汉这 ...
供参考
/*------------------------------------------------------------------------------
* MDK Middleware - Component ::USB:Host:Custom Class
* Copyright (c) 2004-2020 Arm Limited (or its affiliates). All rights reserved.
*------------------------------------------------------------------------------
* Name: USBH_PL2303.c
* Purpose: USB Host (USBH) - Custom Class - Prolific PL2303 USB to serial
* RS232 adapter driver
* Rev.: V6.3.2
*----------------------------------------------------------------------------*/
/*
* USBH_PL2303.c is a Prolific PL2303 USB to serial RS232 adapter driver
* for USB Host stack implemented as USB Host Custom Class driver.
* Prolific PL2303 USB to serial RS232 adapter is similar to the CDC device
* but using vendor specific class device with interface containing
* 1 Bulk IN, 1 Bulk OUT and 1 Interrupt IN Endpoints.
* This implementation supports only one instance.
*
* The template implements 4 callback functions called by the USB Host core
* when device is connected or disconnected, these are:
* USBH_CustomClass_Configure
* USBH_CustomClass_Unconfigure
* USBH_CustomClass_Initialize
* USBH_CustomClass_Uninitialize
*
* First to enable USB Host Controller (if not already enabled) call:
* USBH_Initialize (ctrl_num);
*/
#include <stdio.h>
#include <stdint.h>
#include "rl_usb.h"
// Interface class, subclass and protocol of the device that is supported
#define CUSTOM_CLASS_IF_CLASS USB_DEVICE_CLASS_VENDOR_SPECIFIC
#define CUSTOM_CLASS_IF_SUBCLASS 0
#define CUSTOM_CLASS_IF_PROTOCOL 0
extern
uint8_t USBH_CC_Device;
uint8_t USBH_CC_Device = 0U; // Device used for USB transfers
extern
USBH_PIPE_HANDLE USBH_CC_PipeHandle;
USBH_PIPE_HANDLE USBH_CC_PipeHandle; // Pipe Handles
/************************** Class Driver Functions ****************************/
/// \brief Analyze device configuration and configure resources
/// \param device index of USB Device.
/// \param ptr_dev_desc pointer to device descriptor.
/// \param ptr_cfg_desc pointer to configuration descriptor.
/// \return index of configured custom class device instance or configuration failed :
/// - value <= 127 : index of configured custom class device instance
/// - value 255 : configuration failed
uint8_t USBH_CustomClass_Configure (uint8_t device, const USB_DEVICE_DESCRIPTOR *ptr_dev_desc, const USB_CONFIGURATION_DESCRIPTOR *ptr_cfg_desc) {
USB_INTERFACE_DESCRIPTOR *ptr_if_desc;
USB_ENDPOINT_DESCRIPTOR*ptr_ep_desc;
USBH_PIPE_HANDLE pipe_hndl;
uint8_t num, i;
USBH_CC_Device = device; // Store device
for (i = 0U; i < 8U; i++) { // Clear all pipe handles
USBH_CC_PipeHandle = 0U;
}
ptr_if_desc = (USB_INTERFACE_DESCRIPTOR *)((uint32_t)ptr_cfg_desc + ptr_cfg_desc->bLength);
num = ptr_if_desc->bNumEndpoints; // Number of endpoints
// Supported device: - Prolific PL2303 (VID = 0x067B, PID = 0x2303)
if ((ptr_dev_desc->idVendor != 0x067BU) || (ptr_dev_desc->idProduct != 0x2303U)) {
return 255U;
}
switch (ptr_if_desc->bInterfaceClass) {
case CUSTOM_CLASS_IF_CLASS: // Interface class
switch (ptr_if_desc->bInterfaceSubClass) {
case CUSTOM_CLASS_IF_SUBCLASS: // Interface subclass
switch (ptr_if_desc->bInterfaceProtocol) {
case CUSTOM_CLASS_IF_PROTOCOL: // Interface protocol
// Create Pipes
ptr_ep_desc = (USB_ENDPOINT_DESCRIPTOR *)((uint32_t)ptr_if_desc + ptr_if_desc->bLength);
i = 0U;
while (num-- != 0U) {
pipe_hndl = USBH_PipeCreate (device, ptr_ep_desc->bEndpointAddress, ptr_ep_desc->bmAttributes & USB_ENDPOINT_TYPE_MASK, ptr_ep_desc->wMaxPacketSize & 0x7FFU, ptr_ep_desc->bInterval);
if (pipe_hndl == 0U) {
// If creation of pipe has failed delete previously created pipes
for (i = 0U; i < 8U; i++) {
if (USBH_CC_PipeHandle != 0U) {
(void)USBH_PipeDelete (USBH_CC_PipeHandle);
USBH_CC_PipeHandle = 0U;
}
}
return 255U;
}
USBH_CC_PipeHandle = pipe_hndl;
ptr_ep_desc++;
}
return 0U; // Device connected and configured
// Only single instance supported
// so it's instance index is 0
default:
break;
}
break;
default:
break;
}
break;
default:
break;
}
return 255U; // Device not handled
}
/// \brief De-configure resources
/// \param instance index of custom class device instance.
/// \return status code that indicates the execution status of the function as defined with usbStatus.
usbStatus USBH_CustomClass_Unconfigure (uint8_t instance) {
uint8_t i;
(void)instance; // Only single instance is supported
USBH_CC_Device = 0U;
for (i = 0U; i < 8U; i++) {
if (USBH_CC_PipeHandle != 0U) {
(void)USBH_PipeDelete (USBH_CC_PipeHandle);
USBH_CC_PipeHandle = 0U;
}
}
return usbOK;
}
/// \brief Initialize Custom Class Device instance
/// \param instance index of custom class device instance.
/// \return status code that indicates the execution status of the function as defined with usbStatus.
usbStatus USBH_CustomClass_Initialize (uint8_t instance) {
USB_SETUP_PACKET setup_packet;
uint32_t br;
uint8_t buf;
(void)instance; // Only single instance is supported
// Custom PL2303 initialization
setup_packet.bmRequestType.Dir = USB_REQUEST_DEVICE_TO_HOST;
setup_packet.bmRequestType.Type = USB_REQUEST_VENDOR;
setup_packet.bmRequestType.Recipient= USB_REQUEST_TO_DEVICE;
setup_packet.bRequest = 1U;
setup_packet.wValue = U16_LE(0x8484U);
setup_packet.wIndex = U16_LE(0U);
setup_packet.wLength = U16_LE(1U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, buf,1U) != usbOK) { return usbClassErrorCustom; }
setup_packet.bmRequestType.Dir = USB_REQUEST_HOST_TO_DEVICE;
setup_packet.wValue = U16_LE(0x0404U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, buf,1U) != usbOK) { return usbClassErrorCustom; }
setup_packet.bmRequestType.Dir = USB_REQUEST_DEVICE_TO_HOST;
setup_packet.wValue = U16_LE(0x8484U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, buf,1U) != usbOK) { return usbClassErrorCustom; }
setup_packet.wValue = U16_LE(0x8383U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, buf,1U) != usbOK) { return usbClassErrorCustom; }
setup_packet.wValue = U16_LE(0x8484U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, buf,1U) != usbOK) { return usbClassErrorCustom; }
setup_packet.bmRequestType.Dir = USB_REQUEST_HOST_TO_DEVICE;
setup_packet.wValue = U16_LE(0x0404U);
setup_packet.wIndex = U16_LE(1U);
setup_packet.wLength = U16_LE(0U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, NULL, 0U) != usbOK) { return usbClassErrorCustom; }
setup_packet.bmRequestType.Dir = USB_REQUEST_DEVICE_TO_HOST;
setup_packet.wValue = U16_LE(0x8484U);
setup_packet.wIndex = U16_LE(0U);
setup_packet.wLength = U16_LE(1U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, buf,1U) != usbOK) { return usbClassErrorCustom; }
setup_packet.wValue = U16_LE(0x8383U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, buf,1U) != usbOK) { return usbClassErrorCustom; }
setup_packet.bmRequestType.Dir = USB_REQUEST_HOST_TO_DEVICE;
setup_packet.wValue = U16_LE(0U);
setup_packet.wIndex = U16_LE(1U);
setup_packet.wLength = U16_LE(0U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, NULL, 0U) != usbOK) { return usbClassErrorCustom; }
setup_packet.wValue = U16_LE(1U);
setup_packet.wIndex = U16_LE(0U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, NULL, 0U) != usbOK) { return usbClassErrorCustom; }
setup_packet.wValue = U16_LE(2U);
setup_packet.wIndex = U16_LE(0x44U);
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, NULL, 0U) != usbOK) { return usbClassErrorCustom; }
// Initial CDC SetLineCoding request: Set 9600 baud, 8 data bits, 1 stop bit, no parity
setup_packet.bmRequestType.Dir = USB_REQUEST_HOST_TO_DEVICE;
setup_packet.bmRequestType.Type = USB_REQUEST_CLASS;
setup_packet.bmRequestType.Recipient= USB_REQUEST_TO_INTERFACE;
setup_packet.bRequest = 0x20U;
setup_packet.wValue = U16_LE(0U);
setup_packet.wIndex = U16_LE(0U);
setup_packet.wLength = U16_LE(7U);
br = U32_LE(9600U);// Data terminal rate in bits per second = 9600 baud
buf = (uint8_t)( br & 0xFFU);
buf = (uint8_t)((br >>8) & 0xFFU);
buf = (uint8_t)((br >> 16) & 0xFFU);
buf = (uint8_t)((br >> 24) & 0xFFU);
buf = 0U; // Number of stop bits = 1
buf = 0U; // Parity bit type = None
buf = 8U; // Number of data bits = 8
if (USBH_ControlTransfer (USBH_CC_Device, &setup_packet, buf, 7U) != usbOK) { return usbClassErrorCustom; }
return usbOK;
}
/// \brief De-initialize Custom Class Device instance
/// \param instance index of custom class device instance.
/// \return status code that indicates the execution status of the function as defined with usbStatus.
usbStatus USBH_CustomClass_Uninitialize (uint8_t instance) {
(void)instance; // Only single instance is supported
return usbOK;
}
CH340 到芯恒官网找些例程,设置波特率是有设定的命令的
页:
[1]