This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

USB-CDC-driver hangs in USBD_Write

Hi,
I encountered problems using the USB-CDC-example out of the Atmel software package 1.5 with an AT91SAM9260.
Sometimes, when sending data using USBD_Write, the USB driver hangs in the function/define SET_CSR waiting for the AT91C_UDP_TXPKTRDY flag.
Other times, USBD_Write returns USBD_STATUS_LOCKED all times, while receiving data works fine.

char USBD_Write(unsigned char eptnum,
                const void *data,
                unsigned int size,
                TransferCallback callback,
                void *argument)
{
    Endpoint *endpoint = &(endpoints[eptnum]);
    Transfer *transfer = &(endpoint->transfer);

    // Check that the endpoint is in Idle state
    if (endpoint->state != UDP_ENDPOINT_IDLE) {
        return USBD_STATUS_LOCKED;
    }

    trace_LOG(trace_INFO, "Write%d(%u) ", eptnum, size);

    // Setup the transfer descriptor
    transfer->data = (char *) data;
    transfer->remaining = size;
    transfer->buffered = 0;
    transfer->transferred = 0;
    transfer->callback = callback;
    transfer->argument = argument;

    // Send the first packet
    endpoint->state = UDP_ENDPOINT_SENDING;
    while((AT91C_BASE_UDP->UDP_CSR[eptnum]&AT91C_UDP_TXPKTRDY)==AT91C_UDP_TXPKTRDY);
    UDP_WritePayload(eptnum);
    SET_CSR(eptnum, AT91C_UDP_TXPKTRDY);

    // If double buffering is enabled and there is data remaining,
    // prepare another packet
    if ((BOARD_USB_ENDPOINTS_BANKS(eptnum) > 1) && (transfer->remaining > 0)) {

        UDP_WritePayload(eptnum);
    }

    // Enable interrupt on endpoint
    AT91C_BASE_UDP->UDP_IER = 1 << eptnum;

    return USBD_STATUS_SUCCESS;
}

Does someone else have similar problems?

And another question concerning the USB-CDC-driver: Under WinXP usbser.sys is used as driver for the device and it can be used as a serial port. When connecting to the port (e.g. by HTerm) and then resetting the board, the connection can not be established again, until the device is plugged out and in again. Is this a problem of the USB-CDC-driver on the device or a generic problem of the windows driver?

Parents
  • Hi Stefan,

    I'm encountering the same problem with SET_CSR hanging up in USBD_Write on a AT91SAM7S256.

    Have you managed to find a solution?

    The only lead I have is a note in the datasheet, which explains that wait times should be used in a preemptive environment instead of polling the bits. I wonder if I am getting nested interrupts trying to set and clear the flags simultaneously.

    Here is the note from the datasheet:

    WARNING: Due to synchronization between MCK and UDPCK, the software application must wait for the end of the write operation before executing another write by polling the bits which must be set/cleared.

    Note: In a preemptive environment, set or clear the flag and wait for a time of 1 UDPCK clock cycle and 1peripheral clock cycle. However,
    RX_DATA_BLK0, TXPKTRDY, RX_DATA_BK1 require wait times of 3 UDPCK clock cycles and 3 peripheral clock cycles
    before accessing DPR.

    (from section 35.6.10 UDP Endpoint Control and Status Register in the AT91SAM7S Datasheet)

    -Steven

Reply
  • Hi Stefan,

    I'm encountering the same problem with SET_CSR hanging up in USBD_Write on a AT91SAM7S256.

    Have you managed to find a solution?

    The only lead I have is a note in the datasheet, which explains that wait times should be used in a preemptive environment instead of polling the bits. I wonder if I am getting nested interrupts trying to set and clear the flags simultaneously.

    Here is the note from the datasheet:

    WARNING: Due to synchronization between MCK and UDPCK, the software application must wait for the end of the write operation before executing another write by polling the bits which must be set/cleared.

    Note: In a preemptive environment, set or clear the flag and wait for a time of 1 UDPCK clock cycle and 1peripheral clock cycle. However,
    RX_DATA_BLK0, TXPKTRDY, RX_DATA_BK1 require wait times of 3 UDPCK clock cycles and 3 peripheral clock cycles
    before accessing DPR.

    (from section 35.6.10 UDP Endpoint Control and Status Register in the AT91SAM7S Datasheet)

    -Steven

Children