Ух тыж... ... мать....
Других слов нет. Если в какой ардунине или тексасовой мпушке i2c заводится на раз левой задней ногой. То аппаратный i2c на stm32 серии при таком же подходе, как к ардуине будет в лучшем случае работать глючно и виснуть. В худшем, вообще не заведется. отчего, Собственно, говоря, куча народу занимается на этих камнях безысходными говновелосипедами реализацией софтверного i2c на тех же самых выводах, путем ногодрыга по таймеру.
Я тоже не избежал участи сей. Бег по граблям был долгим и неприятным. Но победил.
Для начала я пробежался по всем детским граблям, связанным с тактированием и делителями частот, STM32F407 - классный камень, но блин..... Не все такие крутые шаманы, чтобы лихо нащелкать нужных делителей и множителей на нужные ноги и интерфейсы. Особенно угнетает, что даже для демо плат, той же STM32F4Discovery , нету простых заголовочных файлов, тупо включающих в той или ной комбинации всю периферию на максимальной частоте от внешнего кварца. Ну почему? Типа чтоб разработчик сразу познавал дзен?
Ну да. Я познал дзен. Путем нескольких бессонных ночей я таки собрал нужные настройки по частоте. И хрен я теперь этот файл когда буду менять. Незачем просто. Вот может соберусь и выложу в доступ.
Далее. После детских граблей, когда частоты правильно выставлены, ноги затактированы, подтяжечные резисторы включены и на потуги управлять интерфейсом даже меняются уровни на ножках, наступает вторая фаза. Уровни со стороны мастера меняются, а слейв отвечает не в попад или не всегда, или тупит, ил теряет что-то или потоком читает из одного регистра, а потом виснет. И наступает второй цикл бессонных ночей, когда качаешь их интернета всякие примеры работы с шиной. А они однотипно не работают. Или работают не дальше, чем чтение регистра WHO_IM. И свирипеешь. И понимаешь, что где-то какая-то жопа. Или думаешь, что камень кривой, или думаешь что что-то спалил. А потом краем глаза где-то в интернетах читаешь, что у кого-то тоже не работало, так он провода укоротил до датчиков и все заработало. И ты укорачиваешь и без того коротенькие провода. и паяешь и наращиваешь толщину. И все равно та же жопа. И что обидно. Эта же плата с датчиками, воткнутая в ардуинку, работает как швейцарские часики даже с двухметровым кабелем, скрученным из остатков китайской витой пары. И ты свирипеешь еще больше. И тут приходит осознание. 3.3 вольта. Питание с шины от которой живет процессор. Думаешь.... И приходит озарение. Паять времени нет. В три часа ночи трясущимися руками ты подводишь к датчику непонятных три вольта от двух китайских батареек и случается чудо! На байт! Ack! На еще! Ack! еще, еще, еще Ack! байтики бегут, параметры собираются. Ты уже прикидываешь как правильно интегрировать гироскоп..... Но тут некстати виснет отладчик. Перегружаешься и .... Ага и ничего не работает. Нифуа ни ресеты ни пляски с бубном.
На следующий день - следующий раунд. Собираешь все обратно. Подтыкаешь батарейки и то, что вчера не работало, опять бодро работает. Чертовщина какая-то. Пара тестов туда-сюда и опять жопа. Тыцкаешь в ножки щупом померять уровни, так блад и есть, плата датчиков зажала шину и держит. Втыкаешь в ардуину для теста. Там как всегда все хорошо.
Начинаешь думать. И мысль приходит - вероятно мастер не закончил прием. Тут же моделируешь ситуацию, и да. 100% воспроизведение. Шина залочена слейвом.
Ну что. Как бы решение простое. Дать слейву дотрындеть то, что не успел, из-за прерывания или из за еше чего-то.
И все. Все работает. Но блин как все строго. Развращенный ардуинками, где на шине все само, поимел кучу седых волос, чтобы завести i2c на STM32 . Но! По-большому счету это вероятно правильно. Спецификацию нужно соблюдать на 100%. Хотя произхводителям других кристаллов честь и хвала за то, что многие кривости работы с интерфейсом они прощают.