toweroff 1 21 декабря, 2015 Опубликовано 21 декабря, 2015 · Жалоба Всем привет Сабж и непонятное подсчитывание Включил в AHB Полином (при считывании - все верно, 0x8005) Прописал 0 в INIT Дернул по ИЛИ RESET в CR Далее скармливаю ему в DR байты (иначе не получится по поступлению данных) Ну и не сходится Как вообще правильно работать с CRC? Данные должны быть соразмерны полиному? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spf 0 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба Как вообще правильно работать с CRC? Данные должны быть соразмерны полиному? Теории на счёт CRC предостаточно, как вариант - Циклический избыточный код и т.д. и т.п. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VAI 0 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба А я всегда думал, что блок расчета CRC в STM32 считает CRC32... Вот здесь я выкладывал 2 функции, программную и железную для STM32. Результат их работы одинаков. И да, на вход блока CRC32 должны подаваться 32-х битные слова. В "железной" функции по ссылке применена "uint32_t __rbit( uint32_t )", Кеил её прекрасно понимает. Она реверсирует слово. И, похоже, в Cortex-M0 такой команды нету... А здесь я сейчас нашел статейку про аппаратный блок расчета CRC в STM32... А CRC16 я считаю программно. /* --- crc16() -------------------------------------------------------------------------------------------- ** * Контрольная сумма crc16 * BYTE *buf - указатель на байтовый буфер * short num - размер буфера в байтах * Возвращает * unsigned short crc16 буфера * -------------------------------------------------------------------------------------------------------- */ unsigned short crc16( BYTE *buf, unsigned short num ) { #define POLINOM 0xa001 int i; WORD crc = 0xffff; while ( num-- ) { crc ^= *buf++; i = 8; do { if ( crc & 1 ) crc = ( crc >> 1 ) ^ POLINOM; else crc >>= 1; } while ( --i ); } return( crc ); #undef POLINOM } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavokhire5 0 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба Если вы пишете расчет контрольной суммы для передающей и принимающей стороны, то вы можете написать что угодно, лишь бы одинаково с обоих сторон) допустим использовать 16 байт из CRC32 :) для всяких "ручных" расчетов сумм я обычно использую сумму флетчера - намного меньше процессорного времени хавает. особенно на каких-нибудь чахлых контроллерах с 8 битами и низкой тактовой частото =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба А я всегда думал, что блок расчета CRC в STM32 считает CRC32...В STM32F - да, в STM32L сделали возможность грузить любой полином. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба разве я спрашивал о сути CRC или программной реализации? вопрос только об аппаратном модуле CRC у STM32F0 А я всегда думал, что блок расчета CRC в STM32 считает CRC32... Вот здесь я выкладывал 2 функции, программную и железную для STM32. Результат их работы одинаков. И да, на вход блока CRC32 должны подаваться 32-х битные слова. В "железной" функции по ссылке применена "uint32_t __rbit( uint32_t )", Кеил её прекрасно понимает. Она реверсирует слово. И, похоже, в Cortex-M0 такой команды нету... А здесь я сейчас нашел статейку про аппаратный блок расчета CRC в STM32... спасибо, буду посмотреть а у F0 таки да, можно менять и полином, и размер полинома и начальное значение Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spf 0 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба разве я спрашивал о сути CRC или программной реализации? вопрос только об аппаратном модуле CRC у STM32F0 Теоретическую часть нужно знать хотя бы для того, чтобы вопросы задавать хоть на минимальном базисе. Это касается вопроса "Данные должны быть соразмерны полиному?". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба Теоретическую часть нужно знать хотя бы для того, чтобы вопросы задавать хоть на минимальном базисе. Это касается вопроса "Данные должны быть соразмерны полиному?". да вы хоть поняли, что я спрашивал? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба а у F0 таки да, можно менять и полином, и размер полинома и начальное значениеУ F0x0 - нельзя. Впрочем, там кроме разрядности и собственно полинома еще и зеркалирование данных задается. Может нужно отзеркалировать ваш полином и входные/выходные данные? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба У F0x0 - нельзя. Вы оба правы ;) У F030 и F070 полином не изменяемый, а у остальных: F0x1, F0x2 и F0x8 можно дополнительно грузить полином и настраивать его длину 7, 8, 16, 32 бита. Для обоих в реф. мануалах пишут что можно писать байтами, полусловами или словами. Хорошо бы код посмотреть повнимательнее, потому что DR описан как __IO uint32_t DR; и если просто писать в CRC->DR то запись всегда будет происходить словами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба Вы оба правы ;) У F030 и F070 полином не изменяемый, а у остальных: F0x1, F0x2 и F0x8 можно дополнительно грузить полином и настраивать его длину 7, 8, 16, 32 бита. Для обоих в реф. мануалах пишут что можно писать байтами, полусловами или словами. Хорошо бы код посмотреть повнимательнее, потому что DR описан как __IO uint32_t DR; и если просто писать в CRC->DR то запись всегда будет происходить словами. именно так, у меня 071 и мне можно ;) да только толку-то... да, результат разный, если к DR обращаться напрямую или как *(uint8_t), да только все равно не совпадает :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба Вот здесь погоняйте свои байты в хвост и в гриву, пока не получите CRC, совпадающую с аппаратной в STM. Мне помогло. http://depa.usst.edu.cn/chenjq/www2/softwa...calculation.htm http://www.zorc.breitbandkatze.de/crc.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба Вот здесь погоняйте свои байты в хвост и в гриву, пока не получите CRC, совпадающую с аппаратной в STM. Мне помогло. http://depa.usst.edu.cn/chenjq/www2/softwa...calculation.htm http://www.zorc.breitbandkatze.de/crc.html угу.. доберусь только до железки спсибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба Все, заработало. Скармливаю побайтно, обращение к регистру данных через *(__IO uint8_t *)((uint32_t)&(CRC->DR)) = data8; всем спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 22 декабря, 2015 Опубликовано 22 декабря, 2015 · Жалоба Все, заработало.И? В чем была проблема? обращение к регистру данных через *(__IO uint8_t *)((uint32_t)&(CRC->DR)) = data8; Ужас. Зачем указатель явно приводить к 32-битному целому, чтобы потом его привести обратно к указателю? *(__IO uint8_t *)&CRC->DR было бы достаточно. Если уж хочется приводить к целому - то для этого есть специально заточенный uintptr_t, но здесь он не нужен. Совсем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться