Ваша реклама могла б бути тут!
1 млн переглядів на місяць!
Google Page Rank: 5

I2C в STM32. Глюк или особенность работы?

🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
Статус: Offline
Реєстрація: 05.12.2007
Повідом.: 5889
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #1
I2C в STM32. Глюк или особенность работы?

Запускаю мелкую серию железок на STM32F103VCT6. В числе прочего используется I2C1 модуль. Так вот из 6 плат 5 нормально взлетели а шестая в упор отказывалась работать со слейвами на I2C.
Полез анализатором, увидел что линии SCL SDA в какой-то момент проваливаются в 0, обе одновременно и на примерно одинаковое время. Ну, думаю хрен с ним, бывает, наверное инициализация.
Стал разбираться под дебагом и увидел что проц выставляет флаг BUSY в регистре SR2. Схуяли, подумалось мне, но тут вспомнил про те провалы увиденные анализатором. ОК, наступил щупами мультиметра и увидел что по непонятной причине, в момент инициализации портов лапы выставляются в 0. Почему?! Я настраиваю как Alternate function Open Drain, почему мать его, они висят в нуле сколь угодно долго, пока не подашь тактовый сигнал на модуль I2C? Самое веселое что 5 процов эти провалы игнорят, а один реагирует на это установкой BUSY.


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
gpio.GPIO_Mode = GPIO_Mode_AF_OD;
gpio.GPIO_Speed = GPIO_Speed_2MHz; //Тут порты в единице
GPIO_Init(GPIOB, &gpio); //Тут порты проседают в ноль
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //Тут они опять в единице.

//Тут будет костыль

I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C_InitStruct.I2C_ClockSpeed = I2C_SPEED;
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStruct.I2C_OwnAddress1 = OWN_ADDR;
I2C_Init(I2C1, &I2C_InitStruct);
I2C_AcknowledgeConfig(I2C1, ENABLE);

Логического объяснения этому не нашел, просто добавил это(костыль) и все заработало

delay_us(5);
I2C_SoftwareResetCmd(I2C1, 1 );
delay_us(5);
I2C_SoftwareResetCmd(I2C1, 0 );

Кто нибудь сталкивался с такой херней?
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #2
Запускаю мелкую серию железок на STM32F103VCT6. В числе прочего используется I2C1 модуль. Так вот из 6 плат 5 нормально взлетели а шестая в упор отказывалась работать со слейвами на I2C.
Полез анализатором, увидел что линии SCL SDA в какой-то момент проваливаются в 0, обе одновременно и на примерно одинаковое время. Ну, думаю хрен с ним, бывает, наверное инициализация.
Стал разбираться под дебагом и увидел что проц выставляет флаг BUSY в регистре SR2. Схуяли, подумалось мне, но тут вспомнил про те провалы увиденные анализатором. ОК, наступил щупами мультиметра и увидел что по непонятной причине, в момент инициализации портов лапы выставляются в 0. Почему?! Я настраиваю как Alternate function Open Drain, почему мать его, они висят в нуле сколь угодно долго, пока не подашь тактовый сигнал на модуль I2C? Самое веселое что 5 процов эти провалы игнорят, а один реагирует на это установкой BUSY.


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
gpio.GPIO_Mode = GPIO_Mode_AF_OD;
gpio.GPIO_Speed = GPIO_Speed_2MHz; //Тут порты в единице
GPIO_Init(GPIOB, &gpio); //Тут порты проседают в ноль
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //Тут они опять в единице.

//Тут будет костыль

I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C_InitStruct.I2C_ClockSpeed = I2C_SPEED;
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStruct.I2C_OwnAddress1 = OWN_ADDR;
I2C_Init(I2C1, &I2C_InitStruct);
I2C_AcknowledgeConfig(I2C1, ENABLE);

Логического объяснения этому не нашел, просто добавил это(костыль) и все заработало

delay_us(5);
I2C_SoftwareResetCmd(I2C1, 1 );
delay_us(5);
I2C_SoftwareResetCmd(I2C1, 0 );

Кто нибудь сталкивался с такой херней?
Расхожий глюк
Тільки зареєстровані користувачі бачать весь контент у цьому розділі


Попробуй тут посмотреть. Ты не один(С)
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #3
А чому порти в одиниці? Вони ж входи. І чому б не увімкнути тактування I2C1 заздалегідь?
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #4
А чому порти в одиниці? Вони ж входи. І чому б не увімкнути тактування I2C1 заздалегідь?

Порты должны быть в режиме пулл-ап. Часто их выставляют в единицу, даже если они - входы. Я так делаю, например. А STM пофиг, а в атмелках это подключает пулап-резистор на вход.

Или ты про что?
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #5
Я про це і кажу. Після reset, порт стає плаваючим входом, без будь-яких підтяжок. Його стан залежить від того, що подано на вхід (третій стан або до якого рівня підтяжка). У програмі порти роблять open-drain виходами, якими, до включення I2C1, ніхто не керує. Вірніше, керує, але маємо те, що маємо.
If software configures a GPIO pin as Alternate Function Output, but peripheral is not
activated, its output is not specified.
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #6
Чуваки, вы как будто не читаете что написано. Я ж говорю, порты сконфижены как Open Drain, подтяжка к питанию есть. Но пока не даешь тактовый сигнал на модуль I2C они в жестком нуле. Ну то есть совсем в жестком. Ноль целых хуй десятых вольт на лапе при 47кОм к +3,3 Вольта.
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #7
Но пока не даешь тактовый сигнал на модуль I2C они в жестком нуле. Ну то есть совсем в жестком.
ну так дай тактовый на сабж перед инитом портов
я так делаю всегда
сразу после сброса - подача на порты и AFIO, но порты не инитятся
потом, по необходимости - включаем тактирование периферии потом порты

если это все в рамках newlib или в кейл
то одна функция в preinit_array высшего приоритета
остальные в init_array
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #8
Чуваки, вы как будто не читаете что написано.
Хто б говорив. Як я вже писав, якщо порти сконфігуровано як альтернативні open-drain виходи, то вони керуються сигналами, що надходять із модуля I²C. Які претензії до вимкненого модуля?
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #9
Хто б говорив. Як я вже писав, якщо порти сконфігуровано як альтернативні open-drain виходи, то вони керуються сигналами, що надходять із модуля I²C. Які претензії до вимкненого модуля?

Да, согласен. Вопрос в другом, почему модуль I2C ведет себя по разному при одном и том же коде?
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #10
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #11
почему модуль I2C ведет себя по разному при одном и том же коде?
Відповідь на це питання можна знайти на сторінці 28 документа "
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
":
 
  • 🟡 09:22 Відбій тривоги в Харківська область.Зверніть увагу, тривога ще триває у:- Куп’янський район- Харківський район- Липецька територіальна громада- Вовчанська територіальна громада#Харківська_область
  • #12
Назад
Зверху Знизу