Перейти к содержанию

I2C в STM32F030


User_1

Рекомендуемые сообщения

Всем доброго времени суток!

Кто-нибудь может поделиться рабочим примером инициализации 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

Изменено пользователем User_1
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Запаял новый мк - заработало)

Вот рабочий код инициализации, если кому понадобится. Проверен на МК 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);
}

2018-06-08_19-33-56.thumb.png.765ca2e332871b25b74e2c331ef21f2f.png

15 минут назад, snn_krs сказал:

Поменяйте местами

Поменял - никак не отразилось на работоспособности. Но где-то читал (уже не вспомню где), что нужно инициализировать только уже включенный модуль, так что оставил как есть

Изменено пользователем User_1
Подкорректировал код
Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, snn_krs сказал:

В самом начале файла stm32f0xx_i2c.c описана процедура инициализации. Некоторые регистры нельзя изменять при включенном устройстве.

Спасибо, исправил в коде выше

Ссылка на комментарий
Поделиться на другие сайты

16 часов назад, User_1 сказал:

Но где-то читал (уже не вспомню где), что нужно инициализировать только уже включенный модуль, так что оставил как есть

Улыбнуло...

Ссылка на комментарий
Поделиться на другие сайты

После танцев с бубном с м/к STM32F103 - там I2C вылетал постоянно  и беспричинно, перешел на библиотеку CPAL, тем паче, что STMовцы её сами и рекомендуют.

Для STM32F0xxx STM32F3xx есть своя библиотека - CPAL v2. Очень рекомендую.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

В случае i2c - нескольких строчек на CMSIS явно недостаточно. Там только один алгоритм обработки ошибок - целая портянка. А без него  i2c будет работать до первого зелёного свистка, что явно не добавит надёжности девайсу. И ещё, i2c - крайне тормозная периферия. Здесь нет смысла ждать моментального отклика после прямой записи в регистры. Отчего сам алгоритм обмена начинает смахивать на магию - когда улучшенный и вычищенный от мусора код просто перестаёт работать. Это результат слишком быстрого всплытия, когда лёд ещё не успел растаять... (образное выражение) 

Причём размер портянки обработки ошибок - почти константа, без малейшей зависимости от версии чипа. Размер одинаковый, смысл сходный, а код разный. Аминь.

Ссылка на комментарий
Поделиться на другие сайты

Есть, но я всё-ещё считаю его сырым. 

На данный момент я просто сбрасываю состояние и прокачиваю шину с нулевым адресом. Однако это не совсем правильно. Там масса флагов под конкретные виды ошибок, все они должны обрабатываться по разному. И конечно-же любой сбой должен аннулировать предыдущую операцию на шине i2c.

И вот тут возникает прикол, который я не могу побороть уже чёрт знает сколько времени. Внешнее ведомое устройство помнит о сбое. Естественно обработка ошибок в нём то-же есть, причём мне кажется обработка должна выполняться по всем правилам интерфейса i2c.

Дык вот, алгоритмы не совпадают. И при этом непонятно - какой из чёрных ящиков работает не по стандарту. А сам стандарт я уже вдоль и поперёк перекопал. Даже полностью программным вариантом нагружал - ошибки разные и не повторяющиеся. 

Ссылка на комментарий
Поделиться на другие сайты

Это вы с какой микросхемой общаетесь по I2C? И какой микроконтроллер? I2C достаточно простая шина, странно что у вас с ним проблемы возникают.

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

С активными датчиками: в которых есть собственные таймеры, буферы данных - которые обязательно нужно читать под кривым углом, регистры состояний - с чёткой последовательностью в алгоритме доступа. Это когда простой сбой на линии данных вызывает очевидный сбой в алгоритме работы датчика. И тогда уже он начинает куралесить в шину i2c.

С пассивными компонентами проблем нет. Там обработку ошибок можно существенно сократить. Но если датчик умеет работать в режиме мастера - вот тогда начинаются пляски. 

Какие именно датчики?  всё новое и связанное с авионикой.

Ссылка на комментарий
Поделиться на другие сайты

Думаю что эта информация не принесёт пользы.

MPU9255, TSC2007, BME280, MCP3421, и ещё с десяток подобной мелочи. Далеко не все чипы будут работать в девайсе, но они все распаяны на макетке.

 

Ссылка на комментарий
Поделиться на другие сайты

Да все там работает не надо придумывать. Ошибки у себя ищите. Абстрактно рассуждать не интересно. Если есть конкретный случай можно рассмотреть.

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Ну в целом вашу иронию я понимаю, хотя и не разделяю. 1. Вы правы частотники бывают разные, и у меня они разные. Но меня больше интересовал вопрос вообще такое подключение практикуется или нет, возможно это вообще полный бред, и такое не делается. А возможно есть более правильная  альтернатива, для решения задачи. На то и рассчитан вопрос, да и форум вроде по теме     2. Инструкции тоже не проблема, однако в них надо что-то понимать что бы был смысл вообще их читать. (Инструкции смотрели)    3. Человек был найден, и он утверждает что такое подключение не возможно! И что в целом  не бывает потенциометров с дисплеем, который можно было бы подключить к частотнику для внешнего управления. А у меня по этому поводу возникли сомнения, вот и решил уточнить у понимающего общества.      
    • Модель частотника до буквы. Например так, ну и что вам это даст.
    • подскажите пожалуйста какие напряжения допустимы?  Ведь 4.7в светиками и у автора тоже не вышло...?!
    • Пиздец вы тут все токсики) Свят-свят-свят.
    • Ещë раз говорю, схема не моя! Этой схеме уже лет 30 как минимум! Есть немного более сложная вариация этой схемы, усилитель "Омикрон". По сути практически тоже самое только с небольшими доработками. Что ту схему что я дал, что Омикрон, люди собирали очень много раз и более чем довольны. Не надо тут чушь молоть про симулятор, если бы я на 100% не знал бы что схема рабочая, никогда бы не дал!   Про ОУ я тоже ранее писал. 4558 конечно далеко не HiEnd ОУ, но дать до 0.01% КНИ и немного ниже он более чем способен. Тем более автор темы не собирается делать что-то сверхтоповое, ему нужен обычный, просто нормальный ушник. Если захочет улучшить, никто не мешает заменить ОУ на более хороший и получить параметры намного лучше, переделывать на плате для этого вообще ничего не нужно. 4558 я и сам уже не раз использовал, это вполне себе нормальный ОУ и с убогим LM358 вообще ни в какое сравнение и близко не идëт. 
    • Не будут, тут разнос между на и вч огромный, я же написал Широколосный, все пропустит от 20 Гц до 20 кГц, далее магнитола срежет на какой надо частоте. 60, 80 , 120 Гц. Но сейчас осенило, вроде магнитолы режут 2 порядком, может этого будет и мало Вам, нужно слушать. 
    • Нет, изначально планировал дальний в полнакала, развел плату, заказал в Китае 5шт (первый заказ, скидки и просто красиво). Установка планировалась в семейный "парк" авто. Конечно, если все будет работать правильно, то каким-то знакомым или знакомым знакомых можно и сделать.  Но, как оказалось, есть куча нюансов. Потом присмотрел ДХО с режимом поворотника такого плана:   Как уже ранее писал, для ледов девайс можно перевести в режим реле. Но поскольку обычно в подобных лампах все на пределе по току и по нагреву, и живут они соответственно не долго,  хотелось бы оставить возможность ШИМ. Вот и интересно как реагирует светодиод на ШИМ. Пока ясно, что нужно поднять частоту. Может еще электролит по выходу добавить или нет особого смысла?  
  • Похожий контент

×
×
  • Создать...