cancel
Showing results for 
Search instead for 
Did you mean: 

Single USB Host to Multiple USB Virtual Ports

LMorr.3
Senior II

Hello,

I have an STM32F373 and have successfully enabled a USB virtual com port.

I currently send data packets from a PC host to the slave device and include a 'deviceId' in the packet data header.

I would  like to support the single PC host communicating with multiple slave devices.   There would be no more than 12 slave devices, and I would like to add new devices. 

I plan on enabling a USB virtual com port for each slave device, and have them ignore packets not addressed to their deviceId.  Each device would only send a response if the packet is addressed to it.  The single host would ensure it only attempts to communicate with 1 device at a time.  

I recall seeing that STM32 allows the USB port to connect to multiple devices in this way. ( not sure though )  

What is the best way to connect each slave device to the USB connection?  Should I just split the 2 USB input (DM,DP) and send them to each slave device directly, or should I investigate a better circuit/components. ( eg. should I worry about current draw, diodes or isolation )

I could also have 1 slave device acting as 'master' for all other slave devices and have the PC host only communicate with that 1 slave device. ( use SPI or USART connection between slave devices instead of USB virtual host )

Lastly, I am looking at a USB hub controller IC, such as the TUSB1046.

Any advice will help.

Thank you,

 

1 ACCEPTED SOLUTION

Accepted Solutions
TDK
Guru

A usb hub is going to be the easiest and probably most robust solution. You can create a composite USB device that embeds many different VCPs, but they do not really show up as independent devices and it can be hard find out which is which.

My preferred approach is to have as many devices as you need. Prefix their serial number with some value so you can tell them apart.

If you feel a post has answered your question, please click "Accept as Solution".

View solution in original post

7 REPLIES 7
TDK
Guru

A usb hub is going to be the easiest and probably most robust solution. You can create a composite USB device that embeds many different VCPs, but they do not really show up as independent devices and it can be hard find out which is which.

My preferred approach is to have as many devices as you need. Prefix their serial number with some value so you can tell them apart.

If you feel a post has answered your question, please click "Accept as Solution".
AScha.3
Principal III

Hi,

Basically your idea to connect some USB host and slaves via hubs is possible, BUT :

this is some kind of a network, so why not use something like RS485, UART , SPI, or CAN , whats (all of them ) is widespread used for network ?  And much more easy to realize !

To do it with USB is much more difficult , but ok, if you searching for a real challenge - good idea ! 🙂

If you feel a post has answered your question, please click "Accept as Solution".

Good to know this is your approach as it seems to be the best solution for my case.  I see benefits like being able to communicate with devices in parallel instead of using device addressing through a 'master' uC using I2C SS or packet header deviceId.  Adding a 'type' prefix to the uC's built-in serial number will allow the client to 'discover' USB devices and build a lookup table for future auto re-connections.

Do you use an external USB hub or do you build a usb hub circuit board ( ie. using TUSB1046 ) and connect devices into that board using custom non-usb cables/connectors?  My 'modules' will sit next to each other and I would like to minimize the USB cables required if possible. ( replacing them with small PCB->PCB cables like I do with my SPI/I2C )

Thanks!

An external hub will certainly be quicker. A custom PCB will take considerably more time/effort. You'd have to weigh if that effort is worth the convenience of a smaller form factor.

If you feel a post has answered your question, please click "Accept as Solution".

True, and at first, the user will only need 1 USB connection so no hub needed.  Even with 2 to 3 USB connections, still most likely no hub.  In my case, the majority of users will have 2 USB cables so it would have been nice to combine then into 1.  Some users will need more than 2 USB connections so using an external hub at that point will not seem like too much additional overheard.

I would be nice for me to add a small USB connector cable in case I even decide to get build a hub pcb and need to connect directly from PCB->PCB.  Have you done this before, and if so, do I just add 1 USB connector in line with my small USB PCB->PCB header?  I have USB protection neat the USB connector right now and assume I'll need to duplicate that protection at my USB PCB->PCB header.  ( and hope the user never connects both at the same time 🙂

As I understand: every MCU provides a USB VCP UART:

It should work: you get for every MCU a different COM port (it works for me: I can connect several of the same MCU, running the same FW, nothing to do in MCU FW). It just pops up as different COM ports.

The only thing is: the COM ports assigned seem to be a bit random: just changing the USB port changes also the COM port.

An USB hub should work to connect many MCU with USB VCP UART. Just to make sure, that Windows does not have a limitation how many COM ports can be established (or what the highest COM port number is).

Why do you need a "device ID" if USB UART is a dedicated COM port? (to differentiate between different boards)


@tjaekel wrote:

Just to make sure, that Windows does not have a limitation how many COM ports can be established (or what the highest COM port number is).


https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z000000PAhzSAG