Axel 1 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба ...Лучше бы помогли ценным советом чем базар разводить... Ну прям сердце разрывается... Итак: 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) (старт) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба Теперь советы (естественно только ценные):... 4. Разобраться с тактированием периферии в чипе по мануалу (aka - регистрам). RCC? 5. Разобраться с конфигурированием пинов по мануалу. 6. Разобраться с контроллером прерываний по мануалу. После этого минимума в принципе более-менее уже можно приступать к реализации обмена по I2C. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glags 0 19 июня, 2014 Опубликовано 19 июня, 2014 (изменено) · Жалоба чо-чо!? только? > Примеры из библиотеки работают? А можно ссылочку на эту библиотеку. :) Отвечаю сразу для Axel и jcxz на Ваши советы. :) 1) С регистрами I2C более менее разобрался, но чтоб отсеять свои сомнения передачу организовал на SPL. 2) Всё сделано как надо, в первом посте всё описано. 3) Какое б не было поведение пинов на команду I2C1->CR1 |= (1 << 8) (старт), но оно должно быть. А там глухо. На 4,5 и 6 я уже собаку съел. Тут ошибок быть не может. Тем более об 6 пункте (прерывания) рано говорить, так как оно организовывается только по приёму. На передачу оно не надо. В данном случае хотелось чтоб при передаче хотябы ноги дрыгнулись. Может кто уже сам лично програмировал I2C на этом проце (STM32F050F4P6 корпус TSSOP20). Организовывал I2C на 105 и 407 процах проблем не было, а тут засада какая-то. Такое впечатление что он есть только в даташите на проц, а в реалии его нет. Изменено 19 июня, 2014 пользователем glags Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба Нет такого процессора у ST - STM32F050F4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба Та ну, нету.... А в ДШ есть - вложение. А вот запросто может быть, что он просто получился кривым и глюкавым, что о нём поспешили забыть и заменить его на те же F031 или на F051 .. stm32f050.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба А вот запросто может быть, что он просто получился кривым и глюкавым, что о нём поспешили забыть и заменить его на те же F031 или на F051 .. Проц, как проц. Просто, сейчас его называют по-другому. Новость уже обсуждали тут (http://www.compel.ru/2014/05/29/pereimenovanie-mikrokontrollerov-stm32f0-i-stm32f3/). Обычно кривость наблюдается у программиста, "особенности" чипа описаны в специальном документе. Сомнительно, что такой явный и повторяемый баг туда не попал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба 1) С регистрами I2C более менее разобрался, но чтоб отсеять свои сомнения передачу организовал на SPL. Сомнительный путь для отсева сомнений (ИМХО)... А регистры в отладчике просматривали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба а че такое SPL, простите? да я бы проверил все флаги, наверняка там для прерываний куча флагов ставиться во время работы i2C, хоть поглядеть они стараются? А может еще ноги снаружи пошевелить, вдруг вы не мастером сделали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба а че такое SPL, простите? Вас в гугле забанили, простите? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба не допер дописать STM32 SPL, а по SPL такое выдает.... я догадывался что это библиотека, просто хотел быть уверен) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glags 0 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба а че такое 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.. Теперь щас повоюю с приёмом, может с адресом слейва намутил. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба На 4,5 и 6 я уже собаку съел. Тут ошибок быть не может.Ну-ну. И после этого вы пишете GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1; ... GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10; Рекомендую съесть еще одну собаку. В этом коде поведение может быть каким угодно и очень часто совсем не таким, какого вы ожидали. Не удивительно, что у вас Запустил и случилось чудо - SPI загнулся, а USART работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glags 0 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба Ну-ну. И после этого вы пишете Рекомендую съесть еще одну собаку. В этом коде поведение может быть каким угодно и очень часто совсем не таким, какого вы ожидали. Не удивительно, что у вас Вы имеете "логическое ИЛИ" ?. Так я это делаю чтоб SWD порт не потерять. В отладчике на регистры смотрел, то там всё ОК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Axel 1 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба Так вроде I2C_CR1_SMBHEN (3-й бит в CR1) здесь не при делах (если Вы действительно говорите про I2C, а не про SMBUS). Рекомендация по поводу собаки видится по-прежнему актуальной... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glags 0 19 июня, 2014 Опубликовано 19 июня, 2014 · Жалоба Так вроде 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. Вы какой мануал смотрите :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться