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

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-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 пользователей онлайн

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