реклама на сайте
подробности

 
 
> При запуске из отладчика программа работает, когда отключаешь и снова включаешь STM32 программа перестает работать
Alex_Golubev
сообщение Apr 5 2018, 03:41
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 18-03-17
Пользователь №: 95 877



Привет.
Контроллер STM32f429zi.
Столкнулся с такой проблемой, запускаешь программу из отладчика все работает (в частности USB), когда передергиваешь питание микроконтроллера программа начинает выполнится некорректно (отваливается USB).
Если запустить контроллер из отладчика IAR и сразу выключить отладчик (шнурок программатора-отладчика выдергиваю) не трогая питание STM32, то все нормально программа выполняется корректно.
Но если передернуть питание то опять все отвалилось.

Как можно найти причину этого?

Сообщение отредактировал Alex_Golubev - Apr 5 2018, 03:42
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alex_Golubev
сообщение Apr 6 2018, 04:48
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 280
Регистрация: 18-03-17
Пользователь №: 95 877



Путем отключения и включения разных инициализации периферии, было установлено что проблемы возникают из-за I2C.
Но как влияет в моем случаи I2C мне не ясно.
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 6 2018, 06:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Alex_Golubev @ Apr 6 2018, 07:48) *
Но как влияет в моем случаи I2C мне не ясно.

Нашел в исходниках "чудесные" строчки (это обработчик прерывания I2C)
Код
        case    TIC_STATE_POS_STOP:
            I2C2->CR1 = I2C_CR1_PE | I2C_CR1_STOP;
            tic_state = TIC_STATE_FILL_START;
            break;

        case    TIC_STATE_FILL_START:
            s1 = 0;
            while(I2C2->SR1 !=0 ) s1++;
            I2C2->CR1 = I2C_CR1_PE | I2C_CR1_START;
            tic_state = TIC_STATE_FILL;
            break;

Без дикого while(I2C2->SR1 !=0 ) ничего не работало (вроде, I2C переставал функционировать и никак его из этого ступора было не вытащить).
Долго возился, но в итоге переделал все на ногодрыг.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 6 2018, 07:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(adnega @ Apr 6 2018, 09:09) *
Без дикого while(I2C2->SR1 !=0 ) ничего не работало (вроде, I2C переставал функционировать и никак его из этого ступора было не вытащить).
Долго возился, но в итоге переделал все на ногодрыг.

Странно, у меня прекрасно работает как раз на F429 аппаратный I2C (да ещё с DMA) с кучкой висящих на нём разных устройств (FRAM + RTC + FM-тюнер + touch-контроллер) на 400кГц.
По многу часов без каких-либо сбоев.
И никаких ногодрыгов и тем более - циклов в ISR.
Так что у автора явно не МК виноват, а кривые руки. laughing.gif
Код
#define TUNER_ADDR_NATIVE_SEQ 0x10 //RDA5807 mode, sequential register address
#define TUNER_ADDR_NATIVE_RND 0x11 //RDA5807 mode, random access mode.
#define TUNER_ADDR_COMPATIBLE 0x60 //TEA5767 compatible mode
#define FRAM_ADDR             0x53 //адрес FRAM-памяти FM31T37x
#define RTC_ADDR              0x6B //адрес RTC FM31T37x
#define TSC_ADDR              0x41 //адрес touchscreen controller STMPE811
Go to the top of the page
 
+Quote Post
adnega
сообщение Apr 6 2018, 09:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jcxz @ Apr 6 2018, 10:59) *
Странно, у меня прекрасно работает как раз на F429 аппаратный I2C (да ещё с DMA) с кучкой висящих на нём разных устройств (FRAM + RTC + FM-тюнер + touch-контроллер) на 400кГц.

Для этого проекта применялся STM32F103RET6.

Цитата(jcxz @ Apr 6 2018, 10:59) *
По многу часов без каких-либо сбоев.

Масштаб "часы" это очень мало. В проекте использовался дисплей TIC154(A) на I2C для постоянной индикации.
А сбои вы как-то разруливали? Бывает, slave выдает ACK на линию, а мастеру хочется START устроить, но у него ничего не получится.
Тут ногодрыгом нужно slave протолкнуть до 1 на SDA. Я умышленно создавал помехи в линии, чтобы система смогла их обработать.

Цитата(jcxz @ Apr 6 2018, 10:59) *
И никаких ногодрыгов и тем более - циклов в ISR.
Так что у автора явно не МК виноват, а кривые руки. laughing.gif

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

Приведенный кусок - это ситуация когда сразу за STOP от предыдущей посылки формируется START для следующей.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 6 2018, 10:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(adnega @ Apr 6 2018, 12:05) *
Для этого проекта применялся STM32F103RET6.

У автора как раз F429, а не F103. А у них как я слышал - I2C сильно отличаются.

Цитата(adnega @ Apr 6 2018, 12:05) *
А сбои вы как-то разруливали? Бывает, slave выдает ACK на линию, а мастеру хочется START устроить, но у него ничего не получится.
Тут ногодрыгом нужно slave протолкнуть до 1 на SDA. Я умышленно создавал помехи в линии, чтобы система смогла их обработать.

Не понял - что значит "slave выдает ACK на линию"? ACK слэйв выдаёт только для подтверждения приёма данных. Мастер в это время никак не может СТАРТ выдавать, он ACK или не-ACK должен ждать.
И не понимаю - зачем тут ногодрыг?

Цитата(adnega @ Apr 6 2018, 12:05) *
Никто с этим не спорит. Когда все хорошо (нет помех), то и сценарий работы сложно сделать плохим,
но ведь бывают нештатные ситуации... в этом случае корректнее говорить о таланте разруливания, а не о кривизне рук,

Помех по I2C у меня в том устройстве очень много. По питанию (и возможно по эфиру) от работающего рядом ESP8266. И я долго с ними боролся. Даже сюда писал. Но теперь всё работает стабильно.

Цитата(adnega @ Apr 6 2018, 12:05) *
Приведенный кусок - это ситуация когда сразу за STOP от предыдущей посылки формируется START для следующей.

CODE
enum {OPTION_DUPLEX_RS, OPTION_DUPLEX_SS, OPTION_2BYTE, OPTION_TIMER, OPTION_SA};
..
extern "C" void Isr()
{
u32 i0 = i2cU->SR[0], i1;
if (!i0) return;
switch (isrStep) {
case IS_RESTART: //передан повторный START
if (!(i0 &= ~(1 << SR0_BTF | 1 << SR0_TXE))) return;
case IS_START: //передан START
if (i0 != 1 << SR0_SB) fault(i0);
i0 = i2cU->SR[1];
if ((i0 & (1 << SR1_MSL | 1 << SR1_BUSY | 1 << SR1_TRA)) !=
(1 << SR1_MSL | 1 << SR1_BUSY)) fault(i0 | ERR_BAD_START << 16);
if (saddr & 1)
if (cnt + 1 < 0) i2cU->CR[0] = 1 << CR0_ENA | 1 << CR0_ACK;
i2cU->DR = saddr;
if (option & 1 << OPTION_TIMER) actTimer = HrTimerGet();
isrStep = IS_SADDR;
return;
case IS_SADDR: //передан Slave Address
...
case IS_CMD1: //передана вся стартовая последовательность
if (i0 == 1 << SR0_TXE) return;
if (i0 != (1 << SR0_BTF | 1 << SR0_TXE)) fault(i0);
if (option & (1 << OPTION_DUPLEX_SS | 1 << OPTION_DUPLEX_RS)) {
saddr++;
i2cU->CR[0] = (option >> OPTION_DUPLEX_SS & 1) << CR0_STOP |
1 << CR0_START | 1 << CR0_ENA;
isrStep = IS_RESTART;
return;
} else if (cnt) {
i1 = IS_TX;
...

Приведённый код - часть ISR-а драйвера I2C, работающего по флагам в регистрах I2C и машине состояний (isrStep).
Если для устройства нужна I2C-транзакция с рестартом или повторным стартом (дуплексная транзакция), то перед запуском транзакции I2C в option драйвер устанавливает соответствующий флаг или OPTION_DUPLEX_SS (для переключения вывод->ввод выполнить на шине СТОП-СТАРТ) или OPTION_DUPLEX_RS (для переключения вывод->ввод выполнить на шине ПОВТОРНЫЙ СТАРТ). Что именно нужно OPTION_DUPLEX_SS или OPTION_DUPLEX_RS - выясняется из даташита на слэйв.
Так что как видно - обхожусь без циклов в ISR и без ногодрыга. laughing.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Alex_Golubev   При запуске из отладчика программа работает, когда отключаешь и снова включаешь STM32 программа перестает работать   Apr 5 2018, 03:41
- - KRS   Цитата(Alex_Golubev @ Apr 5 2018, 06:41) ...   Apr 5 2018, 04:55
- - Forger   Цитата(Alex_Golubev @ Apr 5 2018, 06:41) ...   Apr 5 2018, 06:22
- - Alex_Golubev   ЦитатаКуда грузится программа: ОЗУ или FLASH? Не м...   Apr 5 2018, 06:48
|- - Forger   Создайте пустой новый проект в любимой среде, кото...   Apr 5 2018, 07:08
|- - SSerge   Цитата(Alex_Golubev @ Apr 5 2018, 13:48) ...   Apr 5 2018, 08:20
- - Alex_Golubev   Есть еще один интересный момент, который меня вгон...   Apr 5 2018, 08:40
|- - Forger   Цитата(Alex_Golubev @ Apr 5 2018, 11:40) ...   Apr 5 2018, 08:50
|- - Baser   Цитата(Alex_Golubev @ Apr 5 2018, 11:40) ...   Apr 5 2018, 09:36
||- - adnega   Цитата(Baser @ Apr 5 2018, 12:36) Вариант...   Apr 5 2018, 14:48
||- - k155la3   Цитата(adnega @ Apr 5 2018, 17:48) Или ка...   Apr 6 2018, 08:42
|- - KnightIgor   Цитата(Alex_Golubev @ Apr 5 2018, 09:40) ...   Apr 5 2018, 12:36
|- - Aleksandr Baranov   Скорость нарастания питающего напряжения у работаю...   Apr 5 2018, 13:06
- - Alex11   Еще вариант, который у себя наблюдал - медленно за...   Apr 5 2018, 10:38
|- - Forger   Цитата(Alex11 @ Apr 5 2018, 13:38) Еще ва...   Apr 5 2018, 10:46
- - Alex_Golubev   Цитатапо условию готовности генератора у меня так ...   Apr 5 2018, 11:05
|- - Forger   Цитата(Alex_Golubev @ Apr 5 2018, 14:05) ...   Apr 5 2018, 11:12
- - ViKo   Если USB из Куба, то мне приходилось размер кучи у...   Apr 5 2018, 11:22
|- - Forger   Цитата(Alex_Golubev @ Apr 6 2018, 07:48) ...   Apr 6 2018, 06:00
|- - adnega   Цитата(jcxz @ Apr 6 2018, 13:28) Не понял...   Apr 6 2018, 12:09
|- - jcxz   Цитата(adnega @ Apr 6 2018, 15:09) Мастер...   Apr 6 2018, 12:34
|- - Arlleex   Я тоже ничего не понял про ACK во время START... В...   Apr 7 2018, 08:04
|- - jcxz   Цитата(Arlleex @ Apr 7 2018, 11:04) При о...   Apr 7 2018, 14:31
|- - Arlleex   Цитата(jcxz @ Apr 7 2018, 18:31) Ничего н...   Apr 7 2018, 14:53
|- - jcxz   Цитата(Arlleex @ Apr 7 2018, 17:53) Если ...   Apr 7 2018, 18:33
|- - adnega   Цитата(jcxz @ Apr 7 2018, 21:33) А зачем ...   Apr 7 2018, 19:03
|- - jcxz   Цитата(adnega @ Apr 7 2018, 22:03) Ага. В...   Apr 7 2018, 19:23
|- - adnega   Цитата(jcxz @ Apr 7 2018, 22:23) Как же и...   Apr 7 2018, 20:51
|- - jcxz   Цитата(adnega @ Apr 7 2018, 23:51) Я бы н...   Apr 8 2018, 09:04
|- - adnega   Цитата(jcxz @ Apr 8 2018, 12:04) Как имен...   Apr 8 2018, 10:28
|- - jcxz   Цитата(adnega @ Apr 8 2018, 13:28) Если s...   Apr 8 2018, 10:51
|- - adnega   Цитата(jcxz @ Apr 8 2018, 13:51) Если при...   Apr 8 2018, 11:27
|- - jcxz   Цитата(adnega @ Apr 8 2018, 14:27) И что ...   Apr 8 2018, 12:47
|- - adnega   Цитата(jcxz @ Apr 8 2018, 15:47) писал чт...   Apr 8 2018, 14:19
|- - jcxz   Цитата(adnega @ Apr 8 2018, 17:19) Дык, в...   Apr 9 2018, 12:09
- - rudy_b   I2C в STM - полное барахло и недоделка, ваш код то...   Apr 7 2018, 09:58
- - Alex_Golubev   USB cdc. До меня не доходит из-за чего вылазит ош...   Apr 8 2018, 07:21
- - Alex_Golubev   Ребята я очень рад что вы так активно обсуждаете I...   Apr 9 2018, 00:55
|- - adnega   Цитата(Alex_Golubev @ Apr 9 2018, 03:55) ...   Apr 9 2018, 04:31
|- - Baser   Цитата(Alex_Golubev @ Apr 9 2018, 03:55) ...   Apr 9 2018, 09:12
- - rudy_b   Я уже писал, что на 207 автомат влипает в глючные ...   Apr 9 2018, 10:26
- - pitt   По поводу I2C. До 2010 года активно использовал AV...   Apr 9 2018, 12:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 12:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01497 секунд с 7
ELECTRONIX ©2004-2016