Перейти к содержанию
    

Всем привет

 

Сабж и непонятное подсчитывание

 

Включил в AHB

Полином (при считывании - все верно, 0x8005)

Прописал 0 в INIT

Дернул по ИЛИ RESET в CR

 

Далее скармливаю ему в DR байты (иначе не получится по поступлению данных)

 

Ну и не сходится

 

Как вообще правильно работать с CRC? Данные должны быть соразмерны полиному?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как вообще правильно работать с CRC? Данные должны быть соразмерны полиному?

 

Теории на счёт CRC предостаточно, как вариант - Циклический избыточный код и т.д. и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я всегда думал, что блок расчета 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
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вы пишете расчет контрольной суммы для передающей и принимающей стороны, то вы можете написать что угодно, лишь бы одинаково с обоих сторон) допустим использовать 16 байт из CRC32 :)

для всяких "ручных" расчетов сумм я обычно использую сумму флетчера - намного меньше процессорного времени хавает. особенно на каких-нибудь чахлых контроллерах с 8 битами и низкой тактовой частото =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я всегда думал, что блок расчета CRC в STM32 считает CRC32...
В STM32F - да, в STM32L сделали возможность грузить любой полином.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

разве я спрашивал о сути CRC или программной реализации? вопрос только об аппаратном модуле CRC у STM32F0

 

А я всегда думал, что блок расчета CRC в STM32 считает CRC32...

Вот здесь я выкладывал 2 функции, программную и железную для STM32. Результат их работы одинаков. И да, на вход блока CRC32 должны подаваться 32-х битные слова.

В "железной" функции по ссылке применена "uint32_t __rbit( uint32_t )", Кеил её прекрасно понимает. Она реверсирует слово. И, похоже, в Cortex-M0 такой команды нету...

А здесь я сейчас нашел статейку про аппаратный блок расчета CRC в STM32...

 

спасибо, буду посмотреть

 

а у F0 таки да, можно менять и полином, и размер полинома и начальное значение

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

разве я спрашивал о сути CRC или программной реализации? вопрос только об аппаратном модуле CRC у STM32F0

 

Теоретическую часть нужно знать хотя бы для того, чтобы вопросы задавать хоть на минимальном базисе. Это касается вопроса "Данные должны быть соразмерны полиному?".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теоретическую часть нужно знать хотя бы для того, чтобы вопросы задавать хоть на минимальном базисе. Это касается вопроса "Данные должны быть соразмерны полиному?".

 

да вы хоть поняли, что я спрашивал?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а у F0 таки да, можно менять и полином, и размер полинома и начальное значение
У F0x0 - нельзя. Впрочем, там кроме разрядности и собственно полинома еще и зеркалирование данных задается. Может нужно отзеркалировать ваш полином и входные/выходные данные?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У F0x0 - нельзя.

Вы оба правы ;)

У F030 и F070 полином не изменяемый, а у остальных: F0x1, F0x2 и F0x8 можно дополнительно грузить полином и настраивать его длину 7, 8, 16, 32 бита.

Для обоих в реф. мануалах пишут что можно писать байтами, полусловами или словами.

 

Хорошо бы код посмотреть повнимательнее, потому что DR описан как __IO uint32_t DR;

и если просто писать в CRC->DR то запись всегда будет происходить словами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы оба правы ;)

У F030 и F070 полином не изменяемый, а у остальных: F0x1, F0x2 и F0x8 можно дополнительно грузить полином и настраивать его длину 7, 8, 16, 32 бита.

Для обоих в реф. мануалах пишут что можно писать байтами, полусловами или словами.

 

Хорошо бы код посмотреть повнимательнее, потому что DR описан как __IO uint32_t DR;

и если просто писать в CRC->DR то запись всегда будет происходить словами.

именно так, у меня 071 и мне можно ;)

 

да только толку-то... да, результат разный, если к DR обращаться напрямую или как *(uint8_t), да только все равно не совпадает :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот здесь погоняйте свои байты в хвост и в гриву, пока не получите CRC, совпадающую с аппаратной в STM. Мне помогло.

http://depa.usst.edu.cn/chenjq/www2/softwa...calculation.htm

http://www.zorc.breitbandkatze.de/crc.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот здесь погоняйте свои байты в хвост и в гриву, пока не получите CRC, совпадающую с аппаратной в STM. Мне помогло.

http://depa.usst.edu.cn/chenjq/www2/softwa...calculation.htm

http://www.zorc.breitbandkatze.de/crc.html

угу.. доберусь только до железки

спсибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все, заработало.

 

Скармливаю побайтно, обращение к регистру данных через

    *(__IO uint8_t *)((uint32_t)&(CRC->DR)) = data8;

 

всем спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все, заработало.
И? В чем была проблема?

 

обращение к регистру данных через

    *(__IO uint8_t *)((uint32_t)&(CRC->DR)) = data8;

Ужас. Зачем указатель явно приводить к 32-битному целому, чтобы потом его привести обратно к указателю? *(__IO uint8_t *)&CRC->DR было бы достаточно. Если уж хочется приводить к целому - то для этого есть специально заточенный uintptr_t, но здесь он не нужен. Совсем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...