Перейти к содержанию
    

Проект для 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1<<CRC_CRC32_bp должно быть эквивалентно CRC_CRC32_bm, так на всякий.

Так и есть - они эквивалентны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 ругают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я помню, в языке "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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я помню, в языке "C" у тернарной операции (?:) приоритет ниже всех. Ниже только у запятой. Скобок надо добавить в

Может быть, скобки никогда не помешают. Но как же тогда результат получается правильным (пробовал на IAR и GCC)?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

кстати, а каким эмулятором контроллера пользуетесь?

Сейчас пользуюсь или AVR Dragon (худший из всех аппаратных отладчиков) или просто симулятором AtmelStudio (CRC или AES/DES считает правильно, но очень медленно). Раньше пользовался JTAG ICE - JTAG ICE 2 (самый лучший из всех) - JTAG ICE 3.

У Atmel-а сейчас какие-то новые отладчики появились (дешёвые совсем), но ими не пользовался - про них ничего сказать не могу.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ваш вариант

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, то правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...