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

 
 
> 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
Ответов
ffs2001
сообщение Dec 8 2014, 10:12
Сообщение #2


Участник
*

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



Проект для CVAVR 3.1 .
Скомпилированные ROM и HEX в Debug.
Прикрепленные файлы
Прикрепленный файл  CRC_test.zip ( 153.57 килобайт ) Кол-во скачиваний: 10
 
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 8 2014, 13:06
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ffs2001 @ Dec 8 2014, 13:12) *
Проект для CVAVR 3.1 .
Скомпилированные ROM и HEX в Debug.

Код такой же как у меня за исключением того что в STATUS.BUSY 1 пишется после вычисления, но это может и не важно.

Попробуйте написать проще (вдруг это CV глючит):
Код
uint32_t Crc32(uint8_t * data, uint16_t data_size)
{

    CRC.CTRL=0
        | 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;

    for (uint16_t i=0; i<data_size; i++)
        CRC.DATAIN=*data++;
    uint32_t crc=*(volatile uint32_t *)&CRC.CHECKSUM0;
    crc^=0xFFFFFFFFUL;
    return crc;
}


P.S. Загрузил ваш проект в xm256 - получилось что у вас блок CRC инициализирует CRC не единицами, а нулями.
То есть CV почему-то не понимает такое выражение:
Код

    CRC.CTRL=0
        | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc)
        | 1<<CRC_CRC32_bp
        | CRC_SOURCE_IO_gc
;

Вместо 0xE1 в CRC.CTRL пишется 0x80.
Go to the top of the page
 
+Quote Post
ffs2001
сообщение Dec 8 2014, 16:46
Сообщение #4


Участник
*

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



Цитата(_Артём_ @ Dec 8 2014, 16:06) *
P.S. Загрузил ваш проект в xm256 - получилось что у вас блок CRC инициализирует CRC не единицами, а нулями.
То есть CV почему-то не понимает такое выражение:
Код

    CRC.CTRL=0
        | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc)
        | 1<<CRC_CRC32_bp
        | CRC_SOURCE_IO_gc
;

Вместо 0xE1 в CRC.CTRL пишется 0x80.



Действительно, замена этого куска на такой код:

Код
    
CRC.CTRL=0;
if (init_zero) {
        
        CRC.CTRL |= CRC_RESET_RESET0_gc;
} else {
        CRC.CTRL |= CRC_RESET_RESET1_gc;
}
    
CRC.CTRL |= 1<<CRC_CRC32_bp;
СRC.CTRL |= CRC_SOURCE_IO_gc;


привела к правильному результату вычислений.

Артём, спасибо!

P.S. Честно говоря, раньше практически не встречал кода, сформированного таким, как в вашей библиотеке, образом. Удивился, когда CVAVR его переварил даже без warning'ов. Видимо, не зря CVAVR ругают.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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, 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
- - 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 Текстовая версия Сейчас: 24th July 2025 - 01:52
Рейтинг@Mail.ru


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