<div dir="ltr"><div><div>I like this paper :<br><br><a href="http://www.ross.net/crc/crcpaper.html">http://www.ross.net/crc/crcpaper.html</a><br><br></div>It points towards a table-driven algorithm which isnt usually ideal for small micros, but implementing both is a useful cross-check. It's surprisingly easy to make an error with initial state or final shift, and this helps ensure that you're calculating what you say you are.<br>
<br></div>-adrian<br><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Apr 20, 2014 at 8:49 PM, Damon Hart-Davis <span dir="ltr"><<a href="mailto:dhd@exnet.com" target="_blank">dhd@exnet.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">No (if I’m right) because that behaves poorly on a 16-bit (2-byte) payload: see table 4.<br>
<br>
Rgds<br>
<span class="HOEnZb"><font color="#888888"><br>
Damon<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
On 20 Apr 2014, at 20:47, Bo Herrmannsen <<a href="mailto:bo.herrmannsen@gmail.com">bo.herrmannsen@gmail.com</a>> wrote:<br>
<br>
> not sure at all but should it not be:<br>
><br>
> CRC-7: 0x48 = (x7+x4+1)‡<br>
><br>
> -----Oprindelig meddelelse----- From: Damon Hart-Davis<br>
> Sent: Sunday, April 20, 2014 9:44 PM<br>
> To: Closed list for developer discussions<br>
> Subject: [OpenTRV-dev] CRC computation<br>
><br>
> Duh!  My brain hurts!<br>
><br>
> Can anyone confirm/deny if this, just written by me, is a correct implementation of CRC7 (0x5B polynomial) as given in the paper specified?<br>
><br>
> // Update 7-bit CRC with next byte.<br>
> // Polynomial 0x5B = (x+1)(x^6 + x^5 + x^3 +x^2 + 1).<br>
> // See: <a href="http://users.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf" target="_blank">http://users.ece.cmu.edu/~koopman/roses/dsn04/koopman04_crc_poly_embedded.pdf</a><br>
> // For 2 or 3 byte payloads this should have a Hamming distance of 4 and be within a factor of 2 of optimum error detection.<br>
> uint8_t crc7_5B_update(uint8_t crc, const uint8_t datum)<br>
> {<br>
> crc ^= datum;<br>
> for(uint8_t i = 0; ++i <= 8; )<br>
>   {<br>
>   if(crc & 0x80)<br>
>     { crc = (crc << 1) ^ 0x5B; }<br>
>   else<br>
>     { crc <<= 1; }<br>
>   }<br>
> return(crc & 0x7f);<br>
> }<br>
><br>
> I’m after something with good behaviour on a 2-byte payload and need a 7-bit CRC in this case for packing efficiency.<br>
><br>
> Also, I assume that it’s customary to start with 0xff for the CRC before feeding it real bytes, unless there is a good reason otherwise?<br>
><br>
> Rgds<br>
><br>
> Damon<br>
> _______________________________________________<br>
> OpenTRV-dev mailing list<br>
> <a href="mailto:OpenTRV-dev@lists.opentrv.org.uk">OpenTRV-dev@lists.opentrv.org.uk</a><br>
> <a href="http://lists.opentrv.org.uk/listinfo/opentrv-dev" target="_blank">http://lists.opentrv.org.uk/listinfo/opentrv-dev</a><br>
> _______________________________________________<br>
> OpenTRV-dev mailing list<br>
> <a href="mailto:OpenTRV-dev@lists.opentrv.org.uk">OpenTRV-dev@lists.opentrv.org.uk</a><br>
> <a href="http://lists.opentrv.org.uk/listinfo/opentrv-dev" target="_blank">http://lists.opentrv.org.uk/listinfo/opentrv-dev</a><br>
><br>
<br>
_______________________________________________<br>
OpenTRV-dev mailing list<br>
<a href="mailto:OpenTRV-dev@lists.opentrv.org.uk">OpenTRV-dev@lists.opentrv.org.uk</a><br>
<a href="http://lists.opentrv.org.uk/listinfo/opentrv-dev" target="_blank">http://lists.opentrv.org.uk/listinfo/opentrv-dev</a><br>
</div></div></blockquote></div><br></div>