DT Family Guide
Overview
The DT family is NAI’s line of programmable discrete I/O smart function modules. A single DT module gives you multiple channels that can each act as a discrete input (voltage or contact sensing, with programmable pull-up/pull-down so you don’t need external resistors) or a discrete output (high-side, low-side, or push-pull switching), plus measurement, thresholds, and debounce.
This page is the starting point if you’re working with any DT module. Use it to understand what the family does, pick the right member for your channel count and switching needs, get the module wired up, and run your first sample application against it. It’s aimed at engineers integrating discrete I/O — relays, switches, lamps, solenoids, contact sensing — into an NAI board or system.
DT modules drive and sense the discrete devices found throughout aircraft and rugged platforms — relay coils, solenoids, incandescent lamps and LEDs, and contact/position sensors. NAI calls out applications like switching high-inrush lamp loads (e.g., paralleled #327 lamps via 2 A/bank current sharing), dual-series “key” outputs for missile launch control, and detecting hatch-open / wheels-up–style indicator contacts with programmable debounce to reject relay chatter.
DT modules at a glance
| Module | Channels | Type | What makes it different | Manual |
|---|---|---|---|---|
| DT1 | 24 | SF | Full programmable discrete I/O; push-pull to 500 mA/ch, current sharing to 2 A/bank | DT1 Manual |
| DT2 | 16 | SF | Isolated channels, ±80 V input sensing, bidirectional switch to 625 mA/ch, diode clamping | DT2 Manual |
| DT3x | 4 | Output only | High-current output: to 2 A / 65 V, hi-side / lo-side / push-pull | DT3x Manual |
| DT4 | 24 | EF | DT1 features plus pulse/frequency period measurement & signal generation | DT4 Manual |
| DT5 | 16 | EF | DT2 features plus pulse/frequency period measurement & signal generation | DT5 Manual |
Choosing a member:
- Basic discrete I/O — DT1 (24 ch) or DT2 (16 ch).
- Pulse/frequency period measurement or signal generation — the EF versions, DT4 (24 ch) or DT5 (16 ch). EF modules do everything their SF counterpart does and add the timing features.
- High-current loads, outputs only — DT3x (4 ch, up to 2 A / 65 V per channel).
- Galvanic isolation or higher input voltages — DT2 and DT5 have isolated channels and measure inputs up to ±80 V; reach for them when channels must be isolated from each other or from the system, or when sensing voltages above the DT1/DT4 range.
Physical setup
Discrete I/O wiring differs per module — the specific pinout is the one thing that changes between DT members — so the per-module pinout always comes from that module’s manual. The setup pattern, though, is the same for every DT module:
- The module is seated in a slot on your NAI motherboard or system. (Function modules are COSA modules installed into module slots.)
- Bring the I/O out through the breakout board. The slot’s pins appear on the breakout as generic IO# numbers.
- Map IO# pins to the module’s discrete channels — either by reading the pinout in the module’s manual or by laying the module’s pinout overlay card over its MOD# pins on the breakout.
- Wire your discrete signals (contacts, loads, sensing lines) to the mapped pins.
A few electrical points hold for every DT module: outputs switch an externally supplied VCC (a 3–60 V source you provide), low-side/sink configurations return to ISO-GND, and input channels are wired differently from outputs — sensing a voltage or contact rather than driving a load. The exact pins for VCC, ISO-GND, and each channel are in the module’s manual.
Two common cases make this concrete (use your module’s pinout for the actual pin numbers):
- Driving a load (relay coil, lamp, solenoid) as a high-side output. Supply your VCC (3–60 V) to the module’s VCC pin and tie your supply ground to ISO-GND. Wire the load between the channel’s output pin and ISO-GND. Configured high-side, the channel sources current from VCC into the load when you drive it high — up to 500 mA per channel on DT1/DT4, or up to 2 A per channel on DT3x. For inductive loads like relay coils, on-module diode clamping handles the flyback.
- Sensing a switch or relay contact as an input. Wire the contact between the channel’s pin and ground. Instead of an external pull resistor, enable the channel’s programmable pull-up or pull-down current source (0–5 mA, in banks of 6 channels) so an open contact reads a clean level. Add debounce to reject contact chatter (see Software, below).
The DT module manuals are functional/register references (pinouts included); they have no install steps. Connector and cabling specifics live in Connectors and Cabling Info; powering and reaching the board is covered in Connecting to Boards.
Software
There’s nothing DT-specific about which software you run. The NAI SSK (naibrd library) is identical across every OS and architecture — PetaLinux, VxWorks, DEOS, Windows. What OS you’re on is determined by your motherboard/SBC, not by the DT module. The only family-specific part is which API functions you call: DT modules use the naibrd_DT_* calls.
Where to find what you need:
- Which functions/registers to call — the specific module’s manual (e.g. DT1 Manual) documents every
naibrd_DT_*register. - Building and deploying on your platform — Connecting to Boards covers the toolchain, deployment, and terminal access for PetaLinux/ARM Linux, VxWorks, DEOS, and Windows.
- Launching the app on the board itself — Running Applications from the Target walks through loading and launching your executable on the target.
Example — a 68ARM2 SBC with a DT1 module: pull the naibrd_DT_* calls from the DT1 Manual, set up the ARM Linux toolchain per Connecting to Boards, then load and launch the sample on the target per Running Applications from the Target.
Try it out
The DT BasicOps sample application is the fastest way to drive a real DT channel. It exercises the core DT operations you’ll reuse in your own code: setting a channel’s I/O format (input, low-side, high-side, or push-pull output), controlling output state, configuring voltage thresholds, setting debounce time, reading channel status and measured voltage/current, and resetting overcurrent conditions. It supports DT1 through DT5, so it works for any member of the family.
Getting connected. Every NAI sample app — BasicOps included — starts with the same connection flow before any DT call: naiapp_RunBoardMenu() opens (or loads a saved) board connection, then naiapp_query_CardIndex() and naiapp_query_ModuleNumber() ask which board and which module slot to talk to. Under the hood the connection is opened with naibrd_OpenDevice(). The result is the three coordinates every naibrd_DT_* call takes: cardIndex (which opened board), module (the slot the DT module sits in), and channel (the discrete channel on that module). When you write your own program, you do the same — see Opening a Software Handle to Your Board.
Once connected, configuring and driving a channel looks like this:
/* Drive channel 0 as a high-side output, then turn it on */
naibrd_DT_SetIOFormat(cardIndex, module, 0, NAIBRD_DT_IOFORMAT_OUTPUT_HIGH);
naibrd_DT_SetOutputState(cardIndex, module, 0, NAIBRD_DT_STATE_HI);
/* Read back a channel wired as an input */
naibrd_DT_SetIOFormat(cardIndex, module, 1, NAIBRD_DT_IOFORMAT_INPUT);
naibrd_DT_GetInputState(cardIndex, module, 1, &state); /* logic level */
naibrd_DT_GetVoltage(cardIndex, module, 1, &volts); /* measured V */
/* Reject relay-contact chatter on an input channel */
naibrd_DT_SetDebounceTime(cardIndex, module, 1, debounceMs);On a DT4 or DT5, call naibrd_DT_SetEnhancedMode() first to unlock the EF pulse/frequency features — they’re inactive in standard mode.
Run it: DT BasicOps (SSK 2.x) · DT BasicOps (SSK 1.x) — or browse all DT samples in the DT sample-app summary.
Common pitfalls
- An output channel won’t drive a load. DT outputs switch your power, not the module’s — they need an external VCC (3–60 V) applied to the module. With no VCC supplied, a channel set to output simply won’t source or sink current. Check the supply and that ISO-GND is tied to your supply ground.
- An input reads stuck high or low. For contact sensing, enable the channel’s pull-up or pull-down current source rather than expecting an external resistor — without it, an open contact floats. If a voltage input reads the wrong state, check the configured thresholds (
naibrd_DT_SetThreshold). - A relay or switch input flickers or double-triggers. That’s contact bounce. Set a debounce time (
naibrd_DT_SetDebounceTime) to filter it. - EF features (pulse/frequency) do nothing on a DT4/DT5. They’re only active in enhanced mode — call
naibrd_DT_SetEnhancedMode()before using them. - An output shut off unexpectedly. DT outputs have thermal and overcurrent protection. Read channel status to confirm, and reset the overcurrent condition once the fault is cleared (the BasicOps sample shows this).
- You picked the wrong member for the voltage/isolation you need. DT1/DT4 are non-isolated; DT2/DT5 are isolated and sense up to ±80 V. Re-check the comparison table if your signal is isolated or out of range.
Related resources
- Download the SSK — get the library and sample apps
- Connecting to Boards — power, network, terminal, and file transfer to your board
- Opening a Software Handle to Your Board — establish the connection your
naibrd_DT_*calls run against - Running Applications from the Target — load and launch a built sample on the board
- ESP2 Quick Start — exercise DT channels with no code via the Embedded Soft Panel
