|
xmega64a3u CRC-32, Работает, но выдаёт чушь. |
|
|
|
Dec 3 2014, 20:04
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 3-12-14
Пользователь №: 83 971

|
Господа, помогите советом: хочу считать CRC-32 на указанном МК. Аппаратный модуль имеется. Код использовал родной атмелевский отсюда и упрощённый вариант: Код CRC_CTRL |= CRC_CRC32_bm; CRC.CTRL |= CRC_SOURCE_IO_gc; for (n = 0; n < 32; n++){ CRC.DATAIN = test[n]; // send data } CRC.STATUS |= CRC_BUSY_bm; // finish while (CRC_STATUS & CRC_BUSY_bm == CRC_BUSY_bm);
itoa(CRC.CHECKSUM3,str); puts_usf0(str); //и так далее Сам модуль работает, но выдаёт неверные данные. Проверял вот этим калькулятором. Полиномы совпадают, в даташите есть описание. В эррате ничего. Тестовый массив: uint8_t[32] = {0xFF} ЧЯДНТ?
|
|
|
|
|
 |
Ответов
|
Dec 4 2014, 12:32
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 3-12-14
Пользователь №: 83 971

|
Так, проблема, похоже, не в контроллере. В этом калькуляторе получается то же значение, что выдаёт мой контроллер. Проблема в том, что в него я скопировал полином из этого калькулятора, где получается другое значение (с этим полиномом). Это, как говорится, какое-то фуфло; но бедная иксмега не при чём. Когда разберусь с полиномами, отпишу, в чём соль. Цитата(_Артём_ @ Dec 4 2014, 15:18)  Драйвер неправильный (или может его исправили?). Мда, печально. Расскажите подробнее, если не затруднит. Цитата(_Артём_ @ Dec 4 2014, 15:18)  В драйвере не было вроде такой строки (функция Crc32): Код CRC.STATUS=1<<CRC_BUSY_bp; С ДМА как ни странно работало без проблем. Да, уже обрабатывал этот момент; это единственная ошибка в драйвере?
|
|
|
|
|
Dec 4 2014, 12:43
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ffs2001 @ Dec 4 2014, 15:32)  Мда, печально. Расскажите подробнее, если не затруднит. Рассказывать-то и нечего: есть стандартная функция расчёта CRC Код /* Name : CRC-32 Poly : 0x04C11DB7 x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 Init : 0xFFFFFFFF Revert: true XorOut: 0xFFFFFFFF Check : 0xCBF43926 ("123456789") MaxLen: 268 435 455 байт (2 147 483 647 бит) - обнаружение одинарных, двойных, пакетных и всех нечетных ошибок */ uint_least32_t Crc32Soft(uint8_t *buf, size_t len, uint32_t init_value) { uint_least32_t crc_table[256]; uint_least32_t crc; int i, j; for (i = 0; i < 256; i++) { crc = i; for (j = 0; j < 8; j++) crc = crc & 1 ? (crc >> 1) ^ 0xEDB88320UL : crc >> 1; crc_table[i] = crc; }; crc = init_value; while (len--) crc = crc_table[(crc ^ *buf++) & 0xFF] ^ (crc >> 8); return crc ^ 0xFFFFFFFFUL; } Результат CRC32 который выдаёт модуль xmega не совпадает с ним для CRC32. Цитата(ffs2001 @ Dec 4 2014, 15:32)  это единственная ошибка в драйвере? Я драйвер подробно не рассматривал, смотрел пример который шёл вместе со AtmelStudio. И в примере результат неправильный получается. Цитата(ffs2001 @ Dec 4 2014, 15:32)  драйвере? Да в общем-то тут и драйвер-то не нужен - там весь модуль 3 регистра. Самому проще написать.
|
|
|
|
|
Dec 4 2014, 13:53
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 3-12-14
Пользователь №: 83 971

|
Цитата(_Артём_ @ Dec 4 2014, 15:43)  Рассказывать-то и нечего: есть стандартная функция расчёта CRC Благодарю! В общем, CRC-модуль, похоже, рабочий. Теперь (немного в сторону от темы) ситуация получилась такая: модуль xmega и вот этот калькулятор выдают одинаковое значение; библиотека CRC-32 для VS (PC) и вот этот калькулятор тоже выдают одинаковое значение, но другое! Полином везде один и тот же. Видимо, под конец они как-то хитро XOR-ятся или ещё что... Тестовое значение (hex) 940C. Буду очень рад, если кто-нибудь объяснит, как так происходит.
|
|
|
|
|
Dec 4 2014, 14:11
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ffs2001 @ Dec 4 2014, 16:53)  Полином везде один и тот же. Возможно они инициализируют crc перед началом подсчёта нулями, а вы единицами. Или наоборот. Попробуйте посчитать CRC по функции из сообщения 6. Код uint8_t Test10[10]={1,2,3,4,5,6,7,8,9,10}; volatile uint32_t soft_crc[2]; soft_crc[0]=Crc32Soft(Test, sizeof(Test), 0xFFFFFFFFUL); soft_crc[1]=Crc32Soft(Test, sizeof(Test), 0);
|
|
|
|
Сообщений в этой теме
ffs2001 xmega64a3u CRC-32 Dec 3 2014, 20:04 Xenia Цитата(ffs2001 @ Dec 3 2014, 23:04) [code... Dec 3 2014, 20:34 ffs2001 Цитата(Xenia @ Dec 3 2014, 23:34) Возможн... Dec 4 2014, 11:55  _Артём_ Цитата(ffs2001 @ Dec 4 2014, 14:55) Да, в... Dec 4 2014, 12:18 ffs2001 Результаты работы приведённого кода идентичны резу... Dec 4 2014, 15:24 _Артём_ Цитата(ffs2001 @ Dec 4 2014, 18:24) Хочу ... Dec 4 2014, 15:35  ffs2001 Цитата(_Артём_ @ Dec 4 2014, 18:35) Тогда... Dec 4 2014, 16:58   _Артём_ Цитата(ffs2001 @ Dec 4 2014, 19:58) Так б... Dec 4 2014, 18:24 ffs2001 Проверил на двух 64ых, результаты разные для hard ... Dec 5 2014, 09:46 _Артём_ Цитата(ffs2001 @ Dec 5 2014, 12:46) резул... Dec 5 2014, 19:32 ffs2001 Проект для CVAVR 3.1 .
Скомпилированные ROM и HEX ... Dec 8 2014, 10:12 _Артём_ Цитата(ffs2001 @ Dec 8 2014, 13:12) Проек... Dec 8 2014, 13:06  ffs2001 Цитата(_Артём_ @ Dec 8 2014, 16:06) P.S. ... Dec 8 2014, 16:46 Duhas 1<<CRC_CRC32_bp должно быть эквивалентно CRC... Dec 8 2014, 15:28 _Артём_ Цитата(Duhas @ Dec 8 2014, 18:28) 1<... Dec 8 2014, 15:44 Genadi Zawidowski Как я помню, в языке "C" у тернарной опе... Dec 8 2014, 21:51 _Артём_ Цитата(Genadi Zawidowski @ Dec 9 2014, 00... Dec 9 2014, 13:28 ffs2001 Артём,
кстати, а каким эмулятором контроллера по... Dec 9 2014, 19:54 _Артём_ Цитата(ffs2001 @ Dec 9 2014, 22:54) кстат... Dec 9 2014, 20:11 Genadi Zawidowski Ваш вариант
КодCRC.CTRL=0
| init_zero ? (CRC... Dec 10 2014, 08:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|