Цитата(scifi @ Oct 4 2013, 08:58)

Это всего лишь означает, что CRC нужно вычислять заранее.
Это не получится. Тепловычислитель. Я делаю рассчёты. Расчёты производятся от 0.1 сек до 3 сек и идут непрерывно. В случае пропадания питания, я должен остановить расчёт, а по включению выполнить, так называемый догон. Где некоторое время расчёты осущ. по последним полученным значениям, а потом переход к договорным.
Кое что я могу подготовить зарание и я это делаю.
===
Идея то обалденная. Такое бы вообще во все модули включить! Неплохо было бы к UARTу пришпандорить, к примеру.
Записываешь полином и получаешь CRC. Конечно лучше было бы ещё инициализацию делать, как предлагает
Сергей Борщ или хотя бы должен быть механизм пропуска служебной информации. Так как не всегда требуется всё подряд считать. Например передача USART по Modbus протоколу представляла бы следующее:
1. Инициализировал CRCTX регистр
2. Подготовил данные в буфере
3. Передал буфер с пом. ПДП
4. Передал 2 байта CRC вручную
Заманчиво ... ))
Беда только что ST вечно что-нибудь немного недодумает, либо криво реализует.
===
Итак для тех кто будет пытаться применить этот узел (аппаратный расчёт CRC при работе с SPI контроллером).
Если с какими-нибудь своими устройствами, то наверное всё Ок. Не могу сказать. Единственное, на что стоит обратит внимание, так это на то, что при работе с 8-ми битными данными у вас будет CRC8, c 16-ти битными - CRC16.
При работе с флэш памятью типа AT45DB возникают следующие проблемы:
1. По SPI вы посылаете комманды на м/х и данные. А считать требуется только данные.
2. Как работать с битом NEXT я не разобрался. Похоже его надо перед каждым байтом слать, но что-то у меня не получилось им управлять. Расчёт CRC всё равно производится.
Но, собственно, всё равно в режиме DMA он не работает.
3. Бит CRCEN корректно устанавливается/сбрасывается только при выключ. SPI. И сбрасывает CRC.
Таким образом, подытоживая, вы можете работать только с одной страницей флэши (или в пределах страницы).
Учитывая, что размер страницы > 256(512) можно CRC хранить в 257(513) байте и написать драйвер автоматического контроля. При этом можно задействовать DMA.
Учитывая, что CRC8 всё равно расчитан на объём ~256, то получается большего всё равно нет смысла добиваться.