А между тем, только сейчас заметил, что год назад вышла новая версия ERRATA для STM32F030. По сравнению с предыдущей версией выросла в объеме в два раза.
Чуть больше двух лет назад я не один день промучился пытаясь использовать возможность SPI в STM32F030 автоматически вычислять и добавлять CRC при отправке данных. Функция была мне крайне нужна. Объем, частота и скорость пересылки данных были очень высокими, так что даже используя аппаратный модуль вычисления CRC ресурсов МК бы не хватило. Проблема была в том, что функция автоматического добавления CRC к посылкам через SPI во-первых была крайне плохо документирована, во-вторых работала откровенно глючно. Я уж не помню всех подробностей и нюансов, но глюки были откровенные. При этом в интернете было несколько сообщений от людей столкнувшихся с такой же или близкой проблемой, но без внятных решений. Да и видимо этой функцией мало кто пользуется, поэтому информации было совсем мало. Разумеется я проверил ERRATA на серию, но на тот момент там не было ничего про это.
В конце концов, я решил проблему несколько корявым, на первый взгляд способом - я выяснил, что при первой отправке данных, при соблюдении ряда условий CRC всегда вычисляется и передается корректно, а вот при следующих посылках начинаются проблемы. Поэтому я поступил брутально - просто стал сбрасывать модуль SPI перед каждой передачей данных и настраивать заново, благо в регистре RCC есть биты для сброса различных модулей.
RCC->APB2RSTR |= RCC_APB2RSTR_SPI1RST;
RCC->APB2RSTR &= ~RCC_APB2RSTR_SPI1RST;
Думаю этот код можно упростить до двух атомарных операций, но что есть написанное 2+ года назад - то есть :)
Забавно, но этот подход сработал и полностью себя оправдал. Пока вы читали этот пост - где-то на этой планете модуль SPI был сброшен несколько миллионов раз :)
А сейчас я открыл свеженькую ERRAT-у и увидел. что там появились пункты про SPI+CRC аж четыре. Причем навскидку там нет моей проблемы, хотя сейчас разбираться уже лень. Дааа, знатно они с этой частью накосячили, наверное какой-то студент писал код в режиме аврала :)))
P.S. Вот было бы весело товарищам использующим SPL/HAL в случае столкновения с подобными проблемами. Вот все равно бы пришлось лезть и в документацию и в регистры и разбираться и переписывать всю работу со SPI на прямую работу с регистрами без лишних прослоек.