реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> STM32F0 и CRC16, как быть с байтами?
toweroff
сообщение Dec 21 2015, 20:14
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Всем привет

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

Включил в AHB
Полином (при считывании - все верно, 0x8005)
Прописал 0 в INIT
Дернул по ИЛИ RESET в CR

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

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

Как вообще правильно работать с CRC? Данные должны быть соразмерны полиному?
Go to the top of the page
 
+Quote Post
spf
сообщение Dec 22 2015, 03:41
Сообщение #2


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(toweroff @ Dec 22 2015, 01:14) *
Как вообще правильно работать с CRC? Данные должны быть соразмерны полиному?


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


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
VAI
сообщение Dec 22 2015, 05:23
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



А я всегда думал, что блок расчета CRC в STM32 считает CRC32...
Вот здесь я выкладывал 2 функции, программную и железную для STM32. Результат их работы одинаков. И да, на вход блока CRC32 должны подаваться 32-х битные слова.
В "железной" функции по ссылке применена "uint32_t __rbit( uint32_t )", Кеил её прекрасно понимает. Она реверсирует слово. И, похоже, в Cortex-M0 такой команды нету...
А здесь я сейчас нашел статейку про аппаратный блок расчета CRC в STM32...
А CRC16 я считаю программно.
CODE

/* --- 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
}



--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
slavokhire5
сообщение Dec 22 2015, 06:42
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 31-03-14
Из: Харьков
Пользователь №: 81 165



Если вы пишете расчет контрольной суммы для передающей и принимающей стороны, то вы можете написать что угодно, лишь бы одинаково с обоих сторон) допустим использовать 16 байт из CRC32 sm.gif
для всяких "ручных" расчетов сумм я обычно использую сумму флетчера - намного меньше процессорного времени хавает. особенно на каких-нибудь чахлых контроллерах с 8 битами и низкой тактовой частото =)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 22 2015, 07:44
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(VAI @ Dec 22 2015, 08:23) *
А я всегда думал, что блок расчета CRC в STM32 считает CRC32...
В STM32F - да, в STM32L сделали возможность грузить любой полином.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 22 2015, 07:45
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(spf @ Dec 22 2015, 06:41) *

Цитата(slavokhire5 @ Dec 22 2015, 09:42) *

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

Цитата(VAI @ Dec 22 2015, 08:23) *
А я всегда думал, что блок расчета CRC в STM32 считает CRC32...
Вот здесь я выкладывал 2 функции, программную и железную для STM32. Результат их работы одинаков. И да, на вход блока CRC32 должны подаваться 32-х битные слова.
В "железной" функции по ссылке применена "uint32_t __rbit( uint32_t )", Кеил её прекрасно понимает. Она реверсирует слово. И, похоже, в Cortex-M0 такой команды нету...
А здесь я сейчас нашел статейку про аппаратный блок расчета CRC в STM32...


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

а у F0 таки да, можно менять и полином, и размер полинома и начальное значение
Go to the top of the page
 
+Quote Post
spf
сообщение Dec 22 2015, 07:55
Сообщение #7


Странник
****

Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051



Цитата(toweroff @ Dec 22 2015, 12:45) *
разве я спрашивал о сути CRC или программной реализации? вопрос только об аппаратном модуле CRC у STM32F0


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


--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 22 2015, 08:08
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(spf @ Dec 22 2015, 10:55) *
Теоретическую часть нужно знать хотя бы для того, чтобы вопросы задавать хоть на минимальном базисе. Это касается вопроса "Данные должны быть соразмерны полиному?".


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

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 22 2015, 08:23
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(toweroff @ Dec 22 2015, 10:45) *
а у F0 таки да, можно менять и полином, и размер полинома и начальное значение
У F0x0 - нельзя. Впрочем, там кроме разрядности и собственно полинома еще и зеркалирование данных задается. Может нужно отзеркалировать ваш полином и входные/выходные данные?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SSerge
сообщение Dec 22 2015, 08:42
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Сергей Борщ @ Dec 22 2015, 15:23) *
У F0x0 - нельзя.

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

Хорошо бы код посмотреть повнимательнее, потому что DR описан как __IO uint32_t DR;
и если просто писать в CRC->DR то запись всегда будет происходить словами.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 22 2015, 11:44
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(SSerge @ Dec 22 2015, 11:42) *
Вы оба правы wink.gif
У F030 и F070 полином не изменяемый, а у остальных: F0x1, F0x2 и F0x8 можно дополнительно грузить полином и настраивать его длину 7, 8, 16, 32 бита.
Для обоих в реф. мануалах пишут что можно писать байтами, полусловами или словами.

Хорошо бы код посмотреть повнимательнее, потому что DR описан как __IO uint32_t DR;
и если просто писать в CRC->DR то запись всегда будет происходить словами.

именно так, у меня 071 и мне можно wink.gif

да только толку-то... да, результат разный, если к DR обращаться напрямую или как *(uint8_t), да только все равно не совпадает sad.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 22 2015, 12:56
Сообщение #12


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Вот здесь погоняйте свои байты в хвост и в гриву, пока не получите CRC, совпадающую с аппаратной в STM. Мне помогло.
http://depa.usst.edu.cn/chenjq/www2/softwa...calculation.htm
http://www.zorc.breitbandkatze.de/crc.html
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 22 2015, 13:10
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(ViKo @ Dec 22 2015, 15:56) *
Вот здесь погоняйте свои байты в хвост и в гриву, пока не получите CRC, совпадающую с аппаратной в STM. Мне помогло.
http://depa.usst.edu.cn/chenjq/www2/softwa...calculation.htm
http://www.zorc.breitbandkatze.de/crc.html

угу.. доберусь только до железки
спсибо
Go to the top of the page
 
+Quote Post
toweroff
сообщение Dec 22 2015, 16:41
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



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

Скармливаю побайтно, обращение к регистру данных через
Код
    *(__IO uint8_t *)((uint32_t)&(CRC->DR)) = data8;


всем спасибо!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 22 2015, 16:54
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(toweroff @ Dec 22 2015, 19:41) *
Все, заработало.
И? В чем была проблема?

Цитата(toweroff @ Dec 22 2015, 19:41) *
обращение к регистру данных через
Код
    *(__IO uint8_t *)((uint32_t)&(CRC->DR)) = data8;
Ужас. Зачем указатель явно приводить к 32-битному целому, чтобы потом его привести обратно к указателю? *(__IO uint8_t *)&CRC->DR было бы достаточно. Если уж хочется приводить к целому - то для этого есть специально заточенный uintptr_t, но здесь он не нужен. Совсем.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016