|
При запуске из отладчика программа работает, когда отключаешь и снова включаешь STM32 программа перестает работать |
|
|
|
 |
Ответов
|
Apr 6 2018, 06:09
|
Гуру
     
Группа: Свой
Сообщений: 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 переставал функционировать и никак его из этого ступора было не вытащить). Долго возился, но в итоге переделал все на ногодрыг.
|
|
|
|
|
Apr 6 2018, 07:59
|
Гуру
     
Группа: Свой
Сообщений: 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. Так что у автора явно не МК виноват, а кривые руки.  Код #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
|
|
|
|
|
Apr 6 2018, 09:05
|
Гуру
     
Группа: Свой
Сообщений: 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. Так что у автора явно не МК виноват, а кривые руки.  Никто с этим не спорит. Когда все хорошо (нет помех), то и сценарий работы сложно сделать плохим, но ведь бывают нештатные ситуации... в этом случае корректнее говорить о таланте разруливания, а не о кривизне рук, т.к. работают скорее не руки, а голова. Приведенный кусок - это ситуация когда сразу за STOP от предыдущей посылки формируется START для следующей.
|
|
|
|
|
Apr 6 2018, 10:28
|
Гуру
     
Группа: Свой
Сообщений: 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 и без ногодрыга.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|