メッセージ

2008年10月23日の記事

2008/10/23(木)SDのCRC7計算ルーチン

SD Card専用のCRC7計算ルーチン(C言語汎用)。戻り値をそのまま「6byte目」として送信できる。このソースは自由にご利用ください。

//******************************************************************************
// Calc SD CRC7
//******************************************************************************
int calc_sd_crc7(char *buf) {
	int crc, crc_prev;
	int i,j;
	crc = buf[0];
	for(i=1; i<6; i++) {
		for(j=7; j>=0; j--) {
			crc <<= 1;
			crc_prev = crc;
			if (i<5) crc |= (buf[i]>>j) & 1;
			if (crc & 0x80) { crc ^= 0x89; }	// Generator
		}
	}
	return crc_prev | 1;
}

元データに x7 かけるのを見落としていたため、えらいハマった(汗)

思うに

CRCの説明って、どこもあんまりストレートじゃないなあ。

「引き算の代わりにXORを使った」(2進数)のわり算でいえばいいんですが、桁借り*1を無視した(2進数の)わり算って書いてあれば、すぐに思い出せたのにと思ったのでした。*2

*1 : 上の桁から1借りてくること。上の桁に影響なくいつでも桁狩りできると思えばいい

*2 : さもなくばもっとシンプルに「GF(2)における多項式除算」とか