<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Looking for CRC16 app note for Modbus CRC in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440910#M25822</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;It's great to see that the CRC can be done in hardware, but as someone who's also doing Modbus RTU stuff right now, I'm curious what the motivation is. &amp;nbsp;Modbus usually runs at not more than 19.2 kbps and I've always done the CRC calculation in software, even on 8-bit MCUs running at a few MHz. &amp;nbsp;Are you processing Modbus data at a very high rate, or are you otherwise resource-constrained?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I expect I'll keep using the software implementation for ease of debugging and portability unless I start running it at much higher rates.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Scott&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 03 Apr 2017 18:02:58 GMT</pubDate>
    <dc:creator>scottm</dc:creator>
    <dc:date>2017-04-03T18:02:58Z</dc:date>
    <item>
      <title>Looking for CRC16 app note for Modbus CRC</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440904#M25816</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm using a KE96 processor and I'm trying to use the CRC module to calculate the CRC for a Modbus string.&lt;/P&gt;&lt;P&gt;I use a seed value of 0xfff and a polynomial of 0xa001, but I can't seem to get the right CRC value.&lt;/P&gt;&lt;P&gt;I haven't tried all of the combinations of transposing bit and such yet.&lt;/P&gt;&lt;P&gt;Does anyone know of an app note describing how to generate crc16 for Modbus comms?&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 09 Jun 2015 14:09:34 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440904#M25816</guid>
      <dc:creator>bobmke</dc:creator>
      <dc:date>2015-06-09T14:09:34Z</dc:date>
    </item>
    <item>
      <title>Re: Looking for CRC16 app note for Modbus CRC</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440905#M25817</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Bob&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Below is the code from the uTasker MODBUS extension module - it aso has an optional look-up table option for speed against code size.&lt;/P&gt;&lt;P&gt;See the links below if you need a ready-made, industrial proven MODBUS module that works on all KE, KEA, KV, KL, and K parts.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Kinetis: &lt;A href="http://www.utasker.com/kinetis.html" rel="nofollow noopener noreferrer" title="http://www.utasker.com/kinetis.html" target="_blank"&gt;µTasker Kinetis support&lt;/A&gt;&lt;/P&gt;&lt;P&gt;KE: &lt;A href="http://www.utasker.com/kinetis/FRDM-KE02Z.html" rel="nofollow noopener noreferrer" title="http://www.utasker.com/kinetis/FRDM-KE02Z.html" target="_blank"&gt;µTasker FRDM-KE02Z support&lt;/A&gt;&amp;nbsp; / &lt;A href="http://www.utasker.com/kinetis/FRDM-KE02Z40M.html" rel="nofollow noopener noreferrer" title="http://www.utasker.com/kinetis/FRDM-KE02Z40M.html" target="_blank"&gt;µTasker FRDM-KE02Z40M support&lt;/A&gt;&amp;nbsp; / &lt;A href="http://www.utasker.com/kinetis/FRDM-KE06Z.html" rel="nofollow noopener noreferrer" title="http://www.utasker.com/kinetis/FRDM-KE06Z.html" target="_blank"&gt;µTasker FRDM-KE06Z support&lt;/A&gt;&lt;/P&gt;&lt;P&gt;MODBUS (Master/Slave/Gateway/Router/RTU/ASCII/RS485/TCP): &lt;A href="http://www.utasker.com/modbus.html" rel="nofollow noopener noreferrer" title="http://www.utasker.com/modbus.html" target="_blank"&gt;µTasker MODBUS Extension pack&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;For the complete "out-of-the-box" Kinetis experience and faster time to market&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_macro_code _jivemacro_uid_14338844512919857 jive_text_macro" data-renderedposition="323_8_1215_848" jivemacro_uid="_14338844512919857"&gt;&lt;P&gt;// Calculate the check sum of an RTU type frame&lt;/P&gt;&lt;P&gt;//&lt;/P&gt;&lt;P&gt;static unsigned short fnCRCRTUFrame(unsigned char *ptrFrame, QUEUE_TRANSFER rxFrameLength)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;#if defined MODBUS_CRC_FROM_LOOKUP_TABLE // look-up table method requiring more memory but faster&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char ucCRC_Lo = 0xff;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char ucCRC_Hi = 0xff;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char ucIndex;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static const unsigned char ucCRC_lookup[512] = {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40, 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41, 0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04, 0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC, 0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4, 0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C, 0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4, 0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C, 0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54, 0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C, 0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ucIndex = (ucCRC_Lo ^ *ptrFrame++);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ucCRC_Lo = (ucCRC_Hi ^ ucCRC_lookup[ucIndex]);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ucCRC_Hi = ucCRC_lookup[ucIndex + 256];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while (--rxFrameLength);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ((ucCRC_Hi &amp;lt;&amp;lt; 8) | ucCRC_Lo);&lt;/P&gt;&lt;P&gt;#else // shift register method&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #define MODBUS_CRC_POLY 0xa001&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int iBit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned short usCRC = 0xffff;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usCRC ^= *ptrFrame;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (iBit = 0; iBit &amp;lt; 8; iBit++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (usCRC &amp;amp; 0x0001) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usCRC &amp;gt;&amp;gt;= 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usCRC ^= MODBUS_CRC_POLY;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usCRC &amp;gt;&amp;gt;= 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptrFrame++;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } while (--rxFrameLength);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return usCRC;&lt;/P&gt;&lt;P&gt;#endif&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 09 Jun 2015 21:14:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440905#M25817</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2015-06-09T21:14:20Z</dc:date>
    </item>
    <item>
      <title>Re: Looking for CRC16 app note for Modbus CRC</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440906#M25818</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Yeah, I have it working using similar code.&lt;/P&gt;&lt;P&gt;What I was trying to do is use the CRC module built into the micro.&lt;/P&gt;&lt;P&gt;I have example code, but It doesn't come out with the right values.&lt;/P&gt;&lt;P&gt;I thought someone might have figured out how to configure the CRC function registers to calculate the correct CRC for Modbus.&lt;/P&gt;&lt;P&gt;The code from Freescale looks like this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uint32_t CRC_Cal16(uint32_t seed, void *msg, uint32_t sizeBytes)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t ctrl_reg,data_out,data_in;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint8_t&amp;nbsp; *pCRCBytes;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t sizeWords;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t i,j;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE *bptr = msg;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC_Init();&lt;/P&gt;&lt;P&gt; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;GPOLY_ACCESS16BIT.GPOLYH = 0x0000;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // RKS, I added this&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;GPOLY_ACCESS16BIT.GPOLYL = 0xA001;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // RKS, I added this&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Input seed, Set WaS=1 */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctrl_reg&amp;nbsp; = CRC0-&amp;gt;CTRL;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;CTRL&amp;nbsp; = ctrl_reg | CRC_CTRL_WAS_MASK;&lt;/P&gt;&lt;P&gt; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;ACCESS16BIT.DATAL = seed;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; /*Input data, Set&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WaS=0*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;CTRL&amp;nbsp; = ctrl_reg &amp;amp; 0xFD000000;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /*Wait for calculation completion*/&lt;/P&gt;&lt;P&gt;&amp;nbsp; sizeWords = sizeBytes&amp;gt;&amp;gt;1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; j = 0;&lt;/P&gt;&lt;P&gt; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i=0;i&amp;lt;sizeWords;i++){ &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data_in = (bptr[j] &amp;lt;&amp;lt; 8) | (bptr[j+1]);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; j += 2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;ACCESS16BIT.DATAL =data_in; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (j&amp;lt;sizeBytes)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pCRCBytes = (uint8_t*)&amp;amp;CRC0-&amp;gt;ACCESS8BIT.DATALL;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *pCRCBytes++ = bptr[j];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data_out=CRC0-&amp;gt;ACCESS16BIT.DATAL;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(data_out);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 10 Jun 2015 14:07:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440906#M25818</guid>
      <dc:creator>bobmke</dc:creator>
      <dc:date>2015-06-10T14:07:48Z</dc:date>
    </item>
    <item>
      <title>Re: Looking for CRC16 app note for Modbus CRC</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440907#M25819</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Bob,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I had the same problem but found some posts on the internet that said you need to use a different polynomial. Something about the CRC hardware doing the computation in the opposite bit order to the code solutions. Use 0x8005 (the reverse of 0xA001), and set the read and write transpose to 1 and it will work. The below code works for me:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="_jivemacro_uid_14365375056556771 jive_macro_code jive_text_macro" data-renderedposition="113_8_1232_208" jivemacro_uid="_14365375056556771" modifiedtitle="true"&gt;&lt;P&gt;void ModbusSlave::_crc_append(uint8_t* buffer, uint8_t* length)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;GPOLY_ACCESS16BIT.GPOLYL = 0x8005;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;CTRL = CRC_CTRL_WAS_MASK | CRC_CTRL_TOT(1) | CRC_CTRL_TOTR(1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;ACCESS16BIT.DATAL = 0xFFFF;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;CTRL &amp;amp;= ~CRC_CTRL_WAS_MASK;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (int i=0; i&amp;lt;(*length); i++) {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CRC0-&amp;gt;ACCESS8BIT.DATALL = buffer[i];&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; buffer[*length] = CRC0-&amp;gt;ACCESS8BIT.DATALU;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; buffer[*length+1] = CRC0-&amp;gt;ACCESS8BIT.DATALL;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *length = *length + 2;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Tim&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 10 Jul 2015 14:19:17 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440907#M25819</guid>
      <dc:creator>timbarry</dc:creator>
      <dc:date>2015-07-10T14:19:17Z</dc:date>
    </item>
    <item>
      <title>Re: Looking for CRC16 app note for Modbus CRC</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440908#M25820</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Tim,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks, I'll give it a try. I've been off working on some other stuff, but should be back into this in a week or so.&lt;/P&gt;&lt;P&gt;I'll let you know what I find.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 16 Jul 2015 19:05:25 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440908#M25820</guid>
      <dc:creator>bobmke</dc:creator>
      <dc:date>2015-07-16T19:05:25Z</dc:date>
    </item>
    <item>
      <title>Re: Looking for CRC16 app note for Modbus CRC</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440909#M25821</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hey, since the above example did not work for me, and I searched days after days through the net without getting results here is the code i finally came up with:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE class="jive_macro_quote jive-quote jive_text_macro"&gt;&lt;P&gt;uint16_t CRC_calc(uint8_t *msg, uint32_t length)&lt;BR /&gt;{&lt;BR /&gt; uint16_t high;&lt;BR /&gt; uint8_t low;&lt;BR /&gt; uint8_t i;&lt;BR /&gt; uint32_t data_out;&lt;BR /&gt; //Enable CRC-Clock&lt;BR /&gt; SIM_SCGC6 |= SIM_SCGC6_CRC_MASK;&lt;BR /&gt; //Set Polynom 8005 == Transpose(A001)&lt;BR /&gt; CRC0-&amp;gt;GPOLY_ACCESS16BIT.GPOLYL=0x8005;&lt;BR /&gt; //Set Types of Transpose&lt;BR /&gt; CRC0-&amp;gt;CTRL = CRC_CTRL_TOT(1) | CRC_CTRL_TOTR(2);&lt;BR /&gt; //Enable "Seed"-Mode / Disable Data-Mode&lt;BR /&gt; CRC0-&amp;gt;CTRL |= CRC_CTRL_WAS_MASK;&lt;BR /&gt; //Write Seed to lower data register&lt;BR /&gt; CRC0-&amp;gt;ACCESS16BIT.DATAL=0xFFFF;&lt;BR /&gt; //Disable "Seed"-Mode / Enable Data-Mode&lt;BR /&gt; CRC0-&amp;gt;CTRL &amp;amp;= ~CRC_CTRL_WAS_MASK;&lt;BR /&gt; //Write Data in 16bit Pairs&lt;BR /&gt; for (i=0; i&amp;lt;length; i=i+2)&lt;BR /&gt; {&lt;BR /&gt; high = (uint8_t) *(msg+i);&lt;BR /&gt; low = (uint8_t) *(msg+i+1);&lt;BR /&gt; data_out = (high&amp;lt;&amp;lt;8) | low;&lt;BR /&gt; CRC0-&amp;gt;ACCESS16BIT.DATAL = (uint16_t)data_out;&lt;BR /&gt; }&lt;BR /&gt; //Read Calculated CRC from Register&lt;BR /&gt; data_out=(CRC0-&amp;gt;DATA);&lt;BR /&gt; //Get Higher 16 Bits&lt;BR /&gt; data_out=data_out&amp;gt;&amp;gt;16;&lt;BR /&gt; //Disable CRC-Clock&lt;BR /&gt; SIM-&amp;gt;SCGC6 &amp;amp;= ~SIM_SCGC6_CRC_MASK;&lt;BR /&gt; //Return CRC&lt;BR /&gt; return (uint16_t)data_out;&lt;BR /&gt;}&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;BR /&gt;.Hope this helps those who look for it.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 03 Apr 2017 13:06:57 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440909#M25821</guid>
      <dc:creator>nikolausbauly</dc:creator>
      <dc:date>2017-04-03T13:06:57Z</dc:date>
    </item>
    <item>
      <title>Re: Looking for CRC16 app note for Modbus CRC</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440910#M25822</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;It's great to see that the CRC can be done in hardware, but as someone who's also doing Modbus RTU stuff right now, I'm curious what the motivation is. &amp;nbsp;Modbus usually runs at not more than 19.2 kbps and I've always done the CRC calculation in software, even on 8-bit MCUs running at a few MHz. &amp;nbsp;Are you processing Modbus data at a very high rate, or are you otherwise resource-constrained?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I expect I'll keep using the software implementation for ease of debugging and portability unless I start running it at much higher rates.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Scott&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 03 Apr 2017 18:02:58 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440910#M25822</guid>
      <dc:creator>scottm</dc:creator>
      <dc:date>2017-04-03T18:02:58Z</dc:date>
    </item>
    <item>
      <title>Re: Looking for CRC16 app note for Modbus CRC</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440911#M25823</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Well I mainly wanted to get it working, because I like to be capable of using all HW-modules.&lt;BR /&gt;The second thing is, that I'm working on µVision right now, and my Professional Version expired recently, so I can only use 32Kb of code size. &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 04 Apr 2017 10:02:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/440911#M25823</guid>
      <dc:creator>nikolausbauly</dc:creator>
      <dc:date>2017-04-04T10:02:30Z</dc:date>
    </item>
    <item>
      <title>Re: Looking for CRC16 app note for Modbus CRC</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/1250668#M59975</link>
      <description>&lt;P&gt;Thanks Tim, that helped me a lot, have an excellent day&lt;/P&gt;</description>
      <pubDate>Tue, 23 Mar 2021 18:48:36 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Looking-for-CRC16-app-note-for-Modbus-CRC/m-p/1250668#M59975</guid>
      <dc:creator>ErnestoCapuano</dc:creator>
      <dc:date>2021-03-23T18:48:36Z</dc:date>
    </item>
  </channel>
</rss>

