четверг, 18 сентября 2014 г.

stm32f407 и i2c

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



1 комментарий:

  1. Так и не понял - а куда там эти самые 3 Вольта? Датчик же вроде изначально запитан? И подтяжки тоже...

    ОтветитьУдалить