Код был очень простой, буквально несколько обращений к разным хардварным регистрам - всегда всё работало, надеясь на надёжное описание периферии в подключаемом к проекту заголовочном файле.
А потом - однажды, ессно - всё сломалось!
Но это сейчас я знаю, что проблема была в хидере. Реально же поиск выглядел так:
1) ё-маё, пишу код в подключённый к микроконтроллеру чип, а он мне в ответ шлёт полнейшую хрень или вообще ничего не шлёт, при этом потребление низкое настолько, словно бы он сидит в сбросе
2) не сжёг ли я чип, паяя его на плату? Может, статикой прошибло? или перегрел? Да вроде нет, его собственный тактовый генератор работает - я вижу его частоту на выводах
3) а порядок бит в посылках правильный? вроде да, в отладке всё смотрится как надо
4) а полярность тактовых импульсов? Да, проверил два раза - ничему не менялось,,..
5) стоп.. менялась среда разработки. Ну-ка, флаги оптимизации какие? .. эхм.. -O0? странно, и ассемблерный код выгл.. стоп. А это что такое?
6) регистр микрокнтроллера, принимающий данные, 16-битный, так? А посылки SPI вообще 8-битные, так? А какого хрена тут 32-битное обращение
7) ну-ка, ткнём-ка осцилл в ножки.. сначала припаяем к ним тонюсенькие проволочки, и к ним уже.. так-так.. ага. И что же мы видим - там, где должны быть пачки из 8 импульсов, их на самом деле 16. Так-так, посмотрим в отладке ещё.. ага, ФИФО переполнен.
8) ну-ка, перепишем-ка! было
SPI1->DR = byte;
, а мы его щас принудиловкой в байтовый доступ: *(uint8_t*)&SPI1->DR = byte;
9) прошиваем.. ЕСТЬ! пошли восьмёрочки!
а всё потому, что какой-то неизвестный науке пидор решил, что раз процессор 32-битный, то и периферийные регистры должны быть описаны как 32-битные.