реклама на сайте
подробности

 
 
> xmega64a3u CRC-32, Работает, но выдаёт чушь.
ffs2001
сообщение Dec 3 2014, 20:04
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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}

ЧЯДНТ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Dec 3 2014, 20:34
Сообщение #2


Гуру
******

Группа: Модератор 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.
Go to the top of the page
 
+Quote Post
ffs2001
сообщение Dec 4 2014, 11:55
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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


Да, в атмелевском драйвере это есть. С него начал.
Там ещё есть аж две малопонятных для меня инверсии; но и с ними, и без них результат даже примерно не похож на нужный.

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 4 2014, 12:18
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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;

С ДМА как ни странно работало без проблем.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016