Also known as: SACCH, FACCH, FACCH-S, associated control channel
SACCH (Slow Associated Control Channel) and FACCH (Fast Associated Control Channel) are the two associated control channels that carry signalling alongside voice on a P25 Phase 2 traffic channel.1 Phase 2 has no separate control channel during a call: once a system grants a traffic channel, the signalling that keeps the call coordinated — grant updates, PTT and end-of-transmission, encryption sync, talker alias — rides in the same two-slot stream as the AMBE+2 voice, folded in as MAC PDUs on sub-frames the ISCH types as MAC.2 The difference between the two channels is urgency: FACCH preempts capacity for time-critical messages, while SACCH trickles slower signalling across the superframe.
Fast versus slow
FACCH is the fast path: it borrows a voice frame’s slot to inject an urgent MAC PDU, trading a moment of speech for immediate signalling. It is where the messages that must not wait travel — a call’s PTT open (which in Phase 2 also carries the ALGID/KID/MI encryption sync), grant updates that retune following radios mid-call, and end-of-transmission. SACCH is the slow path: it occupies sub-frames set aside for signalling and carries messages that can be spread out over the superframe, where stealing voice capacity is not warranted. The voice frames a FACCH steals are simply not decoded for that slot, so a decoder that ignores the associated control channels would still hear the call — just without following its state.
A practical consequence in GopherTrunk: because the Phase 2 encryption sync is delivered in the
MAC_PTT message rather than as a distinct opcode, a caller that needs to tell PTT signalling from
ordinary FACCH/SACCH signalling must inspect the sub-frame’s SlotType, not the MAC PDU alone. The
superframe decoder therefore pairs each decoded PDU with the slot
type it rode in. The Motorola talker alias is a FACCH-S message: it rides the fast associated control
channel during call hangtime, as the header/data
vendor MAC opcodes 0x91 and 0x95.
Outer FEC
Whatever the associated channel, the signalling payload is protected by the P25 Phase 2 FEC stack: the inner ½-rate trellis code that a Viterbi decoder inverts, and the outer Reed-Solomon RS(24,16,9) code that detects — or, in the corrector mode, repairs up to four symbol errors in — the recovered MAC PDU. The RS check is also what makes the descrambler’s blind slot-offset probe safe, since only the correct phase yields zero syndromes. This is the same coding pairing the Phase 2 control channel uses, so signalling that rides alongside voice is protected exactly as strongly as signalling on a dedicated control channel.
Relevance to SDR
GopherTrunk does not carve out separate SACCH and FACCH code paths; both surface as MAC PDUs on
MAC-typed sub-frames, distinguished by SlotType, and are decoded by the shared Phase 2 MAC chain in
internal/radio/p25/phase2. The talker-alias FACCH-S handling lives in talker_alias.go and
mac_vendor.go. Following these associated channels is what turns a decoded Phase 2 call from bare audio
into a fully attributed event — who is talking, on what talkgroup, encrypted or not. The spec is
TIA-102.BBAB.
Sources
-
Project 25 — Wikipedia, on P25 Phase 2 traffic-channel signalling. ↩
-
Associated control channel — Wikipedia, on slow and fast associated control channels that carry signalling in-band with voice. ↩