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

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
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 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
Подкорректировал код
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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 пользователей онлайн

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