SLAU131V October   2004  – February 2020

 

  1.   1
    1.     2
    2.     3
    3.     4
    4.     5
    5.     6
  2.   7
    1.     8
    2.     9
  3.   10
    1.     11
    2.     12
    3.     13
      1.      14
    4.     15
      1.      16
      2.      17
      3.      18
      4.      19
        1.       20
        2.       21
      5.      22
      6.      23
      7.      24
    5.     25
      1.      26
      2.      27
    6.     28
      1.      29
      2.      30
      3.      31
      4.      32
    7.     33
      1.      34
      2.      35
    8.     36
  4.   37
    1.     38
      1.      39
      2.      40
        1.       41
        2.       42
        3.       43
        4.       44
        5.       45
          1.        46
    2.     47
    3.     48
      1.      49
      2.      50
        1.       51
        2.       52
        3.       53
      3.      54
        1.       55
        2.       56
    4.     57
    5.     58
    6.     59
  5.   60
    1.     61
    2.     62
    3.     63
    4.     64
    5.     65
      1.      66
      2.      67
    6.     68
      1.      69
      2.      70
      3.      71
        1.       72
      4.      73
    7.     74
      1.      75
        1.       76
        2.       77
        3.       78
        4.       79
        5.       80
      2.      81
      3.      82
    8.     83
      1.      84
      2.      85
      3.      86
        1.       87
      4.      88
      5.      89
      6.      90
      7.      91
      8.      92
      9.      93
    9.     94
      1.      95
      2.      96
      3.      97
    10.     98
      1.      99
      2.      100
    11.     101
    12.     102
      1.      103
      2.      104
    13.     105
      1.      106
  6.   107
    1.     108
    2.     109
      1.      110
    3.     111
    4.     112
    5.     113
    6.     114
    7.     115
    8.     116
    9.     117
    10.     118
    11.     119
    12.     120
  7.   121
    1.     122
    2.     123
      1.      124
    3.     125
      1.      126
      2.      127
        1.       128
        2.       129
      3.      130
      4.      131
      5.      132
      6.      133
      7.      134
        1.       135
      8.      136
      9.      137
      10.      138
      11.      139
    4.     140
    5.     141
      1.      142
      2.      143
      3.      144
    6.     145
      1.      146
    7.     147
      1.      148
    8.     149
    9.     150
      1.      151
      2.      152
    10.     153
  8.   154
    1.     155
    2.     156
    3.     157
    4.     158
      1.      159
    5.     160
      1.      161
      2.      162
      3.      163
      4.      164
  9.   165
    1.     166
    2.     167
    3.     168
    4.     169
      1.      170
      2.      171
      3.      172
        1.       173
        2.       174
        3.       175
      4.      176
      5.      177
      6.      178
      7.      179
      8.      180
      9.      181
      10.      182
      11.      183
      12.      184
      13.      185
      14.      186
      15.      187
        1.       188
        2.       189
        3.       190
      16.      191
        1.       192
      17.      193
      18.      194
      19.      195
      20.      196
      21.      197
      22.      198
      23.      199
      24.      200
      25.      201
      26.      202
      27.      203
      28.      204
      29.      205
      30.      206
      31.      207
      32.      208
      33.      209
      34.      210
      35.      211
    5.     212
      1.      213
      2.      214
      3.      215
      4.      216
      5.      217
      6.      218
        1.       219
        2.       220
          1.        221
        3.       222
          1.        223
      7.      224
        1.       225
          1.        226
        2.       227
          1.        228
          2.        229
          3.        230
          4.        231
            1.         232
            2.         233
          5.        234
          6.        235
        3.       236
          1.        237
        4.       238
        5.       239
          1.        240
        6.       241
        7.       242
      8.      243
        1.       244
        2.       245
          1.        246
          2.        247
      9.      248
        1.       249
          1.        250
        2.       251
          1.        252
          2.        253
        3.       254
        4.       255
          1.        256
        5.       257
        6.       258
      10.      259
      11.      260
        1.       261
        2.       262
        3.       263
      12.      264
        1.       265
        2.       266
        3.       267
        4.       268
        5.       269
        6.       270
        7.       271
          1.        272
          2.        273
          3.        274
          4.        275
        8.       276
      13.      277
        1.       278
        2.       279
        3.       280
        4.       281
    6.     282
      1.      283
      2.      284
      3.      285
    7.     286
      1.      287
      2.      288
      3.      289
    8.     290
      1.      291
      2.      292
      3.      293
        1.       294
      4.      295
        1.       296
        2.       297
        3.       298
        4.       299
          1.        300
        5.       301
          1.        302
        6.       303
          1.        304
          2.        305
      5.      306
        1.       307
        2.       308
        3.       309
        4.       310
        5.       311
      6.      312
        1.       313
      7.      314
        1.       315
    9.     316
      1.      317
      2.      318
      3.      319
        1.       320
        2.       321
        3.       322
        4.       323
      4.      324
        1.       325
      5.      326
    10.     327
    11.     328
      1.      329
      2.      330
      3.      331
      4.      332
      5.      333
    12.     334
      1.      335
      2.      336
  10.   337
    1.     338
    2.     339
    3.     340
      1.      341
      2.      342
  11.   343
    1.     344
    2.     345
    3.     346
      1.      347
  12.   348
    1.     349
    2.     350
    3.     351
    4.     352
  13.   353
    1.     354
    2.     355
      1.      356
      2.      357
    3.     358
      1.      359
      2.      360
      3.      361
      4.      362
    4.     363
      1.      364
      2.      365
        1.       366
        2.       367
    5.     368
    6.     369
      1.      370
      2.      371
    7.     372
    8.     373
    9.     374
      1.      375
      2.      376
      3.      377
    10.     378
    11.     379
    12.     380
    13.     381
      1.      382
      2.      383
      3.      384
      4.      385
      5.      386
      6.      387
        1.       388
  14.   389
    1.     390
    2.     391
      1.      392
      2.      393
      3.      394
      4.      395
      5.      396
      6.      397
      7.      398
      8.      399
      9.      400
      10.      401
      11.      402
      12.      403
      13.      404
      14.      405
      15.      406
      16.      407
    3.     408
      1.      409
      2.      410
      3.      411
      4.      412
    4.     413
      1.      414
      2.      415
      3.      416
      4.      417
      5.      418
      6.      419
      7.      420
  15.   421
    1.     422
    2.     423
  16.   424
    1.     425
    2.     426
      1.      427
        1.       428
      2.      429
        1.       430
      3.      431
        1.       432
      4.      433
        1.       434
      5.      435
        1.       436
      6.      437
        1.       438
      7.      439
        1.       440
  17.   441
    1.     442
      1.      443
    2.     444
      1.      445
      2.      446
      3.      447
      4.      448
      5.      449
      6.      450
  18.   451
    1.     452
  19.   453
    1.     454

Example 1. Reference Implementation of a CRC Calculation Function: example_c1.c

/*****************************************************************************/ /* Reference implementation of a CRC calculation function */ /* gen_crc is the interface function which should be called from the */ /* application. There is also a stand-alone test mode that can be used */ /* if _RUN_MAIN is defined. */ /*****************************************************************************/ /*---------------------------------------------------------------------------*/ /* This file does NOT implement a general-purpose CRC function. */ /* Specifically, it does not handle parameterization by initial value, bit */ /* reflection, or final XOR value. This implementation is intended only to */ /* implement the CRC funtions used by the linker for MSP430 CRC tables. The */ /* algorithms used by the linker are selected to match the CRC algorithms in */ /* the PRIME and IEEE 802.15.4-2006 standards. MSP430 crc hardware supports */ /* CRC16_802_15_4 (CRC_CCITT). To understand CRCs in general, especially */ /* what other parameters exist, see: */ /* */ /* "A Painless Guide To CRC Error Detection Algorithms" likely at: */ /* http://www.ross.net/crc/download/crc_v3.txt */ /* Author : Ross Williams (ross@guest.adelaide.edu.au.). */ /* Date : 3 June 1993. */ /* Status : Public domain (C code). */ /*---------------------------------------------------------------------------*/ #include <msp430.h> #include <stdio.h> #include <stdlib.h> #include <limits.h> /*---------------------------------------------------------------------------*/ /* These are the CRC algorithms supported by the linker. MPS430 crc hardware */ /* supports CRC16_802_15_4 (CRC_CCITT). These must match the values in */ /* crc_tbl.h */ /*---------------------------------------------------------------------------*/ #define CRC32_PRIME 0 #define CRC16_802_15_4 1 #define CRC16_ALT 2 #define CRC8_PRIME 3 typedef struct crc_config_t { int id; int degree; unsigned long poly; } crc_config_t; const crc_config_t crc_config[] = { { CRC32_PRIME, 32, 0x04c11db7 }, { CRC16_802_15_4, 16, 0x1021 }, { CRC16_ALT, 16, 0x8005 }, { CRC8_PRIME, 8, 0x07 } }; unsigned long crc_table[256] = { 0 }; const crc_config_t *find_config(int id) { size_t i; for (i = 0; i < sizeof(crc_config) / sizeof(*crc_config); i++) if (crc_config[i].id == id) return &crc_config[i]; fprintf(stderr, "invalid config id %d\n", id); exit(EXIT_FAILURE); return NULL; } /*---------------------------------------------------------------------------*/ /* Table-driven version */ /*---------------------------------------------------------------------------*/ unsigned long generate_mask(int degree) { unsigned long half = (1ul << (degree / 2)) - 1; return half << (degree / 2) | half; } void generate_crc_table(const crc_config_t *config) { int i, j; unsigned long bit, crc; unsigned long high_bit = (1ul << (config->degree - 1)); unsigned long mask = generate_mask(config->degree); for (i = 0; i < 256; i++) { crc = (unsigned long)i << config->degree - 8; for (j = 0; j < 8; j++) { bit = crc & high_bit; crc <<= 1; if (bit) crc^= config->poly; } crc_table[i] = crc & mask; } } /*****************************************************************************/ /* gen_crc - Return the CRC value for the data using the given CRC algorithm */ /* int id : identifies the CRC algorithm */ /* char *data : the data */ /* size_t len : the size of the data */ /*****************************************************************************/ unsigned long gen_crc(int id, const unsigned char *data, size_t len) { /*-----------------------------------------------------------------------*/ /* Note: this is not a general-purpose CRC function. It does not handle */ /* parameterization by initial value, bit reflection, or final XOR */ /* value. This CRC function is specialized to the CRC algorithms in the */ /* linker used for MSP430 CRC tables. */ /*-----------------------------------------------------------------------*/ /* This CRC function is not intended to be optimal; it is written such */ /* that it works and generates the same result on all 8-bit and 16-bit */ /* targets, including MSP430, other TI DSPs, and typical desktops. */ /*-----------------------------------------------------------------------*/ const crc_config_t *config = find_config(id); unsigned long crc = 0; unsigned long mask = generate_mask(config->degree); size_t i; generate_crc_table(config); for (i = 0; i < len; i++) { unsigned int datum = data[i]; /*--------------------------------------------------------------------*/ /* This loop handles 16-bit chars when we compile on 16-bit machines. */ /*--------------------------------------------------------------------*/ int n; for (n = 0; n < (CHAR_BIT / 8); n++) { unsigned long octet = ((datum >> (8 * n)) & 0xff); unsigned long term1 = (crc << 8); int idx = ((crc >> (config->degree - 8)) & 0xff) ^ octet; crc = term1 ^ crc_table[idx]; } } return crc & mask; } /*****************************************************************************/ /* main - If requested, compute the CRC of test data using each algorithm. */ /*****************************************************************************/ int main(void) { const unsigned char data[] = { 0, 'a', 0, 'b', 0, 'c', 0, 'd' }; /* CRC_8_PRIME: 0x70 */ /* CRC_16_802: 0x1bd3 */ /* CRC_32_PRIME: 0x4beab53b */ const unsigned char *p = (const unsigned char *)data; unsigned long crc; crc = gen_crc(CRC32_PRIME, p, sizeof data); printf("CRC_32_PRIME: %08lx\n", crc); crc = gen_crc(CRC8_PRIME, p, sizeof data); printf("CRC_8_PRIME: %02lx\n", crc); crc = gen_crc(CRC16_802_15_4, p, sizeof data); printf("CRC16_802_15_4: %04lx\n", crc); return 0; }