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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> STM32F050 I2C, не работает
hd44780
сообщение Jun 17 2014, 18:14
Сообщение #1


Профессионал
*****

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



Привет всем.

Пытаемся завести на данном проце термодатчик LM75.
Собственно до датчика дело не доходит. Не работает сам I2C.

Инициализация:

CODE

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);


Чтение температуры:

CODE

// 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кил). Ничего не шевелится sm.gif .
Кто-то с I2C на том проце работал? Он там вообще рабочий? Или я где-то ошибся?

В ДШ на ногах I2C PA9, PA10 есть странный коммент: "This alternate feature is available on standard dies only." Стандарт умер, да здравствует стандарт laugh.gif
Спасибо.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jun 17 2014, 19:57
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Примеры из библиотеки работают?
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 17 2014, 20:09
Сообщение #3


Гуру
******

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



Я возможно не прав (поправьте меня), но вроде принято взводить RCC_APB2ENR_SYSCFGEN перед настройкой альтернативных функций.

PS: STM32F050 имеет статус NRND. Вы часом не новое разрабатываете?
Go to the top of the page
 
+Quote Post
glags
сообщение Jun 17 2014, 21:08
Сообщение #4


Участник
*

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



Цитата(smalcom @ Jun 17 2014, 22:57) *
Примеры из библиотеки работают?

Там в самом верху написали что не работает сам интерфейс I2C. До библиотек дело не доходит. На портах ни одного импульса. Тут только 2 варианта. 1- есть какието особые нюансы в активации I2C интерфейса и 2-он в этой микрухе не работает. sm.gif

Цитата(adnega @ Jun 17 2014, 23:09) *
Я возможно не прав (поправьте меня), но вроде принято взводить RCC_APB2ENR_SYSCFGEN перед настройкой альтернативных функций.

PS: STM32F050 имеет статус NRND. Вы часом не новое разрабатываете?


RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN; сделано. Просто упустили кидая кусок кода на форум sm.gif
Это одиночное изделие и посему этот проц (так как уже куплен) вполне подходит. От него кроме SPI для дисплея (кстати работает), внутреннего календаря и I2C для датчика температуры больше ничего не надо.
Go to the top of the page
 
+Quote Post
andron86
сообщение Jun 17 2014, 21:54
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 406
Регистрация: 1-03-06
Пользователь №: 14 821



Вам уже писали, запустите тупо пример от stm и посмотрите работает или нет, без своих добавок. У меня опыт был, что из за работающего таймера (pwm) и правда i2c не работал, нужно было коротко отключить pwm, включить i2c enable, и всё заработало. такие траблы. wacko.gif
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jun 18 2014, 05:00
Сообщение #6


Профессионал
*****

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



Из примеров I2C на сайте ST нашёл только это - http://www.st.com/web/en/catalog/tools/PF257886#
Там есть файл mems_eval_i2c.c - драйвер под какой-то MEMS на I2C.

Правда, оно для F0Discovery, там проц не совсем такой - F051 sad.gif

Сегодня проверим sm.gif


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Alien85
сообщение Jun 18 2014, 05:27
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 8-04-13
Пользователь №: 76 409



Что за стиль программирования такой?

Интерфейс настраивается регистрами, а управляется библиотечными функциями.

Какой в этом тайный смысл?

И ещё: учитесь пользоваться прерываниями.

Сообщение отредактировал Alien85 - Jun 18 2014, 06:50
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jun 18 2014, 06:41
Сообщение #8


Профессионал
*****

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



Цитата(Alien85 @ Jun 18 2014, 11:27) *
Какой в этом тайный смысл?

Разные люди писали sm.gif
Да и отладка ... Закончим отлаживать - подчистим sm.gif

Цитата(Alien85 @ Jun 18 2014, 11:27) *
И ещё: учитесь пользоваться DMA.

А зачем тут DMA, если не секрет? Для записи в датчик одного байта и чтения 2 байтов его ответа?
Тут дай Бог, чтобы оно вообще заработало ....


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Alien85
сообщение Jun 18 2014, 06:50
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 8-04-13
Пользователь №: 76 409



Цитата(hd44780 @ Jun 18 2014, 12:41) *
Разные люди писали sm.gif

krapula.gif

Цитата(hd44780 @ Jun 18 2014, 12:41) *
А зачем тут DMA, если не секрет? Для записи в датчик одного байта и чтения 2 байтов его ответа?
Тут дай Бог, чтобы оно вообще заработало ....

Упс... С dma ошибся, имел в виду прерывания.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 18 2014, 06:58
Сообщение #10


Гуру
******

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



Цитата(hd44780 @ Jun 18 2014, 12:41) *
Разные люди писали sm.gif

Неужто для поднятия одного I2C нужно несколько человек???
Или это из истории:
-За день I2C запустишь?
-Да, ноу проблем.
-А за два?
-Один не справлюсь - помощник нужен...
beer.gif
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jun 18 2014, 08:18
Сообщение #11


Профессионал
*****

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



Как поётся в одной советской песне - "Вдвоём вдвойне веселей" biggrin.gif


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 18 2014, 08:49
Сообщение #12


Гуру
******

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



У граждан ДНР ещё хватает времени заниматься I2C?
Go to the top of the page
 
+Quote Post
glags
сообщение Jun 18 2014, 10:58
Сообщение #13


Участник
*

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



Смотрю тут вместо помощи одна критика. То это ни так, то сё. Лучше бы помогли ценным советом чем базар разводить. Такое впечатление что тут не помагают, а просто набирают количество сообщений.
До прерываний тут ещё далеко, зашевелился бы хотябы сам интерфейс. После команды I2C_SendData ( I2C1, LM75_TEMP_Reg ); должно на ногах хоть что-то зашевелиться, а там глухо одни еденицы. По сему подозрение на неправильный конфиг I2C.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jun 18 2014, 11:19
Сообщение #14


Профессионал
*****

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



Цитата(jcxz @ Jun 18 2014, 14:49) *
У граждан ДНР ещё хватает времени заниматься I2C?


Да вот сижу, в окопе, пока доблестной укр армии а-ля Правый сектор не видать, дай думаю, I2C раздолбаю что-ли...

Сорри за оффтоп biggrin.gif .


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
smalcom
сообщение Jun 18 2014, 23:27
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Цитата
Из примеров I2C на сайте ST нашёл только это

чо-чо!? только?

> Примеры из библиотеки работают?
Прикрепленное изображение
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 00:46
Рейтинг@Mail.ru


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