Цитата(sonycman @ Jun 4 2009, 15:46)

Это понятно, но всё равно интересно - как?
Табличкой, например.
Цитата(sonycman @ Jun 4 2009, 15:46)

Для данных это да. Но для SPI сумма не нужна (странно, конечно, но неужели надёжность SPI близка к 100%, чтобы в контрольной сумме отпала надобность?), а SDIO контроллеры будут считать её аппаратно...
Для SPI ее можно не включать, но это не значит, что она не нужна. Я, например, включаю и использую.
Цитата(sonycman @ Jun 4 2009, 15:46)

ЗЫ: вот ваша процедура на Си, она пооптимальнее, чем приведённая мной:
Спасибо, конечно, а я-то специально на асм переводил

Если интересно, то вот вариант для данных:
Код
const u_short sd_crc16_table_a[0x10] =
{
0x0000, 0x1231, 0x2462, 0x3653,
0x48c4, 0x5af5, 0x6ca6, 0x7e97,
0x9188, 0x83b9, 0xb5ea, 0xa7db,
0xd94c, 0xcb7d, 0xfd2e, 0xef1f
};
const u_short sd_crc16_table_b[0x10] =
{
0x0000, 0x1021, 0x2042, 0x3063,
0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b,
0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};
u_int sd_crc16(u_char *buff, u_int len)
{
u_char data;
u_short crc = 0;
while(len--)
{
data = *buff++ ^ (crc >> 0x08);
crc = (sd_crc16_table_a[(data & 0xf0) >> 4] ^ sd_crc16_table_b[data & 0x0f]) ^ (crc << 8);
}
return crc;
}