=?iso-8859-2?Q?Jak_si=EA_liczy_CRC_dla_=28x

Feb 14, 2011 7 Replies

XMEGA liczy CRC z wielomianem: x^24+4x^3+3x+1

formatting link
366.



Trochê próbowa³em poszukaæ, ale wszêdzie znajdujê opisy CRC dla wielomianów, które przy wszystkich potêgach x maj± albo 0 albo 1, lub jakie¶ czysto matematyczne wywody, bez wystarczaj±co prostego prze³o¿enia na algorytm.



Wie kto¶ mo¿e gdzie znale¼æ opis jak to siê liczy (jaki¶ przyk³ad algorytmu) ? P.G.


W dniu 2011-02-14 14:25, Piotr Gałka pisze:

Zobacz w źródłach freemodbus.

W dniu 2011-02-14 22:17 Mario napisał(a):

Tyle że w dokumentacji Atmela jest błąd i w rzeczywistości CRC jest liczone wg bardziej powszechnego wzoru:

x^19 + x^4 + x^3 + x^1 + 1

formatting link
/*

  • The Xmega manual Rev G lists the CRC Polynomial
  • as: x^24 + 4x3 + 3x +1.
*
  • Based on some untested code supplied by avr(at)atmel.com,
  • I believe the correct Polynomial is:
  • x^19 + x^4 + x^3 + x^1 + 1
*
  • At any rate after cleaning up their code issues, the following C
  • code generates the same values as the XMega 128A1 hardware.

To by chyba zamykało problem. W okolicy tego wpisu na forum AVRFreaks jest podany link do źródeł funkcji obliczającej poprawnie CRC (tzn. z wynikiem identycznym jak ATxmega).

cos mi sie widzi ze i tak trzeba bedzie prosic Atmela o wyjasnienie, ba tam chyba wiecej szczegolow jest istotnych.

podejrewam ze w kluczowym momencie trzeba cos co przesunac o dwa bity (4) albo o jeden i xorowac z oryginalem (razem 3).

J.

U¿ytkownik "Adam Dybkowski" snipped-for-privacy@45wp.pl napisa³ w wiadomo¶ci news:ijc7pv$hc5$ snipped-for-privacy@news.onet.pl...

...

Dziêki. P.G.

U¿ytkownik "Adam Dybkowski" snipped-for-privacy@45wp.pl napisa³ w wiadomo¶ci news:ijc7pv$hc5$ snipped-for-privacy@news.onet.pl...

Mo¿e komu¶ siê przyda moja wersja tego CRC:

dword crcXmega(byte *buf,dword n,dword crc) { for(n>>=1;n--;buf+=2)crc=(crc<<1)^*(word*)buf^((crc&0x800000)?0x80001B:0); return crc&0xFFFFFF; }

Wynik zgodzi³ mi siê dla wszystkich sum liczonych przez XMEGA po skasowaniu (3 wyniki) i po wpisaniu programu z bootloaderem (kolejne 3). Na maszynie maj±cej odwrotn± kolejno¶æ bajtów w word mój zapis nie zadzia³a.

Nie wnika³em jak to dzia³a bez obracania 16 razy (bo 2 bajty za jednym ruchem) po bicie, ale s±dzê, ¿e przyczyn± jest du¿a odleg³o¶æ miêdzy bitem x^19 a nastêpnymi. I tak brakuje mi gdzie¶ przesuniêcia o 8 w jedn± albo o

16 w drug±. Zastanawia mnie te¿ to, ¿e do XOR u¿yta jest liczba, która by odpowiada³a zapisowi x^23 + x^4 + x^3 + x^1 + 1. Czy brak obracania mo¿e mieæ zwi±zek z zast±pieniem x^19 przez x^23. Gdyby ró¿nica by³a 8, ale jest 4. Mam podejrzenie, ¿e to crc tak na prawdê nie jest opisane ¿adnym z tych wielomianów. P.G.

Dla porównania orygina³:

-------------------------- #define CRC32_POLY (0x0080001BUL) /* Polynomial for use with Xmega 'A' devices */

/* This CRC Routine is the corresponding routine implemented in Xmega hardware: */ uint32_t CRC_Reference( uint32_t startWord_u32, uint32_t endWord_u32 ) { uint32_t addr_u32, data_reg_u32, help_a_u32, help_b_u32; uint32_t crc_reg_u32 = 0;

for( addr_u32 = startWord_u32; addr_u32 <= endWord_u32; addr_u32 += 2 ) { help_a_u32 = crc_reg_u32 << 1; help_a_u32 &= 0x00FFFFFEUL; /* Always act as 24-bit variable */

help_b_u32 = crc_reg_u32 & (1UL << 23);

if( help_b_u32 > 0 ) { help_b_u32 = 0x00FFFFFFUL; }

data_reg_u32 = SP_ReadWord( addr_u32 );

crc_reg_u32 = (help_a_u32 ^ data_reg_u32) ^ (help_b_u32 & CRC32_POLY); crc_reg_u32 = crc_reg_u32 & 0x00FFFFFFUL; }

return( crc_reg_u32 ); }

[...]

No wlasnie - cos mi to zbyt prosto wyglada. CRC zwykle wymagalo przetwarzania po bicie, albo dosc skomplikowanych programow z tablicami. Cos tu mocno uproscili.

J.

U¿ytkownik "J.F." <jfox snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news: snipped-for-privacy@4ax.com...

Dla crc16 Atmel przed laty w jakiej¶ nocie aplikacyjnej opisa³ pewien po¶redni algorytm oparty na znanej matematycznej metodzie: "zauwa¿my ¿e". Wysz³o parê obliczeñ bez przesuwania po bicie i bez tablic. Korzystaj±c z bitu parzysto¶ci akumulatora dawa³o siê bardzo szybko policzyæ. W moich programach na PC korzystam z tej metody, choæ znalezienie w C bitu parzysto¶ci jest chyba najbardziej pracoch³onnym jej kawa³kiem. Nie wrzucam z definicji kodu, ale jak kto¶ zechce.... Jednak to co jest tu wydaje siê za proste, aby mog³o byæ jakim¶ CRC. A mo¿e ten wielomian co jest w instrukcji jest prawdziwy i po jakich¶ "zauwa¿my ¿e" sprowadza siê do przedstawionego obliczenia. A kto¶ nie ¶wiadomy ca³o¶ci widz±c co jest brane do XOR uzna³, ¿e to jest ten wielomian. Widaæ, ¿e siê bardzo ¶pieszy³, bo nie doliczy³ siê nawet pozycji pierwszej jedynki. P.G.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required