温湿度センサー HTU21D / CRC を行う / micro:bit / mbed

CRC を行ってみる。計算手順は単純だがなぜこれで正誤の判定ができるのかその理窟が分からない。

#include "MicroBit.h"
MicroBit uBit;

#define SHIFTED_DIVISOR 0x988000 // (2^8 + 2^5 + 2^4 + 1) << 15

uint8_t check_crc(uint8_t msb, uint8_t lsb, uint8_t crc){
    uint32_t divisor = SHIFTED_DIVISOR;
    
    // 測定値の上位 8 ビット、下位 8 ビット、CRC 値の順に並べて、
    uint32_t remainder = (uint32_t)msb<<16 | (uint32_t)lsb<<8 | (uint32_t)crc;
        
    for(int i=0; i<16; i++){
        // その左端から順番に 1 が立っているかどうかを調べて何かをする。
        if(remainder & (uint32_t)1<<(23-i)){
            remainder ^= divisor;
        }
        divisor >>= 1;        
    }
    // 最終的に 0 になれば正しく、0 以外なら誤り。
    return (uint8_t)remainder;
}

int main(void){
    uBit.init();
    
    // 正しい例 (データシートから引用) (0 が返る)
    printf("%d\n", check_crc(0x68,0x3A,0x7c));
    printf("%d\n", check_crc(0x4E,0x85,0x6b));
    
    // 誤りの例 (0 以外が返る)
    printf("%d\n", check_crc(0x68,0x3A,0x7d));
    printf("%d\n", check_crc(0x4E,0x85,0x6c));

    release_fiber();
    return 0;
}

f:id:ti-nspire:20180606174613p:plain