Thanks jeremyzhou for your suggestions.
The problem is solved. The reasons being:
1. Usb do not receive exact 64 bytes of packet. They are variable.
2. Writing to flash part needs to be written into Endpoint interrupt handler(as shown below).
ErrorCode_t CDC_bulk_out_handler(USBD_HANDLE_T hUsb, void *data, uint32_t event)
{
static uint8_t count = 0;
VCOM_DATA_T *pVcom = (VCOM_DATA_T *) data;
switch (event) {
case USB_EVT_OUT:
pVcom->rx_count = USBD_API->hw->ReadEP(hUsb, USB_CDC_OUT_EP, &val.byte[count]); //your buffer
if (pVcom->rx_flags & VCOM_RX_BUF_QUEUED) {
pVcom->rx_flags &= ~VCOM_RX_BUF_QUEUED;
if (pVcom->rx_count != 0) {
pVcom->rx_flags |= VCOM_RX_BUF_FULL;
}
}
else if (pVcom->rx_flags & VCOM_RX_DB_QUEUED) {
pVcom->rx_flags &= ~VCOM_RX_DB_QUEUED;
pVcom->rx_flags |= VCOM_RX_DONE;
}
//*********************************************************//
count += pVcom->rx_count;
if(count%4 == 0)
{
WriteFlash(addr, (uint16_t*)val.bit_32, count);
addr += count;
count = 0;
}
//*********************************************************//
break;
case USB_EVT_OUT_NAK:
/* queue free buffer for RX */
if ((pVcom->rx_flags & (VCOM_RX_BUF_FULL | VCOM_RX_BUF_QUEUED)) == 0) {
USBD_API->hw->ReadReqEP(hUsb, USB_CDC_OUT_EP, pVcom->rx_buff, VCOM_RX_BUF_SZ);
pVcom->rx_flags |= VCOM_RX_BUF_QUEUED;
}
break;
default:
break;
}
return LPC_OK;
}