Jump to content

I2C в STM32F030


User_1
 Share

Recommended Posts

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

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

Edited by User_1
Link to comment
Share on other sites

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

Надо выбрать какая альтернативная функция используется

  GPIO_PinAFConfig( GPIOA, GPIO_PinSource9, GPIO_AF_4 );
  GPIO_PinAFConfig( GPIOA, GPIO_PinSource10, GPIO_AF_4 );

 

Link to comment
Share on other sites

Реле, разъемы, вентиляторы, корпуса, микросхемы, конденсаторы и много другое!

Скидки до 20% на сайте электронного дискаунтера ТМ Электроникс.

Бесплатная доставка в любую точку России + кэшбэк 15%.

Подробнее

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

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

Надо выбрать какая альтернативная функция используется

Тоже пробовал, не помогло

Link to comment
Share on other sites

Материалы вебинара «Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока»

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

Комплексные решения с литиевыми батареями EVE для интеллектуальных систем безопасности

Литиевые химические источники тока EVE по своим характеристикам являются идеальным выбором для современных интеллектуальных систем безопасности. EVE разрабатывает литиевые батареи, опираясь на многолетние исследования таких областей применения, как беспроводная связь стандартов Bluetooth, LoRa, Wi-Fi, NB-IoT и ZigBee. Рассмотрим решения для систем безопасности с использованием батарей EVE. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 сказал:

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

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

Edited by User_1
Подкорректировал код
Link to comment
Share on other sites

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

Улыбнуло...

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

  • 1 month later...

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

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

Edited by Oxford
Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

 

Link to comment
Share on other sites

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

Edited by Oxford
Link to comment
Share on other sites

  • 1 month later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...