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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> xmega64a3u CRC-32, Работает, но выдаёт чушь.
_Артём_
сообщение Dec 8 2014, 13:06
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 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
Duhas
сообщение Dec 8 2014, 15:28
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 13-04-07
Пользователь №: 27 018



1<<CRC_CRC32_bp должно быть эквивалентно CRC_CRC32_bm, так на всякий.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 8 2014, 15:44
Сообщение #18


Гуру
******

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



Цитата(Duhas @ Dec 8 2014, 18:28) *
1<<CRC_CRC32_bp должно быть эквивалентно CRC_CRC32_bm, так на всякий.

Так и есть - они эквивалентны.
Go to the top of the page
 
+Quote Post
ffs2001
сообщение Dec 8 2014, 16:46
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 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
Genadi Zawidowsk...
сообщение Dec 8 2014, 21:51
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Как я помню, в языке "C" у тернарной операции (?:) приоритет ниже всех. Ниже только у запятой. Скобок надо добавить в
Код
CRC.CTRL=0
        | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc)
        | 1<<CRC_CRC32_bp
        | CRC_SOURCE_IO_gc


вот так
Код
CRC.CTRL=0
        | (init_zero ? CRC_RESET_RESET0_gc : CRC_RESET_RESET1_gc)
        | 1<<CRC_CRC32_bp
        | CRC_SOURCE_IO_gc


Сообщение отредактировал Genadi Zawidowski - Dec 8 2014, 21:55
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 9 2014, 13:28
Сообщение #21


Гуру
******

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



Цитата(Genadi Zawidowski @ Dec 9 2014, 00:51) *
Как я помню, в языке "C" у тернарной операции (?sm.gif приоритет ниже всех. Ниже только у запятой. Скобок надо добавить в

Может быть, скобки никогда не помешают. Но как же тогда результат получается правильным (пробовал на IAR и GCC)?
Go to the top of the page
 
+Quote Post
ffs2001
сообщение Dec 9 2014, 19:54
Сообщение #22


Участник
*

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



Артём,

кстати, а каким эмулятором контроллера пользуетесь?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 9 2014, 20:11
Сообщение #23


Гуру
******

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



Цитата(ffs2001 @ Dec 9 2014, 22:54) *
кстати, а каким эмулятором контроллера пользуетесь?

Сейчас пользуюсь или AVR Dragon (худший из всех аппаратных отладчиков) или просто симулятором AtmelStudio (CRC или AES/DES считает правильно, но очень медленно). Раньше пользовался JTAG ICE - JTAG ICE 2 (самый лучший из всех) - JTAG ICE 3.
У Atmel-а сейчас какие-то новые отладчики появились (дешёвые совсем), но ими не пользовался - про них ничего сказать не могу.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Dec 10 2014, 08:43
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Ваш вариант
Код
CRC.CTRL=0
        | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc)
        | 1<<CRC_CRC32_bp
        | CRC_SOURCE_IO_gc


Вычисляется вот так:
Код
CRC.CTRL=(0 | init_zero) ? (CRC_RESET_RESET0_gc) : ((CRC_RESET_RESET1_gc) | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc)


Если не init_zero, то правильно.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:50
Рейтинг@Mail.ru


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