MultiChannel Programming
Overview
MultiChannel programming follows the same general workflow as programming with a single-channel Cyclone programmer. The main difference is that, before launching programming, the user selects which image will run on each channel and sets which channels are active. This chapter describes some of the features and typical usage of PEmicro's Cyclone MultiChannel programming system so the user can quickly gain a greater understanding of multichannel programming concepts, including requirements and capabilities.
Connectivity
Cyclone MultiChannel programmers connect to a PC, allowing them to be configured and controlled automatically (such as selecting active channels, adding or assigning programming images, starting programming operations, and more). The Cyclone MultiChannel can communicate with the PC through either USB or Ethernet, and both cable types are included. When using Ethernet, the programmer can be configured with either a static IP address or an IP address assigned dynamically through DHCP.
Channel Independence
Each integrated channel in a Cyclone MultiChannel system is a fully independent programming system with its own processor, memory, and interface electronics. This design maximizes performance and provides dedicated supervision of each target being programmed. The goal is maximum performance, flexibility, and error detection during programming.
The user does not need to supervise channels directly; the programmer handles that internally. Configure what should be programmed on each channel and launch programming. Results are available as an overall pass/fail result as well as per-channel results. The control API is almost as simple as with a single-channel programmer.
Channel Expansion
The base Cyclone MultiChannel unit has a 50-pin connector that provides four programming channels. A number of different connector adapters are available. The base unit also contains three USB-C connectors; a QuadPod Channel Expander can be attached to each. The USB-C connection powers the QuadPod and carries communication to it. Each expander has a 50-pin connector to which the user can connect four additional targets.
In total, each Cyclone MultiChannel programmer supports up to 16 programming channels. Multiple MultiChannel programmers can be controlled in parallel when higher channel counts are needed.
Figure: 16-Channel Setup with Cyclone FX MultiChannel and 3 QuadPod Channel Expanders

The figure above shows a Cyclone MultiChannel FX and three QuadPod Channel Expanders programming 16 target devices.
Channel Numbering
Figure: Expansion Port and Channel Numbering

Cyclone MultiChannel base channels are numbered 11-14 by default. Additional channels can be added by plugging QuadPod Channel Expanders into the USB-C Ports on the side of the Cyclone MultiChannel case. Note the Ports numbered 2, 3, and 4. For channels on these expansion ports, the "tens" digit of the channel corresponds to the Port number.
So, for example:
- A Quadpod on Port 2 would represent channels 21-24.
- A Quadpod on Port 3 would represent channels 31-34
- A Quadpod on Port 4 would represent channels 41-44
Active Channels
When using Cyclone MultiChannel programmers and QuadPod channel expanders, at any given time each individual programming channel is set to either Active or Not Active status. This status can be set using the Cyclone Control GUI/Console/SDK, along with which image will be programmed by each channel.
Each time the active channel list is updated, the selected channels become Active and all channels not included in that list become Not Active. More information is available in Cyclone Programmer Automated Control.
When a Console command or SDK call does not specify a channel list directly, channel-aware operations such as image selection, dynamic data, and programming launch use the current active channel list.
Note
The active channel list and the selected image for each channel are saved by the Cyclone MultiChannel programmer and remain configured after a power cycle. Once the desired channels and images have been set, they do not need to be configured again before each launch unless the setup should change.
Each tool in the Cyclone Control Suite allows you to configure this information.
Cyclone Control GUI
In the Cyclone Control GUI, active channels are configured on the Channels Tab. Select the channels that should participate in programming, then click Set Active. Any channels that are not selected are set to Not Active.
Figure: Cyclone Control GUI Active Channels

Cyclone Control SDK
In the Cyclone Control SDK, use the setChannelList function with ActiveChannelsListType to set the active channel list before launching programming.
Cyclone Control Console
In the Cyclone Control Console, use the -setactivechannels command-line parameter to set the active channel list, for example -setactivechannels=11,12,13,14.
Selecting and Launching Images
Each active channel must have an image selected before programming is launched. The selected image can be the same for all active channels, or different channels can be assigned different images.
In the Cyclone Control GUI, image assignment is handled on the Channels Tab using the Set Image button. Select the channels that should receive the image, choose the image from the image list, then click Set Image.
In the Cyclone Control SDK, the current active channel list determines which channels are affected by image-selection and launch calls. Use setChannelList to select the target channels, then call selectLocalImageForExecution or selectCloudImageForExecution to choose the image for those channels. Use startExecutionOfSelectedImage to launch programming on the selected active channels.
When different channel groups should run different images, repeat that sequence for each group: call setChannelList for the group, select the image for that group, then move to the next group. Before launching, call setChannelList again with the full set of channels that should participate in programming.
In the Cyclone Control Console, -selectimage selects an image for the active channels by default. The channel list may also be specified directly on channel-aware commands, such as -selectimage[11,12]=1 or -launch[11,12]. The -launchimage[channels]=image form selects and launches an image for the specified channels in one command.
Dynamic Data by Channel
Dynamic data allows launch-time data to be combined with the static programming image without rebuilding the image. This is commonly used for values such as serial numbers, MAC addresses, lot codes, date codes, or other production-specific data. More detail is available in Programming Dynamic Data, especially the Overlay Data section.
For data that should be identical across a group of targets, set those channels active and provide the overlay data once. The same overlay bytes will be applied to each active channel during the launch.
For data that should be unique per target, provide dynamic data separately for each channel or channel set. In the Cyclone Control Console, add bracketed channel lists to dynamic data commands, for example -specifyOverlayData[11]=... and -specifyOverlayData[12]=.... In the Cyclone Control SDK, use setChannelList before each specifyOverlayProgramData call so each overlay entry is stored with the intended channel context, then set the full active channel list again before launching.
Cyclone Control SDK - Example MultiChannel Workflow
The Cyclone Control SDK includes MultiChannel programming example source code for several languages and toolchains. See the SDK chapter's Example Programs section for the list of available examples and installed source paths.
Figure: Shows the Most Common Sequence of Calls to the DLL After Successfully Connecting to a MultiChannel Cyclone

-
Verify that the connected Cyclone supports multichannel operation. The
checkIfCycloneIsMultichannelcall may be used to confirm that the connected unit supports multichannel programming. -
Select the channels that will participate in the programming operation. The
setChannelListcall is used to specify the active channel list before execution is started. -
Select the image to be executed. The
selectLocalImageForExecutioncall selects an image stored on the Cyclone unit, whileselectCloudImageForExecutionselects an image distributed through PEcloud. -
Initiate programming operations. The
startExecutionOfSelectedImagecall carries out the programming operations defined in the selected image on the selected channels. -
Wait for programming completion. Note that no error checking is provided by the
checkCycloneExecutionStatuscall. A result of0will be returned even if an error has occurred or if communication with the Cyclone is lost. -
Retrieve the programmer-level result from the Cyclone unit to determine if the programming operation was successful. The
getNumberOfErrors,getErrorCode, andgetDescriptionOfErrorCodecalls may be used to recover overall Cyclone-level error information. The value returned bygetNumberOfErrorsis not a count of failed channels; it is the number of programmer-level errors recorded for the operation. -
If
getNumberOfErrorsreturns 0, all selected channels completed successfully and no channel error check is required. IfgetNumberOfErrorsreturns a value greater than 0, retrieve the individual channel error codes. ThegetChannelErrorCodecall may be used for each selected channel to determine which specific channels passed or failed. Each channel returns only one channel-specific error code.
Cyclone Control Console - Example MultiChannel Workflow
One possible approach would be to set the active channels lists with one command-line, then use a different command-line to either select an image and launch, or just launch. Either will use the remembered active channel list.
Note
When a channel is set to Active, this status is persistent. The user does not need to "re-set" the Active channels unless they wish to change them. This is demonstrated in the second example below.
This first example connects to a single Multichannel Cyclone identified by its IP address 10.0.1.1, selects channels 11, 12, 13, and 14, selects image #1 on those channels, and executes the selected image. This is the most common usage of the Cyclone Control Utility when the same image should be programmed on multiple channels of a single Multichannel Cyclone.
CycloneControlConsole.exe -cyclone=10.0.1.1 -setactivechannels=11,12,13,14 -selectimage=1 -launch
This next example connects to a single Multichannel Cyclone enumerated on USB1, selects image #1 on those channels, and executes the selected image on the current active channels. Based on the channels that were set to Active in the previous example, this would be channels 11, 12, 13, and 14 .
CycloneControlConsole.exe -cyclone=USB1 -selectimage=1 -launch
The channel list may also be specified directly on the channel-specific commands. In the following example, image #1 is selected on channels 11, 12, 13, and 14, and programming is then launched on those same channels.
CycloneControlConsole.exe -cyclone=10.0.1.1 -selectimage[11,12,13,14]=1 -launch[11,12,13,14]
The image selection and launch operation may also be combined into a single command by using -launchimage with a channel list. The following example selects and launches image #1 on channels 11, 12, 13, and 14.
CycloneControlConsole.exe -cyclone=10.0.1.1 -launchimage[11,12,13,14]=1
This example performs the same operation on a Multichannel Cyclone enumerated on USB1.
CycloneControlConsole.exe -cyclone=USB1 -launchimage[11,12,13,14]=1
Note
On a Multichannel Cyclone, image selection is channel-specific. Therefore, when using -selectimage, the channels must either be selected first with -setactivechannels, or specified directly on the command using the bracketed channel-list syntax. The -launchimage[channels]=image form is the shortest option when the desired operation is simply to select and immediately launch the same image on a specific set of channels.