--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content/hp34970a_protocol.rst Sun Sep 18 22:40:28 2016 +0200 @@ -0,0 +1,214 @@ +========================================================== + HP 34970A Data Acquisition Unit - communication protocol +========================================================== + +:Author: David Douard +:Category: Electronics +:Tags: HP, 34970A, DMM, repair, test equipment +:series: HP 34970A repair +:JavaScripts: default.js, WaveDrom.js + +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. + +.. image:: {filename}/images/hp34970a/block_diagram.svg + :alt: 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: + +.. wavedrom:: + + { signal: [ + {name: "Rx", wave: "z3x4x4x=x=x|.=x3x", data: ["0x66", "CMD", "LEN", "D0", "D1", "Dn", "0x55"] }, + {name: "Tx", wave: "zx5x5x5x5x5x|.5x.", data: ["0x99", "0x00","0x00", "0x00", "0x00", "0x00"] }, + ]} + +Two (or more) datagrams can be transmitted in a single "transmission", +ie. without sending the EoT byte, eg.: + +.. wavedrom:: + + { signal: [ + {name: "Rx", wave: "z3x4x4x|=x3x4x|3x", + data: ["0x66", "0x0C", "0x03", "D3", "0x66", "0x0A", "0x55"] }, + {name: "Tx", wave: "zx5x5x5x|5x5x5x|x", + data: ["0x99", "0x00", "0x00", "0x00", "0x99", "0x00"] }, + ]} + + +When the user press a key on the front panel, a slightly simpler "packet transmission" occurs: + +.. wavedrom:: + + { signal: [ + {name: "Rx", wave: "zz5x5xx", data: ["0x99", "0x00"]}, + {name: "Tx", wave: "z3x4x3x", data: ["0x66", "KP", "0x55"]}, + ]} + + +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. + +.. image:: {filename}/images/hp34970a/digit.jpg + :alt: 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. + +.. image:: {filename}/images/hp34970a/channel.jpg + :alt: The display area dedicated to current channel. + :align: center + +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): + +.. wavedrom:: + + { signal: [ + {name: "Rx", wave: "z344====3x", + data: ["0x66", "0x0A", "0x04", "F1", "F2", "F3", "F4", "0x55"]} + ]} + +Then the flags I've identified so far are: + +.. wavedrom:: + + { signal: [ + {name: "bit", wave: "z========z", + data: ["7", "6", "5", "4", "3", "2", "1", "0"]}, + + {name: "F1", wave: "z=3333333z", + data: ["", "HI", "Alarm", "LO", "Channels", "Ch. frame", "Mx+B", "<Bell>"]}, + {name: "F2", wave: "z===33333z", + data: ["", "", "", "4W", "1", "3", "4", "2"]}, + {name: "F3", wave: "z========z", + data: ["", "", "", "", "", "", "", ""]}, + {name: "F4", wave: "z=3=33===z", + data: ["", "CONFIG", "", "MON", "VIEW", "", "", ""]}, + ], + config: { hscale: 2 }, + } + + + + + +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. + +.. wavedrom:: + + {signal: [ + + {name: "bit", wave: "z========z", + data: ["7", "6", "5", "4", "3", "2", "1", "0"]}, + {name: "KP", wave: "z34=.....z", + data: ["Knob", "Key", "Key Code"]}, + ], + config: { hscale: 1 }, + } + + +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