Posted on dim. 18 septembre 2016 (last updated on lun. 19 septembre 2016)

In order to build a replacement display for the HP34970A data acquisition unit, I needed to understand the communication protocol between the CPU board and the front panel assembly.

General description

The unit is built with four boards:

  • A1 is the main bard, with the PSU, the main controller and the floating logic,
  • A2 is the front panel with the display and the keypad,
  • A3 is the backplane on which I/O modules are plugged,
  • A4 is the (optional) internal 6.5 digits DMM.
System Block Diagram of the HP34970A.

The commnucation between the different system blocks is done with asynchronous serial links. They use the rather uncommon bit rate of 187500 baud, with a classic 8N1 schema.

The CPU <-> Display Panel communication protocol

The communication protocol between the main controller (CPU) board and the display panel (DP) consists in "datagrams" sent using the general pattern:

  • when a device (CPU or DP) wants to take control of the communication bus, it sends a Start of Transmission (SoT) signal (0x66),
  • each sent char (but the end of transmission) must be acknowledged (ack value may vary),
  • at the end of a communication, the initiator send a "End of Transmission" (EoT, 0x55). This sent value is not acknowledged.
  • the keyboard can interrupt a CPU->DP communication in progress by not acknowledge a received byte, but sending a SoT instead of the expected ACK value,
  • acknowledge values are:
    • 0x99 as a response to the SoT,
    • 0x00 otherise

The CPU->DP transmission protocol looks like:

Two (or more) datagrams can be transmitted in a single "transmission", ie. without sending the EoT byte, eg.:

When the user press a key on the front panel, a slightly simpler "packet transmission" occurs:

Sending data to the main display

The main display consist in 13 17-segments digits, in which the character is displayed by a main 14-digits, and the punctuation with 3 segments (2 dots and a comma, allowing to represent the signs ".", ",", ":" and ";"). Punctuation signs are also very close to the preceding chracters.

17-segments digit of the main display.

The command used to send text to the main display is 0x00. The character 0x09 (tabulation) has a special meaning: it marks the beginning and the end of a part of the text to be displayed darker than the usual. This is used to emphasis a portion of the displayed text. Also, as the punctuation signs do not consume a digit, the displayed text can be larger than 13 characters.

Sending data to the Channels display

This area only allows to display 3 7-segments digits. The command is 0x0C, the payload is thus 3 bytes long.

The display area dedicated to current channel.

Flags

The display also has several flags. Display flags are selected by sending the 0x0A command. The payload is 4 bytes long. Each bit of these 4 bytes represent a flag on the display.

Let's consider the following (we don't represent the acknowledgements here):

Then the flags I've identified so far are:

Keypad

Note that the front panel sends a "key press event" and a "key released event", depending on the value of the bit 7:

0:key pressed
1:key released

The bit 8 of the key event byte is set high for the knob.

The key codes are:

0x00:View
0x01:Mon
0x02:Sto/Rcl
0x03:Scan
0x04:Alarm
0x05:Mx+B
0x06:Measure
0x07:Interval
0x08:Card Reset
0x09:Close
0x0A:Open
0x0B:Read
0x0C:Shift
0x0D:Write
0x0E:Left
0x0F:Right
0x10:Advanced
0x11:Step

For the knob (including the "Knob" bit): :0x80: Knob left :0x81: Knob right