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

 
 
> Eclipse / Linux / GCC / ChibiOs / STM32F401RET6 СRC engine неправильно вычисляет контрольную сумму
nanorobot
сообщение Apr 8 2018, 09:18
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Код
  CRC->CR = CRC_CR_RESET;                               // сбросим регистр данных CRC Engine
  for(i = 0; i < FRAME_SIZE - 1; i++)                         // цикл по всем словам данных, кроме последнего
    CRC->DR = TxData[i];                                            // вычисляем CRC
    TxData[i] = CRC->DR;                                            // и заносим в последнее слово данных
  
  spiStartExchange(&SPID2, 12, TxData, RxData);

Контрольная сумма вычисляется неверно (не совпадает с CRC на принимающей стороне, при одинаковых данных на обеих сторонах). Если поставить брекпоинт на любой из первых трех строчек, и прогнать по шагам, CRC вычисляется верно. Если брекпоинт поставить на 4 или 5 строке - CRC неверно. Запрещать прерывания нв время вычисления CRC пробовал - не помогло. CRC Engine используется только в одном Thread.

P.S. TxData - uint32_t

Сообщение отредактировал nanorobot - Apr 8 2018, 09:33
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 8 2018, 10:08
Сообщение #2


Гуру
******

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



QUOTE (nanorobot @ Apr 8 2018, 11:18) *
Если поставить брекпоинт на любой из первых трех строчек, и прогнать по шагам, CRC вычисляется верно. Если брекпоинт поставить на 4 или 5 строке - CRC неверно.
Если непосредственно перед этим кодом включается тактирование модуля CRC, то после него надо вставить __DSB() - тактирование не успевает включиться и CRC->CR = CRC_CR_RESET не отрабатывается.


--------------------
На любой вопрос даю любой ответ
"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
nanorobot
сообщение Apr 8 2018, 10:41
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 244
Регистрация: 29-02-08
Пользователь №: 35 503



Цитата(Сергей Борщ @ Apr 8 2018, 15:08) *
Если непосредственно перед этим кодом включается тактирование модуля CRC, то после него надо вставить __DSB() - тактирование не успевает включиться и CRC->CR = CRC_CR_RESET не отрабатывается.

Нет, тактирование включается модуля CRC значительно раньше. Тем не менее совет проверил - не помогло.


__DSB() поставил после строки CRC->CR = CRC_CR_RESET - заработало! Спасибо за помощь. Жаль только, чт понимания не прибавилось. Не первый раз поьзуюсь расчетом CRC, в том числе и на STM32F401, но такая проблема первый раз.

Сообщение отредактировал nanorobot - Apr 8 2018, 10:42
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 8 2018, 16:08
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Что-то мне смутно припоминается, что после CRC->CR = CRC_CR_RESET надо 3 nop-а. (Как раз Сергей это и раскопал, кстати).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



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

 


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


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