Jump to content

    
Sign in to follow this  
ffs2001

xmega64a3u CRC-32

Recommended Posts

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

Share this post


Link to post
Share on other sites
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 ругают.

Share this post


Link to post
Share on other sites

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

Edited by Genadi Zawidowski

Share this post


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

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

 

Share this post


Link to post
Share on other sites
кстати, а каким эмулятором контроллера пользуетесь?

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

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

 

Share this post


Link to post
Share on other sites

Ваш вариант

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this