cancel
Showing results for 
Search instead for 
Did you mean: 

Using the STM32 USB-CDC example, using "Command" endpoint differs when used with STM32F1 vs STM32F4?

Bmora.1
Associate

I've extended the USB-CDC example using Cube IDE to report serial port line state -- Ring, etc. My example works on STM32F1, however, it does NOT function correctly on STM32F4.

Here's the meat:

/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
 
USBD_StatusTypeDef USBD_CtlSendNotification(USBD_HandleTypeDef *pdev,
 
                                   uint8_t *pbuf, uint16_t len)
 
{
 
 /* Set EP0 State */
 
 //pdev->ep0_state = USBD_EP0_STATUS_IN ;
 
 pdev->ep_in[2].total_length = len;
 
 pdev->ep_in[2].rem_length  = len;
 
 
 /* Start the transfer */
 
 USBD_LL_Transmit(pdev, CDC_CMD_EP, pbuf, len);
 
 
 return USBD_OK;
 
}
 
 
uint8_t CDC_Notify_FS(uint8_t linestate) {
 
   USBD_HandleTypeDef *pdev = &hUsbDeviceFS;
 
 
   USBD_CDC_HandleTypeDef *hcdc =
 
         (USBD_CDC_HandleTypeDef*) hUsbDeviceFS.pClassData;
 
   uint8_t ifalt = 0U;
 
   uint16_t status_info = 0U;
 
   uint8_t ret = USBD_OK;
 
   uint8_t dbuf[12];
 
   dbuf[0] = 0xA1; //bmRequestType TODO: Add Define for USB_SERIAL_STATE
 
   dbuf[1] = 0x20; //SERIAL_STATE
 
 
   dbuf[2] = 0x00; // wValue
 
   dbuf[3] = 0x00;
 
 
 
   dbuf[4] = 0x00; // windex (interface) TODO: pdev->dev_address ?
 
   dbuf[5] = 0x00;
 
 
   dbuf[6] = 0x02; // wlen
 
   dbuf[7] = 0x00;
 
 
   dbuf[8] = linestate & 0x7F; // linestate 7:0
 
   dbuf[9] = 0x00; // reserved 15:8
 
 
   USBD_CtlSendNotification(pdev, (uint8_t*) (void*) &dbuf, 0x0A);
 
   return ret;
 
}
 
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
 
 

Do I need to do any other initialization (on STM32F4) before I'm able to send a 10 byte buffer down the Interrupt-endpoint 82?

2 REPLIES 2

Hello @Bmora.1​ ,

In order to allow a better analysis this issue, could you please give us more details about your problem.

Thanks in advance.

BeST Regards,

Walid

Make the dbuf array global or static.

JW