content/hp34970a_protocol.rst

changeset 111
25cae2c53694
parent 69
56bcb94f6ff5
child 115
6b6e13653348
equal deleted inserted replaced
110:64b852fb7470 111:25cae2c53694
5 :Author: David Douard 5 :Author: David Douard
6 :Category: Electronics 6 :Category: Electronics
7 :Tags: HP, 34970A, DMM, repair, test equipment 7 :Tags: HP, 34970A, DMM, repair, test equipment
8 :series: HP 34970A repair 8 :series: HP 34970A repair
9 :JavaScripts: default.js, WaveDrom.js 9 :JavaScripts: default.js, WaveDrom.js
10 10
11 In order to build a replacement display for the HP34970A data 11 In order to build a replacement display for the HP34970A data
12 acquisition unit, I needed to understand the communication protocol 12 acquisition unit, I needed to understand the communication protocol
13 between the CPU board and the front panel assembly. 13 between the CPU board and the front panel assembly.
14 14
15 General description 15 General description
26 - A4 is the (optional) internal 6.5 digits DMM. 26 - A4 is the (optional) internal 6.5 digits DMM.
27 27
28 .. image:: {filename}/images/hp34970a/block_diagram.svg 28 .. image:: {filename}/images/hp34970a/block_diagram.svg
29 :alt: System Block Diagram of the HP34970A. 29 :alt: System Block Diagram of the HP34970A.
30 30
31 31
32 The commnucation between the different system blocks is done with 32 The commnucation between the different system blocks is done with
33 asynchronous serial links. They use the rather uncommon bit rate of 33 asynchronous serial links. They use the rather uncommon bit rate of
34 187500 baud, with a classic 8N1 schema. 34 187500 baud, with a classic 8N1 schema.
35 35
36 36
54 not acknowledge a received byte, but sending a SoT instead of the 54 not acknowledge a received byte, but sending a SoT instead of the
55 expected ACK value, 55 expected ACK value,
56 56
57 - acknowledge values are: 57 - acknowledge values are:
58 58
59 - 0x99 as a response to the SoT, 59 - one-complement of the received SoT byte, so
60
61 - 0x99 for the 0x66 SoT byte and
62 - 0xCC for the 0x33 SoT byte.
60 63
61 - 0x00 otherise 64 - 0x00 otherise
62 65
66 - a special packet is sent by the Display Panel at startup, which SoT value is
67 ``0x33``, which does not seem to follow the general pattern in which the first
68 value after the SoT byte is the number of arguments.
69
70 Initialization sequence
71 -----------------------
72
73 The initialization transmission is:
74
75 .. wavedrom::
76
77 { signal: [
78 {name: "CPU", wave: "zz5x5x5xx", data: ["0xCC", "0x00", "0x00"]},
79 {name: "DP", wave: "z3x4x4x3x", data: ["0x33", "0x02", "0x00", "0x55"]},
80 ]}
81
82 If a key is pressed during while powering the unit on, then the initialization
83 of the Display Panel is frozen (with all elements of the display lit) until the
84 key is released. In this case, the initialization packet adds the key code of
85 that key, typically used with the Shift key pressed in to force a full test of
86 the device (in this datagram, ``0x0C`` is the keycode of the Shift key):
87
88 .. wavedrom::
89
90 { signal: [
91 {name: "CPU", wave: "zz5x5x5x5xx", data: ["0xCC", "0x00", "0x00", "0x00"]},
92 {name: "DP", wave: "z3x4x4x4x3x", data: ["0x33", "0x02", "0xFF", "0x0C", "0x55"]},
93 ]}
94
95
96 Shutdown sequence
97 -----------------
98
99 .. wavedrom::
100
101 { signal: [
102 {name: "Rx", wave: "z3x4x44|=4", data: ["0x66", "0x86", "0x55", "0x55","0x55"] },
103 {name: "Tx", wave: "zx5x5xx", data: ["0x99", "0x00"] },
104 ]}
105
106
107 CPU -> DP trasmission
108 ---------------------
63 109
64 The CPU->DP transmission protocol looks like: 110 The CPU->DP transmission protocol looks like:
65 111
66 .. wavedrom:: 112 .. wavedrom::
67 113
74 ie. without sending the EoT byte, eg.: 120 ie. without sending the EoT byte, eg.:
75 121
76 .. wavedrom:: 122 .. wavedrom::
77 123
78 { signal: [ 124 { signal: [
79 {name: "Rx", wave: "z3x4x4x|=x3x4x|3x", 125 {name: "Rx", wave: "z3x4x4x|=x3x4x|3x",
80 data: ["0x66", "0x0C", "0x03", "D3", "0x66", "0x0A", "0x55"] }, 126 data: ["0x66", "0x0C", "0x03", "D3", "0x66", "0x0A", "0x55"] },
81 {name: "Tx", wave: "zx5x5x5x|5x5x5x|x", 127 {name: "Tx", wave: "zx5x5x5x|5x5x5x|x",
82 data: ["0x99", "0x00", "0x00", "0x00", "0x99", "0x00"] }, 128 data: ["0x99", "0x00", "0x00", "0x00", "0x99", "0x00"] },
83 ]} 129 ]}
84 130
85 131
132 DP -> CPU transmission
133 ----------------------
134
86 When the user press a key on the front panel, a slightly simpler "packet transmission" occurs: 135 When the user press a key on the front panel, a slightly simpler "packet transmission" occurs:
87 136
88 .. wavedrom:: 137 .. wavedrom::
89 138
90 { signal: [ 139 { signal: [
91 {name: "Rx", wave: "zz5x5xx", data: ["0x99", "0x00"]}, 140 {name: "Rx", wave: "zz5x5xx", data: ["0x99", "0x00"]},
92 {name: "Tx", wave: "z3x4x3x", data: ["0x66", "KP", "0x55"]}, 141 {name: "Tx", wave: "z3x4x3x", data: ["0x66", "KP", "0x55"]},
93 ]} 142 ]}
94 143
144
145 Commands
146 ========
147
148 The known command bytes sent by the CPU for now are:
149
150 :0x00: show text on the main display. N arguments; the characters to display.
151
152 :0x0C: show text in the 'channels' area. 3 arguments; the digits to display.
153
154 :0x0A: indicators (or flags) to display. 4 arguments; the flag bytes.
155
156 :0x08: to set an indicator in low bright mode. 1 argument; the number of the
157 indicator dimm.
158
159 :0x09: to set an indicator in hight bright mode. 1 argument; the number of the
160 indicator to highlight.
161
162 :0x01: clear the 'shift' button. Typically sent as ``0x01 0x01 0x0E``. 1
163 argument; 0x0E to clear the 'shift' flag. Other values unknown.
164
165 :0x02: might be a reset or clear for the front panel (typically sent as
166 ``0x02 0x01 0x0C`` packet). 1 argument; unknown.
167
168 :0x86: shutdown. 0 argument.
169
170 :0x0D: set char at pos dimm (eg 0D 01 02 55 = cursor on the 3rd char)
95 171
96 Sending data to the main display 172 Sending data to the main display
97 ================================ 173 ================================
98 174
99 The main display consist in 13 17-segments digits, in which the 175 The main display consist in 13 17-segments digits, in which the
102 ",", ":" and ";"). Punctuation signs are also very close to the 178 ",", ":" and ";"). Punctuation signs are also very close to the
103 preceding chracters. 179 preceding chracters.
104 180
105 .. image:: {filename}/images/hp34970a/digit.jpg 181 .. image:: {filename}/images/hp34970a/digit.jpg
106 :alt: 17-segments digit of the main display. 182 :alt: 17-segments digit of the main display.
107 183
108 The command used to send text to the main display is ``0x00``. The 184 The command used to send text to the main display is ``0x00``. The
109 character ``0x09`` (tabulation) has a special meaning: it marks the 185 character ``0x09`` (tabulation) has a special meaning: it marks the
110 beginning and the end of a part of the text to be displayed darker 186 beginning and the end of a part of the text to be displayed darker
111 than the usual. This is used to emphasis a portion of the displayed 187 than the usual. This is used to emphasis a portion of the displayed
112 text. Also, as the punctuation signs do not consume a digit, the 188 text. Also, as the punctuation signs do not consume a digit, the
137 { signal: [ 213 { signal: [
138 {name: "Rx", wave: "z344====3x", 214 {name: "Rx", wave: "z344====3x",
139 data: ["0x66", "0x0A", "0x04", "F1", "F2", "F3", "F4", "0x55"]} 215 data: ["0x66", "0x0A", "0x04", "F1", "F2", "F3", "F4", "0x55"]}
140 ]} 216 ]}
141 217
142 Then the flags I've identified so far are: 218 The 29 flags I've identified are (should be complete):
143 219
144 .. wavedrom:: 220 .. wavedrom::
145 221
146 { signal: [ 222 { signal: [
147 {name: "bit", wave: "z========z", 223 {name: "bit", wave: "z========z",
148 data: ["7", "6", "5", "4", "3", "2", "1", "0"]}, 224 data: ["7", "6", "5", "4", "3", "2", "1", "0"]},
149 225
150 {name: "F1", wave: "z=3333333z", 226 {name: "F1", wave: "z=3333333z",
151 data: ["", "HI", "Alarm", "LO", "Channels", "Ch. frame", "Mx+B", "<Bell>"]}, 227 data: ["Al. frame", "HI", "Alarm", "LO", "Channel", "Ch. frame", "Mx+B", "<Bell>"]},
152 {name: "F2", wave: "z===33333z", 228 {name: "F2", wave: "z===33333z",
153 data: ["", "", "", "4W", "1", "3", "4", "2"]}, 229 data: ["AVG", "", "OC", "4W", "1", "3", "4", "2"]},
154 {name: "F3", wave: "z========z", 230 {name: "F3", wave: "z========z",
155 data: ["", "", "", "", "", "", "", ""]}, 231 data: ["ERROR", "EXT", "ONCE", "", "MEM", "LAST", "MIN", "MAX"]},
156 {name: "F4", wave: "z=3=333==z", 232 {name: "F4", wave: "z=3=333==z",
157 data: ["", "CONFIG", "", "MON", "VIEW", "*", "", ""]}, 233 data: ["", "CONFIG", "SCAN", "MON", "VIEW", "*", "ADRS", "REMOTE"]},
158 ], 234 ],
159 config: { hscale: 2 }, 235 config: { hscale: 2 },
160 } 236 }
161 237
162
163
164
165 238
166 Keypad 239 Keypad
167 ====== 240 ======
168 241
169 Note that the front panel sends a "key press event" and a "key 242 the keycode byte consists in:
170 released event", depending on the value of the bit 7:
171
172 :0: key pressed
173 :1: key released
174
175 The bit 8 of the key event byte is set high for the knob.
176 243
177 .. wavedrom:: 244 .. wavedrom::
178 245
179 {signal: [ 246 {signal: [
180 247
181 {name: "bit", wave: "z========z", 248 {name: "bit", wave: "z========z",
182 data: ["7", "6", "5", "4", "3", "2", "1", "0"]}, 249 data: ["7", "6", "5", "4", "3", "2", "1", "0"]},
183 {name: "KP", wave: "z34=.....z", 250 {name: "KP", wave: "z344=....z",
184 data: ["Knob", "Key", "Key Code"]}, 251 data: ["Knob", "Rel.", "Shift", "Key Code"]},
185 ], 252 ],
186 config: { hscale: 1 }, 253 config: { hscale: 1 },
187 } 254 }
255
256 :Bit 5: is set when the key has been pressed while 'shift' indicator was stil
257 active.
258
259 :Bit 6: is set when the key is released, and clear for the key pressed event.
260
261 :Bit 7: of the key event byte is set high for the knob key events.
188 262
189 263
190 The key codes are: 264 The key codes are:
191 265
192 :0x00: View 266 :0x00: View
207 :0x0F: Right 281 :0x0F: Right
208 282
209 :0x10: Advanced 283 :0x10: Advanced
210 :0x11: Step 284 :0x11: Step
211 285
212 For the knob (including the "Knob" bit): 286 :0x80: Knob right
213 :0x80: Knob left 287 :0x81: Knob left
214 :0x81: Knob right

mercurial