Skip to main content
Use this workflow to debug TI C2000 (C28x) firmware through Code Composer Studio (CCS) and an XDS probe. Embedder drives your installed CCS, so the TI target definitions and drivers on your machine must support the exact device and probe. Embedder doesn’t supply CCS.

Supported probes

If you don’t name a probe anywhere, Embedder uses XDS110.

Prepare CCS

  1. Install CCS with its scripting support, target database, and drivers for your probe and device.
  2. Connect and power the target. Close other CCS sessions that use the probe.
  3. Build a debug artifact that CCS can load, such as an ELF-format .out file, with matching symbols.
  4. Identify the TI target configuration (.ccxml) for the board, or the TI device name. For a multicore device, note the core you want from that configuration.
  5. Run /debug and ask Embedder to check the installation, probe version, target configuration, and device before connecting.
Embedder looks for CCS in these folders, newest version first: If CCS is installed somewhere else, set EMBEDDER_CCS_ROOT (or CCS_ROOT) to the CCS folder that contains ccs_base and scripting, in the environment that launches Embedder. You can also give the folder in your request.

Choose the target configuration

Embedder resolves the probe, device, and .ccxml from, in order of priority:
  1. Values you give in your request.
  2. The project’s saved CCS configuration in .embedder/ccs.json.
  3. Debug Interface and Target MCU in EMBEDDER.md.
When no .ccxml is given, Embedder searches the project, .embedder/targetConfigs/, ~/ti, and the C2000Ware folder named by C2000WARE_ROOT for one that matches the probe and device. If several match, Embedder lists them so you can choose one. If none match and the device is known, it generates one at .embedder/targetConfigs/<probe>-<device>.ccxml. It can’t generate a configuration for XDS100v1 with devices that use ICEPick routing or a CLA. Supply a TI-authored .ccxml for those. Embedder saves the resolved setup in .embedder/ccs.json and reuses it. If you change boards or probes, give the new device, probe, and .ccxml explicitly, or delete .embedder/ccs.json to start discovery again.

Program and debug

Replace both paths and the probe with your actual setup. Embedder asks you to approve before it connects, unless your approval settings already allow it. A normal connection loads and verifies the program, then tries to stop at main. Starting a CCS session closes any open J-Link, OpenOCD, or XMOS debugger session. Once connected, you can ask for:
  • Breakpoints, run, and interrupt.
  • Step, step over, and step out.
  • Register and memory reads.
  • Expression evaluation.
  • The call stack, with modern CCS scripting only. Frames don’t include local variables; evaluate an expression to read a variable.
Raw GDB commands, thread lists, and RTOS task views aren’t available in CCS sessions.

Script the connection

For a repeatable check, save a hardware script under .embedder/hardware/:
Replace its values before asking Embedder to run it. This example programs the target. The CCS connection closes when the script ends.

Attach to existing firmware

For firmware already on the board, ask for attach-only with the matching artifact. Embedder loads symbols without loading the program, then halts the target. Ask for no-halt as well to skip that halt. The TI connection sequence can still affect execution. CCS handles no-halt on a programming connection differently from J-Link and OpenOCD: it loads the program, then starts execution. Don’t use no-halt as a substitute for attach-only.

Read C28x memory

On C28x, memory addresses are target word addresses, and read sizes are in bytes. Each 16-bit word is returned low byte first, and the result is trimmed to the byte count you asked for.

Troubleshoot

  • No compatible CCS installation found: repair the CCS installation so its scripting support, probe connection files, C28x drivers, and device definitions are present, or set EMBEDDER_CCS_ROOT.
  • Generic XDS100 is ambiguous: specify xds100v1, xds100v2, or xds100v3, or supply the matching .ccxml.
  • Multiple target configurations match: give the intended .ccxml explicitly.
  • Configuration conflicts with the requested device or probe: use the correct TI configuration instead of forcing mismatched values.
  • A CCS device is required: give the device name, or set Target MCU in EMBEDDER.md.
  • Automatic target configuration is unavailable: supply a TI-authored .ccxml, especially for routed or CLA devices with XDS100v1.
  • Stack query is unsupported: the session uses legacy CCS scripting. Use register, memory, and expression queries, or a modern CCS setup.
Last modified on October 13, 2026