hd44780 0 17 июня, 2014 Опубликовано 17 июня, 2014 · Жалоба Привет всем. Пытаемся завести на данном проце термодатчик LM75. Собственно до датчика дело не доходит. Не работает сам I2C. Инициализация: RCC->APB1ENR = RCC_APB1ENR_PWREN | RCC_APB1ENR_TIM2EN | RCC_APB1ENR_I2C1EN; GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1; //MODER 32 разрядный // 00 - по умолчанию вход, 01(GPIO_MODER_MODER0_0) - выход, 10(GPIO_MODER_MODER0_1) - альтернативная функция // 11(GPIO_MODER_MODER0) - аналоговый режим GPIOA->AFR[1] |= 0x00000440;//здесь i2c GPIOA->OTYPER |= GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10; //OTYPER 16 разрядный если 1(GPIO_OTYPER_OT_0) - открытый коллектор, а если 0 - обычный выход(по умолчанию) GPIOA->PUPDR = GPIO_PUPDR_PUPDR9_0 | GPIO_PUPDR_PUPDR10_0; //OPUPDR 32 разрядный // 00 - без подтяжки(по умолчанию), 01(GPIO_PUPDR_PUPDR0_0) - подтяжка к "+", 10(GPIO_PUPDR_PUPDR0_1) - подтяжка к "-" 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_PE; //включить I2C I2C1->CR2 = I2C_CR2_AUTOEND | (1<<16) | I2C_CR2_RD_WRN | (0x90<<1); Чтение температуры: // LM75 address = 0x90 #define LM75_Addr 0x90 // Temperature Register of LM75 #define LM75_TEMP_Reg 0x00 uint16_t I2C_LM75_Temp_Read ( uint8_t addr ) { uint16_t RegValue = 0; // 1. Послать в LM75 адрес регистра - 0x00 // Конфигурирование адреса ведомого; количество байтов, которые будут запрограммированы (переданы); перезагрузки и генерировать старт I2C_TransferHandling ( I2C1, addr, 1, I2C_Reload_Mode, I2C_Generate_Start_Write ); // Подождите, пока ISR.TXIS флаг не будет установлен // TXIS==1 - TXDR empty while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_TXIS ) == RESET ); // Отправить адрес (LM75_TEMP_Reg) I2C_SendData ( I2C1, LM75_TEMP_Reg ); // Подождите, пока ISR.TCR флаг не будет установлен // TCR == 1 - Заданное кол-во байт передано while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_TCR ) == RESET ); // 2. Читать ответ LM75 // Конфигурирование адреса ведомого; количество байтов, которые будут считаны; перезагрузки и генерировать старт I2C_TransferHandling ( I2C1, addr, 2, I2C_Reload_Mode, I2C_Generate_Start_Read ); // ждать приёма байта // ISR.RXNE == 1 - byte received while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_RXNE ) == RESET ); RegValue = I2C_ReceiveData ( I2C1 ); RegValue <<= 8; // ждать приёма байта // ISR.RXNE == 1 - byte received while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_RXNE ) == RESET ); RegValue |= I2C_ReceiveData ( I2C1 ); // Сгенерировать STOP I2C_TransferHandling ( I2C1, addr, 0, I2C_Reload_Mode, I2C_Generate_Stop ); // Подождите, пока ISR.STOPF флаг не будет установлен // STOPF == 1 - а шине действует STOP while ( I2C_GetFlagStatus ( I2C1, I2C_ISR_STOPF ) == RESET); // Очистить флаг STOPF // ICR.STOPF := 1 1 - очистка флага ISR.STOPF I2C_ClearFlag ( I2C1, I2C_ICR_STOPCF ); return RegValue; } Результат - I2C труп полный, на осцилле обе ноги единицы (pull-up-ы 10кил). Ничего не шевелится :) . Кто-то с I2C на том проце работал? Он там вообще рабочий? Или я где-то ошибся? В ДШ на ногах I2C PA9, PA10 есть странный коммент: "This alternate feature is available on standard dies only." Стандарт умер, да здравствует стандарт :laugh: Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 17 июня, 2014 Опубликовано 17 июня, 2014 · Жалоба Примеры из библиотеки работают? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 17 июня, 2014 Опубликовано 17 июня, 2014 · Жалоба Я возможно не прав (поправьте меня), но вроде принято взводить RCC_APB2ENR_SYSCFGEN перед настройкой альтернативных функций. PS: STM32F050 имеет статус NRND. Вы часом не новое разрабатываете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glags 0 17 июня, 2014 Опубликовано 17 июня, 2014 · Жалоба Примеры из библиотеки работают? Там в самом верху написали что не работает сам интерфейс I2C. До библиотек дело не доходит. На портах ни одного импульса. Тут только 2 варианта. 1- есть какието особые нюансы в активации I2C интерфейса и 2-он в этой микрухе не работает. :) Я возможно не прав (поправьте меня), но вроде принято взводить RCC_APB2ENR_SYSCFGEN перед настройкой альтернативных функций. PS: STM32F050 имеет статус NRND. Вы часом не новое разрабатываете? RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN; сделано. Просто упустили кидая кусок кода на форум :) Это одиночное изделие и посему этот проц (так как уже куплен) вполне подходит. От него кроме SPI для дисплея (кстати работает), внутреннего календаря и I2C для датчика температуры больше ничего не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andron86 0 17 июня, 2014 Опубликовано 17 июня, 2014 · Жалоба Вам уже писали, запустите тупо пример от stm и посмотрите работает или нет, без своих добавок. У меня опыт был, что из за работающего таймера (pwm) и правда i2c не работал, нужно было коротко отключить pwm, включить i2c enable, и всё заработало. такие траблы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 18 июня, 2014 Опубликовано 18 июня, 2014 · Жалоба Из примеров I2C на сайте ST нашёл только это - http://www.st.com/web/en/catalog/tools/PF257886# Там есть файл mems_eval_i2c.c - драйвер под какой-то MEMS на I2C. Правда, оно для F0Discovery, там проц не совсем такой - F051 :( Сегодня проверим :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alien85 0 18 июня, 2014 Опубликовано 18 июня, 2014 (изменено) · Жалоба Что за стиль программирования такой? Интерфейс настраивается регистрами, а управляется библиотечными функциями. Какой в этом тайный смысл? И ещё: учитесь пользоваться прерываниями. Изменено 18 июня, 2014 пользователем Alien85 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 18 июня, 2014 Опубликовано 18 июня, 2014 · Жалоба Какой в этом тайный смысл? Разные люди писали :) Да и отладка ... Закончим отлаживать - подчистим :) И ещё: учитесь пользоваться DMA. А зачем тут DMA, если не секрет? Для записи в датчик одного байта и чтения 2 байтов его ответа? Тут дай Бог, чтобы оно вообще заработало .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alien85 0 18 июня, 2014 Опубликовано 18 июня, 2014 · Жалоба Разные люди писали :) :krapula: А зачем тут DMA, если не секрет? Для записи в датчик одного байта и чтения 2 байтов его ответа? Тут дай Бог, чтобы оно вообще заработало .... Упс... С dma ошибся, имел в виду прерывания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 18 июня, 2014 Опубликовано 18 июня, 2014 · Жалоба Разные люди писали :) Неужто для поднятия одного I2C нужно несколько человек??? Или это из истории: -За день I2C запустишь? -Да, ноу проблем. -А за два? -Один не справлюсь - помощник нужен... :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 18 июня, 2014 Опубликовано 18 июня, 2014 · Жалоба Как поётся в одной советской песне - "Вдвоём вдвойне веселей" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 18 июня, 2014 Опубликовано 18 июня, 2014 · Жалоба У граждан ДНР ещё хватает времени заниматься I2C? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
glags 0 18 июня, 2014 Опубликовано 18 июня, 2014 · Жалоба Смотрю тут вместо помощи одна критика. То это ни так, то сё. Лучше бы помогли ценным советом чем базар разводить. Такое впечатление что тут не помагают, а просто набирают количество сообщений. До прерываний тут ещё далеко, зашевелился бы хотябы сам интерфейс. После команды I2C_SendData ( I2C1, LM75_TEMP_Reg ); должно на ногах хоть что-то зашевелиться, а там глухо одни еденицы. По сему подозрение на неправильный конфиг I2C. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 18 июня, 2014 Опубликовано 18 июня, 2014 · Жалоба У граждан ДНР ещё хватает времени заниматься I2C? Да вот сижу, в окопе, пока доблестной укр армии а-ля Правый сектор не видать, дай думаю, I2C раздолбаю что-ли... Сорри за оффтоп . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 18 июня, 2014 Опубликовано 18 июня, 2014 · Жалоба Из примеров I2C на сайте ST нашёл только это чо-чо!? только? > Примеры из библиотеки работают? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться