通信時のエラーを検知するのにCRCが使われます。たくさんの種類がありますが、センサでは8ビットが使われます。もとはダラスの1-wireで使われていたPolynomialが0x31 (x8 + x5 + x4 + 1)です。ダラスはマキシムに買収されたので、WikiにはCRC-8-Dallas/Maximという名称が書かれています。2020年マキシムはアナログ・デバイセズに買収されたので、名称が変わるかもしれません。
CRC-8の計算例
Sensirionの空気品質センサSGP40のデータシートに、C言語のコードが掲載されているので、Picoで動かして動作を確認しました。センサの使用例はこちらを参照してください。
プログラム
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) 2020 Sensirion SGP40 Data Sheet
*/
# include <stdio.h>
# include <pico/stdlib.h>
uint8_t CalcCrc(uint8_t data[2]) {
uint8_t crc = 0xFF;
for(int i = 0; i < 2; i++) {
crc ^= data[i];
for(uint8_t bit = 8; bit > 0; --bit) {
if(crc & 0x80) {
crc = (crc << 1) ^ 0x31u;
} else {
crc = (crc << 1);
}
}
}
return crc;
}
int main() {
stdio_init_all();
printf("start \n");
uint8_t data[2];
data[0] = 0xff; data[1] = 0xff;
uint8_t crc8 = CalcCrc(data);
printf("crc2 %x\n", crc8);
}
動作確認
動作確認は、http://www.sunshine2k.de/coding/javascript/crc/crc_js.html で行いました。次の画面は、データシートに載っている0xBEEFを入れて、CRCデータ0x92を算出した様子です。
make
第8回で解説したpico/worksで作業をしています。CRC8というフォルダを作りました。
worksの中にあるCMakeLists.txtの内容です。第6回と比べ、不要なinclude(example_auto_set_url.cmake)の行を削除しました。
cmake_minimum_required(VERSION 3.12)
# Pull in SDK (must be before project)
include(pico_sdk_import.cmake)
project(pico_examples C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})
# Initialize the SDK
pico_sdk_init()
# Add blink example
add_subdirectory(blink)
add_subdirectory(cmake)
add_subdirectory(LED7seg_74HC595)
add_subdirectory(bus_scan)
add_subdirectory(lcd_1602_i2c)
add_subdirectory(CRC8)
フォルダCRC8には二つのファイルがあります。ソースcrc8.cは最初に掲載しました。
CMakeLists.txtの内容です。
add_executable(crc8
crc8.c
)
# Pull in our pico_stdlib which pulls in commonly used features
target_link_libraries(crc8 pico_stdlib)
# create map/bin/hex file etc.
pico_add_extra_outputs(crc8)
第6回と比べ、urlの部分をコメントアウトもしくは削除しています。
# add url via pico_set_program_url
# example_auto_set_url(xxxxx)
CRC8のフォルダを作ってその直下のCMakeLists.txtを修正した後、pico/works/buildに降りて、cmake ..を実行します。
その直下にできたpico/works/build/CRC8へ降りて、make -j4を実行すると、このフォルダ内にcrc8.uf2ができています。
第6回で作ったResetボタンを使います。Resetボタンを押したまま、BOOTSELボタンを押し、Resetボタンを放してから、BOOTSELボタンを放します。これでRPI-RP2ディスクがマウントができます。これにcrc8.uf2をドロップします。
その前に、第3回で解説した「標準出力を用意」でターミナルを動かしておきます。このターミナルにCRCの計算結果が出力されます。