Firmware for Nucleo boards for the SLab system Description at http://r6500.blogspot.com.es/2018/02/slab-first-release.html All associated files at https://github.com/R6500/SLab

Dependencies:   mbed

Committer:
vic20
Date:
Sat Feb 10 09:43:16 2018 +0000
Revision:
0:39a545e08ccd
Child:
1:d81bef65eece
First commit (Version 1.10)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vic20 0:39a545e08ccd 1 This document describes the communication protocol between
vic20 0:39a545e08ccd 2 Python and the Hardware Board
vic20 0:39a545e08ccd 3
vic20 0:39a545e08ccd 4 Protocol is Client/Server
vic20 0:39a545e08ccd 5 The board operates as the server and responds to requests
vic20 0:39a545e08ccd 6 from the Python code in n a PC
vic20 0:39a545e08ccd 7
vic20 0:39a545e08ccd 8 All communications use a simple XOR on all bytes to generate
vic20 0:39a545e08ccd 9 the CRC. The CRC is the last byte send in any transmission.
vic20 0:39a545e08ccd 10
vic20 0:39a545e08ccd 11 Format of data:
vic20 0:39a545e08ccd 12 byte : 1 Byte
vic20 0:39a545e08ccd 13 u16 : 2 Bytes little endian ( L followed by H)
vic20 0:39a545e08ccd 14 float : 3 Bytes : Byte : Exponent Offset 128
vic20 0:39a545e08ccd 15 u16 : Mantissa Offset 20000
vic20 0:39a545e08ccd 16
vic20 0:39a545e08ccd 17 Before each command:
vic20 0:39a545e08ccd 18
vic20 0:39a545e08ccd 19 P : init P-TxCRC,P-RxCRC
vic20 0:39a545e08ccd 20 B : init B-RxCRC,B-TxCRC
vic20 0:39a545e08ccd 21
vic20 0:39a545e08ccd 22 COMMANDS ---------------------------------------------------
vic20 0:39a545e08ccd 23
vic20 0:39a545e08ccd 24 Command 'F' Get Firmware String
vic20 0:39a545e08ccd 25 This command is the only one without CRC
vic20 0:39a545e08ccd 26
vic20 0:39a545e08ccd 27 P -> B : byte('F')
vic20 0:39a545e08ccd 28 B -> P : Firmware String than ends with "\n\r"
vic20 0:39a545e08ccd 29
vic20 0:39a545e08ccd 30
vic20 0:39a545e08ccd 31 Command 'M' Get Magic Code
vic20 0:39a545e08ccd 32
vic20 0:39a545e08ccd 33 P -> B : byte('M')
vic20 0:39a545e08ccd 34 P-TxCRC
vic20 0:39a545e08ccd 35 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 36 B -> P : ECRC
vic20 0:39a545e08ccd 37 B -> P : B-TxCRC
vic20 0:39a545e08ccd 38 P : Check CRC
vic20 0:39a545e08ccd 39 else
vic20 0:39a545e08ccd 40 B -> P : ACK
vic20 0:39a545e08ccd 41 B -> P : 4 byte magic code
vic20 0:39a545e08ccd 42 B-TxCRC
vic20 0:39a545e08ccd 43 P : Check CRC
vic20 0:39a545e08ccd 44 P : Check Magic
vic20 0:39a545e08ccd 45
vic20 0:39a545e08ccd 46
vic20 0:39a545e08ccd 47 Command 'I' Get Board Capabilities
vic20 0:39a545e08ccd 48
vic20 0:39a545e08ccd 49 P -> B : byte('I')
vic20 0:39a545e08ccd 50 P-TxCRC
vic20 0:39a545e08ccd 51 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 52 B -> P : ECRC
vic20 0:39a545e08ccd 53 B -> P : B-TxCRC
vic20 0:39a545e08ccd 54 P : Check CRC
vic20 0:39a545e08ccd 55 else
vic20 0:39a545e08ccd 56 B -> P : ACK
vic20 0:39a545e08ccd 57 B -> P : byte(Number of DACs)
vic20 0:39a545e08ccd 58 byte(Number of ADCs)
vic20 0:39a545e08ccd 59 u16(Unified Buffer Size)
vic20 0:39a545e08ccd 60 float(Max Sample Time)
vic20 0:39a545e08ccd 61 float(Min Sample Time)
vic20 0:39a545e08ccd 62 float(VDD)
vic20 0:39a545e08ccd 63 float(Max Sample Freq)
vic20 0:39a545e08ccd 64 float(VREF)
vic20 0:39a545e08ccd 65 byte(dac_bits)
vic20 0:39a545e08ccd 66 byte(adc_bits)
vic20 0:39a545e08ccd 67 B-TxCRC
vic20 0:39a545e08ccd 68
vic20 0:39a545e08ccd 69
vic20 0:39a545e08ccd 70 Command 'L' Get Pin List
vic20 0:39a545e08ccd 71
vic20 0:39a545e08ccd 72 P -> B : byte('L')
vic20 0:39a545e08ccd 73 P-TxCRC
vic20 0:39a545e08ccd 74 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 75 B -> P : ECRC
vic20 0:39a545e08ccd 76 B -> P : B-TxCRC
vic20 0:39a545e08ccd 77
vic20 0:39a545e08ccd 78 else
vic20 0:39a545e08ccd 79 B -> P : ACK
vic20 0:39a545e08ccd 80 Pin list String that ends with $
vic20 0:39a545e08ccd 81 B-TxCRC
vic20 0:39a545e08ccd 82
vic20 0:39a545e08ccd 83 Command 'A' ADC Read
vic20 0:39a545e08ccd 84
vic20 0:39a545e08ccd 85 P -> B : byte('A')
vic20 0:39a545e08ccd 86 byte(channel)
vic20 0:39a545e08ccd 87 P-TxCRC
vic20 0:39a545e08ccd 88 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 89 B -> P : ECRC
vic20 0:39a545e08ccd 90 B-TxCRC
vic20 0:39a545e08ccd 91
vic20 0:39a545e08ccd 92 else if not valid channel
vic20 0:39a545e08ccd 93 B -> P : NACK
vic20 0:39a545e08ccd 94 B-TxCRC
vic20 0:39a545e08ccd 95
vic20 0:39a545e08ccd 96 else
vic20 0:39a545e08ccd 97 B -> P : ACK
vic20 0:39a545e08ccd 98 U16(Read ADC Value)
vic20 0:39a545e08ccd 99 B-TxCRC
vic20 0:39a545e08ccd 100
vic20 0:39a545e08ccd 101
vic20 0:39a545e08ccd 102 Command 'D' DAC Write
vic20 0:39a545e08ccd 103
vic20 0:39a545e08ccd 104 P -> B : byte('D')
vic20 0:39a545e08ccd 105 byte(channel)
vic20 0:39a545e08ccd 106 u16(value)
vic20 0:39a545e08ccd 107 P-TxCRC
vic20 0:39a545e08ccd 108 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 109 B -> P : ECRC
vic20 0:39a545e08ccd 110 B-TxCRC
vic20 0:39a545e08ccd 111
vic20 0:39a545e08ccd 112 else if not valid channel
vic20 0:39a545e08ccd 113 B -> P : NACK
vic20 0:39a545e08ccd 114 B-TxCRC
vic20 0:39a545e08ccd 115 else
vic20 0:39a545e08ccd 116 B -> P : ACK
vic20 0:39a545e08ccd 117 B-TxCRC
vic20 0:39a545e08ccd 118
vic20 0:39a545e08ccd 119
vic20 0:39a545e08ccd 120 Command 'R' Set Sample Time
vic20 0:39a545e08ccd 121
vic20 0:39a545e08ccd 122 P -> B : byte('R')
vic20 0:39a545e08ccd 123 float(Sample Time)
vic20 0:39a545e08ccd 124 P-TxCRC
vic20 0:39a545e08ccd 125 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 126 B -> P : ECRC
vic20 0:39a545e08ccd 127 B-TxCRC
vic20 0:39a545e08ccd 128
vic20 0:39a545e08ccd 129 else if not valid sample time
vic20 0:39a545e08ccd 130 B -> P : NACK
vic20 0:39a545e08ccd 131 B-TxCRC
vic20 0:39a545e08ccd 132
vic20 0:39a545e08ccd 133 else
vic20 0:39a545e08ccd 134 B -> P : ACK
vic20 0:39a545e08ccd 135 B-TxCRC
vic20 0:39a545e08ccd 136
vic20 0:39a545e08ccd 137
vic20 0:39a545e08ccd 138 Command 'S' Set Storage
vic20 0:39a545e08ccd 139
vic20 0:39a545e08ccd 140 P -> B : byte('S')
vic20 0:39a545e08ccd 141 byte(Number Analog)
vic20 0:39a545e08ccd 142 byte(Number Digital)
vic20 0:39a545e08ccd 143 U16(Number Samples)
vic20 0:39a545e08ccd 144 P-TxCRC
vic20 0:39a545e08ccd 145 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 146 B -> P : ECRC
vic20 0:39a545e08ccd 147 B-TxCRC
vic20 0:39a545e08ccd 148
vic20 0:39a545e08ccd 149 else if not valid
vic20 0:39a545e08ccd 150 B -> P : NACK
vic20 0:39a545e08ccd 151 B-TxCRC
vic20 0:39a545e08ccd 152
vic20 0:39a545e08ccd 153 else
vic20 0:39a545e08ccd 154 B -> P : ACK
vic20 0:39a545e08ccd 155 B-TxCRC
vic20 0:39a545e08ccd 156
vic20 0:39a545e08ccd 157
vic20 0:39a545e08ccd 158 Command 'Y' Async Read
vic20 0:39a545e08ccd 159
vic20 0:39a545e08ccd 160 P -> B : byte('Y')
vic20 0:39a545e08ccd 161 P-TxCRC
vic20 0:39a545e08ccd 162 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 163 B -> P : ECRC
vic20 0:39a545e08ccd 164 B-TxCRC
vic20 0:39a545e08ccd 165 else
vic20 0:39a545e08ccd 166 B -> P : ACK
vic20 0:39a545e08ccd 167 <Dump In Buffer>
vic20 0:39a545e08ccd 168 B-TxCRC
vic20 0:39a545e08ccd 169
vic20 0:39a545e08ccd 170
vic20 0:39a545e08ccd 171 Command 'G' Triggered Read
vic20 0:39a545e08ccd 172
vic20 0:39a545e08ccd 173 P -> B : byte('G')
vic20 0:39a545e08ccd 174 U16(Trigger)
vic20 0:39a545e08ccd 175 Byte(mode)
vic20 0:39a545e08ccd 176 Byte(timeout)
vic20 0:39a545e08ccd 177 P-TxCRC
vic20 0:39a545e08ccd 178 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 179 B -> P : ECRC
vic20 0:39a545e08ccd 180 B-TxCRC
vic20 0:39a545e08ccd 181
vic20 0:39a545e08ccd 182 else if bad mode
vic20 0:39a545e08ccd 183 B -> P : NACK
vic20 0:39a545e08ccd 184 B-TxCRC
vic20 0:39a545e08ccd 185
vic20 0:39a545e08ccd 186 else
vic20 0:39a545e08ccd 187 B -> P : ACK
vic20 0:39a545e08ccd 188 <Dump Triggered In Buffer>
vic20 0:39a545e08ccd 189 B-TxCRC
vic20 0:39a545e08ccd 190
vic20 0:39a545e08ccd 191
vic20 0:39a545e08ccd 192
vic20 0:39a545e08ccd 193 Command 'P' Step Response
vic20 0:39a545e08ccd 194
vic20 0:39a545e08ccd 195 P -> B : byte('P')
vic20 0:39a545e08ccd 196 U16(Step Value)
vic20 0:39a545e08ccd 197 P-TxCRC
vic20 0:39a545e08ccd 198 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 199 B -> P : ECRC
vic20 0:39a545e08ccd 200 B-TxCRC
vic20 0:39a545e08ccd 201
vic20 0:39a545e08ccd 202 else
vic20 0:39a545e08ccd 203 B -> P : ACK
vic20 0:39a545e08ccd 204 <Dump In Buffer>
vic20 0:39a545e08ccd 205 B-TxCRC
vic20 0:39a545e08ccd 206
vic20 0:39a545e08ccd 207
vic20 0:39a545e08ccd 208
vic20 0:39a545e08ccd 209 Command 'W' Load Wavetable
vic20 0:39a545e08ccd 210
vic20 0:39a545e08ccd 211 P -> B : byte('W')
vic20 0:39a545e08ccd 212 U16(Table Size)
vic20 0:39a545e08ccd 213
vic20 0:39a545e08ccd 214 if bad Table Size
vic20 0:39a545e08ccd 215 B -> P : NACK
vic20 0:39a545e08ccd 216 B-TxCRC
vic20 0:39a545e08ccd 217
vic20 0:39a545e08ccd 218 else
vic20 0:39a545e08ccd 219 P -> B : Table of U16 values
vic20 0:39a545e08ccd 220 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 221 B -> P : ECRC
vic20 0:39a545e08ccd 222 B-TxCRC
vic20 0:39a545e08ccd 223
vic20 0:39a545e08ccd 224 B -> P : ACK
vic20 0:39a545e08ccd 225 B-TxCRC
vic20 0:39a545e08ccd 226
vic20 0:39a545e08ccd 227 Command 'w' Load Secondary Wavetable
vic20 0:39a545e08ccd 228
vic20 0:39a545e08ccd 229 P -> B : byte('W')
vic20 0:39a545e08ccd 230 U16(Table Size)
vic20 0:39a545e08ccd 231
vic20 0:39a545e08ccd 232 if bad Table Size
vic20 0:39a545e08ccd 233 B -> P : NACK
vic20 0:39a545e08ccd 234 B-TxCRC
vic20 0:39a545e08ccd 235
vic20 0:39a545e08ccd 236 else
vic20 0:39a545e08ccd 237 P -> B : Table of U16 values
vic20 0:39a545e08ccd 238 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 239 B -> P : ECRC
vic20 0:39a545e08ccd 240 B-TxCRC
vic20 0:39a545e08ccd 241
vic20 0:39a545e08ccd 242 B -> P : ACK
vic20 0:39a545e08ccd 243 B-TxCRC
vic20 0:39a545e08ccd 244
vic20 0:39a545e08ccd 245 Command 'V' Wave Response
vic20 0:39a545e08ccd 246
vic20 0:39a545e08ccd 247 P -> B : byte('V')
vic20 0:39a545e08ccd 248 U16(Number of Waves)
vic20 0:39a545e08ccd 249 P-TxCRC
vic20 0:39a545e08ccd 250 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 251 B -> P : ECRC
vic20 0:39a545e08ccd 252 B-TxCRC
vic20 0:39a545e08ccd 253
vic20 0:39a545e08ccd 254 else
vic20 0:39a545e08ccd 255 B -> P : ACK
vic20 0:39a545e08ccd 256 <Dump In buffer>
vic20 0:39a545e08ccd 257 B-TxCRC
vic20 0:39a545e08ccd 258
vic20 0:39a545e08ccd 259 Command 'v' Dual Wave Response
vic20 0:39a545e08ccd 260
vic20 0:39a545e08ccd 261 P -> B : byte('V')
vic20 0:39a545e08ccd 262 U16(Number of Waves)
vic20 0:39a545e08ccd 263 P-TxCRC
vic20 0:39a545e08ccd 264 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 265 B -> P : ECRC
vic20 0:39a545e08ccd 266 B-TxCRC
vic20 0:39a545e08ccd 267
vic20 0:39a545e08ccd 268 else
vic20 0:39a545e08ccd 269 B -> P : ACK
vic20 0:39a545e08ccd 270 <Dump In buffer>
vic20 0:39a545e08ccd 271 B-TxCRC
vic20 0:39a545e08ccd 272
vic20 0:39a545e08ccd 273 Command 'X' Single Wave Response
vic20 0:39a545e08ccd 274
vic20 0:39a545e08ccd 275 P -> B : byte('X')
vic20 0:39a545e08ccd 276 Byte(Channel to read)
vic20 0:39a545e08ccd 277 U16(Number of Waves)
vic20 0:39a545e08ccd 278 P-TxCRC
vic20 0:39a545e08ccd 279 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 280 B -> P : ECRC
vic20 0:39a545e08ccd 281 B-TxCRC
vic20 0:39a545e08ccd 282
vic20 0:39a545e08ccd 283 else
vic20 0:39a545e08ccd 284 B -> P : ACK
vic20 0:39a545e08ccd 285 <Dump In buffer>
vic20 0:39a545e08ccd 286 B-TxCRC
vic20 0:39a545e08ccd 287
vic20 0:39a545e08ccd 288 Command 'E' Soft Reset
vic20 0:39a545e08ccd 289
vic20 0:39a545e08ccd 290 P -> B : byte('E')
vic20 0:39a545e08ccd 291 P-TxCRC
vic20 0:39a545e08ccd 292 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 293 B -> P : ECRC
vic20 0:39a545e08ccd 294 B-TxCRC
vic20 0:39a545e08ccd 295 else
vic20 0:39a545e08ccd 296 B -> P : ACK
vic20 0:39a545e08ccd 297 B-TxCRC
vic20 0:39a545e08ccd 298
vic20 0:39a545e08ccd 299 Command 'H' Digital I/O Mode
vic20 0:39a545e08ccd 300
vic20 0:39a545e08ccd 301 P -> B : byte('H')
vic20 0:39a545e08ccd 302 byte(line)
vic20 0:39a545e08ccd 303 byte(mode)
vic20 0:39a545e08ccd 304 P-TxCRC
vic20 0:39a545e08ccd 305 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 306 B -> P : ECRC
vic20 0:39a545e08ccd 307 B-TxCRC
vic20 0:39a545e08ccd 308
vic20 0:39a545e08ccd 309 else if not valid channel or mode
vic20 0:39a545e08ccd 310 B -> P : NACK
vic20 0:39a545e08ccd 311 B-TxCRC
vic20 0:39a545e08ccd 312 else
vic20 0:39a545e08ccd 313 B -> P : ACK
vic20 0:39a545e08ccd 314 B-TxCRC
vic20 0:39a545e08ccd 315
vic20 0:39a545e08ccd 316 Command 'J' Digital I/O Write
vic20 0:39a545e08ccd 317
vic20 0:39a545e08ccd 318 P -> B : byte('J')
vic20 0:39a545e08ccd 319 byte(line)
vic20 0:39a545e08ccd 320 byte(value)
vic20 0:39a545e08ccd 321 P-TxCRC
vic20 0:39a545e08ccd 322 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 323 B -> P : ECRC
vic20 0:39a545e08ccd 324 B-TxCRC
vic20 0:39a545e08ccd 325
vic20 0:39a545e08ccd 326 else if not valid channel
vic20 0:39a545e08ccd 327 B -> P : NACK
vic20 0:39a545e08ccd 328 B-TxCRC
vic20 0:39a545e08ccd 329 else
vic20 0:39a545e08ccd 330 B -> P : ACK
vic20 0:39a545e08ccd 331 B-TxCRC
vic20 0:39a545e08ccd 332
vic20 0:39a545e08ccd 333 Command 'K' Digital I/O Read
vic20 0:39a545e08ccd 334
vic20 0:39a545e08ccd 335 P -> B : byte('J')
vic20 0:39a545e08ccd 336 byte(line)
vic20 0:39a545e08ccd 337 P-TxCRC
vic20 0:39a545e08ccd 338 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 339 B -> P : ECRC
vic20 0:39a545e08ccd 340 B-TxCRC
vic20 0:39a545e08ccd 341
vic20 0:39a545e08ccd 342 else if not valid channel
vic20 0:39a545e08ccd 343 B -> P : NACK
vic20 0:39a545e08ccd 344 B-TxCRC
vic20 0:39a545e08ccd 345 else
vic20 0:39a545e08ccd 346 B -> P : ACK
vic20 0:39a545e08ccd 347 byte(line value)
vic20 0:39a545e08ccd 348 B-TxCRC
vic20 0:39a545e08ccd 349
vic20 0:39a545e08ccd 350 Command 'N' Number of ADC readings
vic20 0:39a545e08ccd 351
vic20 0:39a545e08ccd 352 P -> B : byte('N')
vic20 0:39a545e08ccd 353 u16(n)
vic20 0:39a545e08ccd 354 P-TxCRC
vic20 0:39a545e08ccd 355 B : if P-CRC != B-RxCRC
vic20 0:39a545e08ccd 356 B -> P : ECRC
vic20 0:39a545e08ccd 357 B-TxCRC
vic20 0:39a545e08ccd 358 else
vic20 0:39a545e08ccd 359 B -> P : ACK
vic20 0:39a545e08ccd 360 B-TxCRC
vic20 0:39a545e08ccd 361
vic20 0:39a545e08ccd 362 <Dump In Buffer>
vic20 0:39a545e08ccd 363 if overrun
vic20 0:39a545e08ccd 364 B -> P : TRAN_OVERRUN
vic20 0:39a545e08ccd 365
vic20 0:39a545e08ccd 366 else
vic20 0:39a545e08ccd 367 B -> P : TRAN_OK
vic20 0:39a545e08ccd 368 Byte(Number Analog)
vic20 0:39a545e08ccd 369 Byte(Number Digital)
vic20 0:39a545e08ccd 370 U16(Number Samples)
vic20 0:39a545e08ccd 371 All Samples in U16
vic20 0:39a545e08ccd 372
vic20 0:39a545e08ccd 373 <Dump Triggered In Buffer>
vic20 0:39a545e08ccd 374 if overrun
vic20 0:39a545e08ccd 375 B -> P : TRAN_OVERRUN
vic20 0:39a545e08ccd 376
vic20 0:39a545e08ccd 377 if timeout
vic20 0:39a545e08ccd 378 B -> P : TRAN_TIMEOUT
vic20 0:39a545e08ccd 379
vic20 0:39a545e08ccd 380 else
vic20 0:39a545e08ccd 381 B -> P : TRAN_OK
vic20 0:39a545e08ccd 382 Byte(Number Analog)
vic20 0:39a545e08ccd 383 Byte(Number Digital)
vic20 0:39a545e08ccd 384 U16(Number Samples)
vic20 0:39a545e08ccd 385 All Samples in U16
vic20 0:39a545e08ccd 386