User_1 Опубликовано 8 июня, 2018 Поделиться Опубликовано 8 июня, 2018 (изменено) Всем доброго времени суток! Кто-нибудь может поделиться рабочим примером инициализации I2C в STM32F030? Ну или может увидите в моём коде ошибку RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // Включаем тактирование RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; // Speed 50 MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // Альтернативная функция GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Без подтяжки GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // Открытый сток GPIO_Init(GPIOA, &GPIO_InitStructure); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; // Режим работы (I2C) I2C_InitStructure.I2C_OwnAddress1 = 0x11; // Адрес (не важен, если устройство - мастер) I2C_InitStructure.I2C_Timing = 0x00300619; // Значение для записи в регистр I2C_TIMINGR I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_Cmd(I2C1, ENABLE); I2C_Init(I2C1, &I2C_InitStructure); Полдня уже вожусь, никак не заводится. Компилится без ошибок, светодиод мигает (ну в основном цикле написана простая светодиодная мигалка и раз в секунду - отправка сообщения в I2C), но смотрю логическим анализатором - на ножках тишина (ну в смысле единичка всегда, они же подтянуты резисторами к плюсу) I2C_Timing рассчитывается калькулятором от ST (I2C Timing Configuration) на основе частоты тактирования модуля I2C, желаемой скорости шины и ещё пары параметров, калькулятор прикрепил к сообщению I2C_Timing_Configuration_V1.0.1.xls Изменено 8 июня, 2018 пользователем User_1 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
snn_krs Опубликовано 8 июня, 2018 Поделиться Опубликовано 8 июня, 2018 Надо выбрать какая альтернативная функция используется GPIO_PinAFConfig( GPIOA, GPIO_PinSource9, GPIO_AF_4 ); GPIO_PinAFConfig( GPIOA, GPIO_PinSource10, GPIO_AF_4 ); 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
User_1 Опубликовано 8 июня, 2018 Автор Поделиться Опубликовано 8 июня, 2018 10 минут назад, snn_krs сказал: Надо выбрать какая альтернативная функция используется Тоже пробовал, не помогло 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
snn_krs Опубликовано 8 июня, 2018 Поделиться Опубликовано 8 июня, 2018 Поменяйте местами I2C_Cmd(I2C1, ENABLE); I2C_Init(I2C1, &I2C_InitStructure); 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
User_1 Опубликовано 8 июня, 2018 Автор Поделиться Опубликовано 8 июня, 2018 (изменено) Запаял новый мк - заработало) Вот рабочий код инициализации, если кому понадобится. Проверен на МК STM32F030F4P6. При частоте системной шины 8 МГц, модуль I2C работает на 400 кГц void Init_I2C1(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // Включаем тактирование RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; // Speed 50 MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; // Альтернативная функция GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Без подтяжки GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // Открытый сток GPIO_Init(GPIOA, &GPIO_InitStructure); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; // Режим работы (I2C) I2C_InitStructure.I2C_OwnAddress1 = 0x11; // Адрес (не важен, если устройство - мастер) I2C_InitStructure.I2C_Timing = 0x0010020A; // Значение для записи в регистр I2C_TIMINGR I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; GPIO_PinAFConfig( GPIOA, GPIO_PinSource9, GPIO_AF_4 ); GPIO_PinAFConfig( GPIOA, GPIO_PinSource10, GPIO_AF_4 ); I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); } 15 минут назад, snn_krs сказал: Поменяйте местами Поменял - никак не отразилось на работоспособности. Но где-то читал (уже не вспомню где), что нужно инициализировать только уже включенный модуль, так что оставил как есть Изменено 8 июня, 2018 пользователем User_1 Подкорректировал код 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
snn_krs Опубликовано 8 июня, 2018 Поделиться Опубликовано 8 июня, 2018 В самом начале файла stm32f0xx_i2c.c описана процедура инициализации. Некоторые регистры нельзя изменять при включенном устройстве. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
User_1 Опубликовано 8 июня, 2018 Автор Поделиться Опубликовано 8 июня, 2018 4 минуты назад, snn_krs сказал: В самом начале файла stm32f0xx_i2c.c описана процедура инициализации. Некоторые регистры нельзя изменять при включенном устройстве. Спасибо, исправил в коде выше 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterElectric Опубликовано 9 июня, 2018 Поделиться Опубликовано 9 июня, 2018 16 часов назад, User_1 сказал: Но где-то читал (уже не вспомню где), что нужно инициализировать только уже включенный модуль, так что оставил как есть Улыбнуло... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
LiVit Опубликовано 16 июня, 2018 Поделиться Опубликовано 16 июня, 2018 После танцев с бубном с м/к STM32F103 - там I2C вылетал постоянно и беспричинно, перешел на библиотеку CPAL, тем паче, что STMовцы её сами и рекомендуют. Для STM32F0xxx STM32F3xx есть своя библиотека - CPAL v2. Очень рекомендую. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
dosikus Опубликовано 19 июня, 2018 Поделиться Опубликовано 19 июня, 2018 На F0 ни палы ни калы и на невперлись ... 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Oxford Опубликовано 5 августа, 2018 Поделиться Опубликовано 5 августа, 2018 АГА, на CMSIS несколько строк кода и знание железа. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
AVI-crak Home Опубликовано 5 августа, 2018 Поделиться Опубликовано 5 августа, 2018 В случае i2c - нескольких строчек на CMSIS явно недостаточно. Там только один алгоритм обработки ошибок - целая портянка. А без него i2c будет работать до первого зелёного свистка, что явно не добавит надёжности девайсу. И ещё, i2c - крайне тормозная периферия. Здесь нет смысла ждать моментального отклика после прямой записи в регистры. Отчего сам алгоритм обмена начинает смахивать на магию - когда улучшенный и вычищенный от мусора код просто перестаёт работать. Это результат слишком быстрого всплытия, когда лёд ещё не успел растаять... (образное выражение) Причём размер портянки обработки ошибок - почти константа, без малейшей зависимости от версии чипа. Размер одинаковый, смысл сходный, а код разный. Аминь. 0 RtoS Ссылка на комментарий Поделиться на другие сайты Поделиться
Oxford Опубликовано 6 августа, 2018 Поделиться Опубликовано 6 августа, 2018 Я говорю про инит код что выше. Кстати есть код что за обработку ошибок вы делаете посмотреть? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
AVI-crak Home Опубликовано 6 августа, 2018 Поделиться Опубликовано 6 августа, 2018 Есть, но я всё-ещё считаю его сырым. На данный момент я просто сбрасываю состояние и прокачиваю шину с нулевым адресом. Однако это не совсем правильно. Там масса флагов под конкретные виды ошибок, все они должны обрабатываться по разному. И конечно-же любой сбой должен аннулировать предыдущую операцию на шине i2c. И вот тут возникает прикол, который я не могу побороть уже чёрт знает сколько времени. Внешнее ведомое устройство помнит о сбое. Естественно обработка ошибок в нём то-же есть, причём мне кажется обработка должна выполняться по всем правилам интерфейса i2c. Дык вот, алгоритмы не совпадают. И при этом непонятно - какой из чёрных ящиков работает не по стандарту. А сам стандарт я уже вдоль и поперёк перекопал. Даже полностью программным вариантом нагружал - ошибки разные и не повторяющиеся. 0 RtoS Ссылка на комментарий Поделиться на другие сайты Поделиться
Oxford Опубликовано 6 августа, 2018 Поделиться Опубликовано 6 августа, 2018 (изменено) Это вы с какой микросхемой общаетесь по I2C? И какой микроконтроллер? I2C достаточно простая шина, странно что у вас с ним проблемы возникают. Изменено 6 августа, 2018 пользователем Oxford 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
AVI-crak Home Опубликовано 7 августа, 2018 Поделиться Опубликовано 7 августа, 2018 С активными датчиками: в которых есть собственные таймеры, буферы данных - которые обязательно нужно читать под кривым углом, регистры состояний - с чёткой последовательностью в алгоритме доступа. Это когда простой сбой на линии данных вызывает очевидный сбой в алгоритме работы датчика. И тогда уже он начинает куралесить в шину i2c. С пассивными компонентами проблем нет. Там обработку ошибок можно существенно сократить. Но если датчик умеет работать в режиме мастера - вот тогда начинаются пляски. Какие именно датчики? всё новое и связанное с авионикой. 0 RtoS Ссылка на комментарий Поделиться на другие сайты Поделиться
Oxford Опубликовано 7 августа, 2018 Поделиться Опубликовано 7 августа, 2018 Что за датчик? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
AVI-crak Home Опубликовано 7 августа, 2018 Поделиться Опубликовано 7 августа, 2018 Думаю что эта информация не принесёт пользы. MPU9255, TSC2007, BME280, MCP3421, и ещё с десяток подобной мелочи. Далеко не все чипы будут работать в девайсе, но они все распаяны на макетке. 0 RtoS Ссылка на комментарий Поделиться на другие сайты Поделиться
Oxford Опубликовано 8 августа, 2018 Поделиться Опубликовано 8 августа, 2018 (изменено) Да все там работает не надо придумывать. Ошибки у себя ищите. Абстрактно рассуждать не интересно. Если есть конкретный случай можно рассмотреть. Изменено 8 августа, 2018 пользователем Oxford 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dosikus Опубликовано 12 сентября, 2018 Поделиться Опубликовано 12 сентября, 2018 Я что-то так же граблей не обнаружил. Модуль намного лучше чем в F1. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.