|
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 3 2014, 20:34
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(ffs2001 @ Dec 3 2014, 23:04)  [code]CRC_CTRL |= CRC_CRC32_bm; CRC.CTRL |= CRC_SOURCE_IO_gc; Сам модуль работает, но выдаёт неверные данные. Возможно, вы забыли сделать обнуление перед накоплением. CRC_CTRL = CRC_CRC32_bm | CRC_SOURCE_IO_gc; CRC_CTRL |= CRC_RESET_RESET0_gc; // Reset CRC with CHECKSUM to all zeros P.S. И вот еще: надо вызывать функцию ltoa(CRC.CHECKSUM3,str); вместо itoa(CRC.CHECKSUM3,str); Т.к. int у XMega 16-битный. CRC32 тогда long, а не int.
|
|
|
|
|
Dec 4 2014, 11:55
|
Участник

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

|
Цитата(Xenia @ Dec 3 2014, 23:34)  Возможно, вы забыли сделать обнуление перед накоплением.
CRC_CTRL = CRC_CRC32_bm | CRC_SOURCE_IO_gc; CRC_CTRL |= CRC_RESET_RESET0_gc; // Reset CRC with CHECKSUM to all zeros Да, в атмелевском драйвере это есть. С него начал. Там ещё есть аж две малопонятных для меня инверсии; но и с ними, и без них результат даже примерно не похож на нужный.
|
|
|
|
|
Dec 4 2014, 12:18
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ffs2001 @ Dec 4 2014, 14:55)  Да, в атмелевском драйвере это есть. Драйвер неправильный (или может его исправили?). Попробуйте такой код, он вроде работал: Код uint32_t Crc32(uint8_t * data, uint16_t data_size, bool init_zero, uint32_t xor_value) {
CRC.CTRL=0 | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc) | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc ; CRC.CTRL=0 | CRC_RESET_NO_gc | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc ; CRC.STATUS=1<<CRC_BUSY_bp; uint8_t byte_counter=0; for (uint8_t i=0; i<data_size; i++) CRC.DATAIN=*data++;
uint32_t crc=*(volatile uint32_t *)&CRC.CHECKSUM0; crc^=xor_value; return crc; }
typedef dma_channel<'0'> Dma0; uint32_t CrcDma(uint8_t * data, bool init_zeros, uint16_t length) { CRC.CTRL=0 | init_zeros ? CRC_RESET_RESET1_gc : CRC_RESET_RESET0_gc | 1<<CRC_CRC32_bp | CRC_SOURCE_DMAC0_gc ; CRC.CTRL=0 | CRC_RESET_NO_gc | 1<<CRC_CRC32_bp | CRC_SOURCE_DMAC0_gc ; Dma0::ResetChannel(); Dma0::SetSrcAddress((uint16_t)data); Dma0::SetDestAddress((uint16_t)data); Dma0::SetAddressControl(DMA_CH_SRCRELOAD_NONE_gc, DMA_CH_SRCDIR_INC_gc, DMA_CH_DESTRELOAD_NONE_gc, DMA_CH_DESTDIR_INC_gc); Dma0::SetTransferSize(length); Dma0::SetTriggerSource(DMA_CH_TRIGSRC_OFF_gc); Dma0::StartRamToRamTransfer(DMA_CH_BURSTLEN_8BYTE_gc);
while (Dma0::TransferComplete()==false);
uint32_t crc = *(uint32_t *)&CRC.CHECKSUM0;
return crc; } В драйвере не было вроде такой строки (функция Crc32): Код CRC.STATUS=1<<CRC_BUSY_bp; С ДМА как ни странно работало без проблем.
|
|
|
|
Сообщений в этой теме
ffs2001 xmega64a3u CRC-32 Dec 3 2014, 20:04 ffs2001 Так, проблема, похоже, не в контроллере.
В этом ка... Dec 4 2014, 12:32 _Артём_ Цитата(ffs2001 @ Dec 4 2014, 15:32) Мда, ... Dec 4 2014, 12:43  ffs2001 Цитата(_Артём_ @ Dec 4 2014, 15:43) Расск... Dec 4 2014, 13:53   _Артём_ Цитата(ffs2001 @ Dec 4 2014, 16:53) Полин... Dec 4 2014, 14:11 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
|
|
|