Example on how to use the USB control EndPoint EP0

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
FrPo_1282226
Level 4
Level 4
25 replies posted 10 replies posted 10 questions asked

Hi there,

I need to be able to get control messages from the EP0.

I'm using a PSoC 5LP, and I can successfully read and Write USB messages on EP1 and EP2.

For compatibility reason I need to use the Endpoint 0 to configure the PSOC.

I have tried the following code, but is not working:

#define EP0 0

uint8_t  NewUSBMessage()

{

  uint8_t retVal;

  

    retVal =0;

    if (USB_bGetEPState(EP0)!= USB_OUT_BUFFER_EMPTY)

    {

    

        USB_ReadOutEP(EP0,Message,length);

        retVal = 1;

    

      

    }

  

    return retVal;

}

Can somebody help me please? send me some example link, etc.

Thanks,

Francesco

0 Likes
1 Solution
Len_CONSULTRON
Level 9
Level 9
Beta tester 500 solutions authored 1000 replies posted

Francesco,

I'm not a USB configuration expert but here goes:

I'm assuming NewUSBMessage() is an ISR you want called when EP0 is activated.

You may need to make the following changes if you already haven't:

Rename the function NewUSBMessage() to <comp_name>_EP_0_ISR_ExitCallback()

Add the following lines into file cyapicallbacks.h:

#define <comp_name>_EP_0_ISR_EXIT_CALLBACK

void <comp_name>_EP_0_ISR_ExitCallback();

Note: <comp_name> needs to be substituted with the name of your USBFS component.

I've used USBFS and EP0 and these are the changes I had to add to get EP0 to be processes with my own code.

Len

Len
"Engineering is an Art. The Art of Compromise."

View solution in original post

3 Replies
Len_CONSULTRON
Level 9
Level 9
Beta tester 500 solutions authored 1000 replies posted

Francesco,

I'm not a USB configuration expert but here goes:

I'm assuming NewUSBMessage() is an ISR you want called when EP0 is activated.

You may need to make the following changes if you already haven't:

Rename the function NewUSBMessage() to <comp_name>_EP_0_ISR_ExitCallback()

Add the following lines into file cyapicallbacks.h:

#define <comp_name>_EP_0_ISR_EXIT_CALLBACK

void <comp_name>_EP_0_ISR_ExitCallback();

Note: <comp_name> needs to be substituted with the name of your USBFS component.

I've used USBFS and EP0 and these are the changes I had to add to get EP0 to be processes with my own code.

Len

Len
"Engineering is an Art. The Art of Compromise."

Thank you Len!

it worked!

I'm writing the solution in case other people need it.

In order to read the messages from EP0 I have added

      #define USB_EP_0_ISR_EXIT_CALLBACK 

     void USB_EP_0_ISR_ExitCallback();

in cyapicallback.h

and I wrote this function:

void USB_EP_0_ISR_ExitCallback(){

    int length = USB_currentTD.count;   

         if (length == 😎

             for (int i = 0; i< length; i++)

             {

                    Message = USB_currentTD.pData;

             }

}

which seems working.

Now I'm having the opposite problem  I can't sens (anymore) data to the IN EP1).

the PSoC 

// wait until our IN Endpoint is empty

            while(USB_GetEPState(UNDPOINTIN) != USB_IN_BUFFER_EMPTY);

Do you know what else could be wrong now?

Thank you!

0 Likes
Ekta_N
Moderator
Moderator
Moderator
750 replies posted First like given 250 solutions authored

Hello Francesco,

For the functions like USBFS_ReadOutEP(), the valid value of endpoint number ranges from 1 to 8. You cannot give 0 for the endpoint number parameter in it.

As already mentioned by Len you can use the USBFS_EP_0_ISR_ExitCallback() and USBFS_EP_0_ISR_EntryCallback() ISR's located in the USBFS_dvrc.c . These ISR's are triggered to handle control transfers directed to endpoint.

To use these ISRs you need to define  USBFS_EP_0_ISR_ENTRY_CALLBACK (or USBFS_EP_0_ISR_EXIT_CALLBACK) in the cyapicallbacks.h as shown in the image below:

pastedImage_0.png

Then define the USBFS_EP_0_ISR_EntryCallback() function in the main.c to perform the desired function.

Regards

Ekta

0 Likes