|
|
  |
STM32F050 I2C, не работает |
|
|
|
Jun 19 2014, 04:34
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(glags @ Jun 18 2014, 13:58)  ...Лучше бы помогли ценным советом чем базар разводить... Ну прям сердце разрывается... Итак: 1. ST-шный I2C работает. Проверено на разных STM32 и STM8. 2. ST-шный I2C производит впечатление недоделанного курсового. Причина ворчания (одна из) - удивительные упражнения с ACK-ом и STOP-ом в конце приема. 3. ST-шные примеры малополезны по причинам: а) используют весьма нелюбимую мной либу б) не облегчают понимание в) абсолютно не гарантируют отсутствие (или уменьшение) проблем при попытке их адаптации под свои нужды Теперь советы (естественно только ценные): 1. Детально разобраться с регистрами (по мануалу, на всякие AN-ы не заморачиваться), после чего сконфигурить порт по собственному разумению 2. Разрешить клоки на I2C (RCC->APB1ENR) и GPIO (RCC->APB2ENR). Не забыть про бит 0 в RCC->APB2ENR. 3. Начать изучать поведение пинов с команды I2C1->CR1 |= (1 << 8) (старт)
|
|
|
|
|
Jun 19 2014, 06:14
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Axel @ Jun 19 2014, 10:34)  Теперь советы (естественно только ценные): ... 4. Разобраться с тактированием периферии в чипе по мануалу (aka - регистрам). RCC? 5. Разобраться с конфигурированием пинов по мануалу. 6. Разобраться с контроллером прерываний по мануалу. После этого минимума в принципе более-менее уже можно приступать к реализации обмена по I2C.
|
|
|
|
|
Jun 19 2014, 07:19
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782

|
Цитата(smalcom @ Jun 19 2014, 02:27)  чо-чо!? только?
> Примеры из библиотеки работают? [attachment=85495:iic.png] А можно ссылочку на эту библиотеку.  Отвечаю сразу для Axel и jcxz на Ваши советы.  1) С регистрами I2C более менее разобрался, но чтоб отсеять свои сомнения передачу организовал на SPL. 2) Всё сделано как надо, в первом посте всё описано. 3) Какое б не было поведение пинов на команду I2C1->CR1 |= (1 << 8) (старт), но оно должно быть. А там глухо. На 4,5 и 6 я уже собаку съел. Тут ошибок быть не может. Тем более об 6 пункте (прерывания) рано говорить, так как оно организовывается только по приёму. На передачу оно не надо. В данном случае хотелось чтоб при передаче хотябы ноги дрыгнулись. Может кто уже сам лично програмировал I2C на этом проце (STM32F050F4P6 корпус TSSOP20). Организовывал I2C на 105 и 407 процах проблем не было, а тут засада какая-то. Такое впечатление что он есть только в даташите на проц, а в реалии его нет.
Сообщение отредактировал glags - Jun 19 2014, 07:22
|
|
|
|
|
Jun 19 2014, 08:16
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Та ну, нету.... А в ДШ есть - вложение. А вот запросто может быть, что он просто получился кривым и глюкавым, что о нём поспешили забыть и заменить его на те же F031 или на F051 ..
Эскизы прикрепленных изображений
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Jun 19 2014, 08:31
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(hd44780 @ Jun 19 2014, 12:16)  А вот запросто может быть, что он просто получился кривым и глюкавым, что о нём поспешили забыть и заменить его на те же F031 или на F051 .. Проц, как проц. Просто, сейчас его называют по-другому. Новость уже обсуждали тут (http://www.compel.ru/2014/05/29/pereimenovanie-mikrokontrollerov-stm32f0-i-stm32f3/). Обычно кривость наблюдается у программиста, "особенности" чипа описаны в специальном документе. Сомнительно, что такой явный и повторяемый баг туда не попал.
|
|
|
|
|
Jun 19 2014, 08:31
|
Местный
  
Группа: Свой
Сообщений: 480
Регистрация: 21-11-04
Пользователь №: 1 188

|
Цитата(glags @ Jun 19 2014, 10:19)  1) С регистрами I2C более менее разобрался, но чтоб отсеять свои сомнения передачу организовал на SPL. Сомнительный путь для отсева сомнений (ИМХО)... А регистры в отладчике просматривали?
|
|
|
|
|
Jun 19 2014, 10:55
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782

|
Цитата(Golikov A. @ Jun 19 2014, 12:09)  а че такое SPL, простите?
да я бы проверил все флаги, наверняка там для прерываний куча флагов ставиться во время работы i2C, хоть поглядеть они стараются? А может еще ноги снаружи пошевелить, вдруг вы не мастером сделали? Да вы правы, уже добавил I2C1->CR1|=I2C_CR1_SMBHEN | I2C_CR1_PE; //включить I2C Огромное спасибо, минут через 30 проверю. Кстати заметил одну особенность у этого проца. У меня на нём настроен SPI и к нему подключен єкран. от нокии 3310. Я отключил I2C и на его место включил USART. Запустил и случилось чудо - SPI загнулся, а USART работает. Принимает и передаёт данные, подключил к компу через переходник usb-usart. Написал програмулину которая принимает от порта данные и обратно выдаёт то что приняло. В терменале всё чётко, для надёжности проверки обратно в терминал выдавал то что принял +1. Так вот к чему я веду. Может этот проц может работать только с одним аппаратным интерфейсом? Но в эррате и даташите я ничего про это не нашёл. Шас попробую SPI отключить и проверить. Изменил инициализацию добавив CR1|=I2C_CR1_SMBHEN; Код RCC->APB1ENR = RCC_APB1ENR_PWREN | RCC_APB1ENR_I2C1EN; RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN; RCC->AHBENR = RCC_AHBENR_GPIOAEN;
GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1; GPIOA->AFR[1] |= 0x00000440;//I2C - 4 GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10;
I2C1->CR1|=I2C_CR1_PE; //включить I2C I2C1->CR1&=~I2C_CR1_PE; //выключить I2C while(I2C1->CR1&I2C_CR1_PE); //ждём пока выключится I2C //I2C1->TIMINGR|=(PRESC << 28)|(SCLL<<0)|(SCLH<<8)|(SCLDEL<<20)|(SDADEL<<16); //PRESC=11, SCLL=199, SCLH=195, SCLDEL=4, SDADEL=2 это для 10кГц //PRESC=11, SCLL=19, SCLH=15, SCLDEL=4, SDADEL=2 это для 100кГц //PRESC=5, SCLL=9, SCLH=3, SCLDEL=3, SDADEL=3 это для 400кГц //PRESC=5, SCLL=3, SCLH=1, SCLDEL=1, SDADEL=0 это для 1000кГц I2C1->TIMINGR|=(11 << 28)|(199<<0)|(195<<8)|(4<<20)|(2<<16); //конфигурируем тайминги I2C1->CR1|=I2C_CR1_SMBHEN | I2C_CR1_PE; //включить I2C I2C1->CR2 = I2C_CR2_AUTOEND | (1<<16) | I2C_CR2_RD_WRN | (0x90<<1); И случилось не вероятное передача заработала, но приём пока нет. Огромаднейшее СПАСИБО Golikov A.. Теперь щас повоюю с приёмом, может с адресом слейва намутил.
|
|
|
|
|
Jun 19 2014, 11:34
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(glags @ Jun 19 2014, 10:19)  На 4,5 и 6 я уже собаку съел. Тут ошибок быть не может. Ну-ну. И после этого вы пишете Цитата(glags @ Jun 19 2014, 13:55)  Код GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1; ... GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10; Рекомендую съесть еще одну собаку. В этом коде поведение может быть каким угодно и очень часто совсем не таким, какого вы ожидали. Не удивительно, что у вас Цитата(glags @ Jun 19 2014, 13:55)  Запустил и случилось чудо - SPI загнулся, а USART работает
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 19 2014, 11:49
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782

|
Цитата(Сергей Борщ @ Jun 19 2014, 14:34)  Ну-ну. И после этого вы пишете
Рекомендую съесть еще одну собаку. В этом коде поведение может быть каким угодно и очень часто совсем не таким, какого вы ожидали. Не удивительно, что у вас Вы имеете "логическое ИЛИ" ?. Так я это делаю чтоб SWD порт не потерять. В отладчике на регистры смотрел, то там всё ОК.
|
|
|
|
|
Jun 19 2014, 12:56
|
Участник

Группа: Участник
Сообщений: 58
Регистрация: 9-05-13
Из: Львов, Украина
Пользователь №: 76 782

|
Цитата(Axel @ Jun 19 2014, 15:20)  Так вроде I2C_CR1_SMBHEN (3-й бит в CR1) здесь не при делах (если Вы действительно говорите про I2C, а не про SMBUS). Рекомендация по поводу собаки видится по-прежнему актуальной... Bit 21 SMBDEN: SMBus Device Default address enable 0: Device default address disabled. Address 0b1100001x is NACKed. 1: Device default address enabled. Address 0b1100001x is ACKed. Вы какой мануал смотрите
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|