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

 
 
> 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
 
Start new topic
Ответов
glags
сообщение Jun 19 2014, 19:26
Сообщение #2


Участник
*

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



Интерфейс наконец то ожил.
Но стопор получается после передачи номера регистра.
Код
    uint_fast16_t I2C(void)
    {   uint32_t i;
        while ((I2C1->ISR & I2C_ISR_TXE)==0);    //while TXE ==0, buffer is full
        // Задать адрес приёмника и длину данных
        i=I2C1->CR2;
        i &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP));
        i |= ((0x90 & I2C_CR2_SADD) | ((1 << 16 ) & I2C_CR2_NBYTES) | I2C_CR2_RELOAD | I2C_CR2_START);
        I2C1->CR2=i;
        while ( (I2C1 -> ISR & I2C_ISR_TXIS) == 0);
         I2C1->TXDR = 0;//Передача номера регистра для чтения из STLM75
         while ((I2C1->ISR & I2C_ISR_TCR)==0);//ждём окончание передачи
    i=I2C1->CR2;
    i &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN | I2C_CR2_START | I2C_CR2_STOP));
    i |= ((0x90 & I2C_CR2_SADD) | ((2 << 16 ) & I2C_CR2_NBYTES) | I2C_CR2_RELOAD | I2C_CR2_RD_WRN | I2C_CR2_START);
    I2C1->CR2=i;
    while ( ( I2C1 -> ISR & I2C_ISR_RXNE ) == 0);//Виснет ТУТ!!!!!!!!!!!!
    i=I2C1->RXDR;
     i<<=8;
     while ( ( I2C1 -> ISR & I2C_ISR_RXNE ) == 0);
    i |=I2C1->RXDR;
         I2C1->CR2|=(90<<0)|(1<<16)| I2C_CR2_RELOAD;    //address SLAVE 7bits
         I2C1->CR2 &=~ I2C_CR2_RD_WRN;  //write
         I2C1->CR2 |= I2C_CR2_STOP; // Stop Transmit
        while ( ( I2C1 -> ISR & I2C_ISR_STOPF ) == 0 );
        I2C1 -> ICR = I2C_ICR_STOPCF;
        return i;}

Ниже привожу осцилограмку жёлтый данные, а синий синхро.


Сообщение отредактировал glags - Jun 19 2014, 19:27
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2014, 07:05
Сообщение #3


Гуру
******

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



Сейчас почитаю описание датчика, а пока небольшое замечание по стию.
Вот такую конструкцию
Цитата(glags @ Jun 19 2014, 22:26) *
Код
        while ((I2C1->ISR & I2C_ISR_TXE)==0);    //while TXE ==0, buffer is full
я всегда пишу так:

Код
        while ((I2C1->ISR & I2C_ISR_TXE)==0)     //while TXE ==0, buffer is full
            ;
Это и нагляднее и гораздо меньше вероятность допустить ошибку добавляя в этот цикл, скажем, тестовое махание ногой. Точка с запятой в вашем варианте не бросается в глаза (а именно она является ключевым моментом этого цикла), ее можно забыть поставить или убрать и в цикл случайно попадет следующее выражение или наоборот оно случайно окажется за циклом.

Цитата(glags @ Jun 19 2014, 22:26) *
Интерфейс наконец то ожил.
И в чем была причина? Во-первых нам любопытно, а во вторых, возможно, когда-нибудь на это обсуждение набредет кто-то с точно такой же проблемой и, разумеется, будет рад за вас, но ему информация "наконец-то ожил" не поможет никак. А ведь он будет тратить время, читать ветку... Представляете как ему будет обидно за потраченное на бесполезное чтение время?

Цитата(hd44780 @ Jun 20 2014, 07:00) *
Да. Датчик. Когда его убирали физически, этого нет, обе линии в 1 возвращаются.
Этого не может быть, потому что не может быть никогда:
Цитата
The LM75 operates as a slave on the I2C bus, so the SCL line is an input (no clock is generated by the LM75) and the SDA line is a bi-directional serial data path.


Вы случаем на датчике SDA и SCL не перепутали?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- hd44780   STM32F050 I2C   Jun 17 2014, 18:14
- - smalcom   Примеры из библиотеки работают?   Jun 17 2014, 19:57
|- - glags   Цитата(smalcom @ Jun 17 2014, 22:57) Прим...   Jun 17 2014, 21:08
- - adnega   Я возможно не прав (поправьте меня), но вроде прин...   Jun 17 2014, 20:09
- - andron86   Вам уже писали, запустите тупо пример от stm и пос...   Jun 17 2014, 21:54
- - hd44780   Из примеров I2C на сайте ST нашёл только это - htt...   Jun 18 2014, 05:00
- - Alien85   Что за стиль программирования такой? Интерфейс на...   Jun 18 2014, 05:27
|- - hd44780   Цитата(Alien85 @ Jun 18 2014, 11:27) Како...   Jun 18 2014, 06:41
|- - Alien85   Цитата(hd44780 @ Jun 18 2014, 12:41) Разн...   Jun 18 2014, 06:50
|- - jcxz   Цитата(hd44780 @ Jun 18 2014, 12:41) Разн...   Jun 18 2014, 06:58
- - hd44780   Как поётся в одной советской песне - "Вдвоём ...   Jun 18 2014, 08:18
|- - jcxz   У граждан ДНР ещё хватает времени заниматься I2C?   Jun 18 2014, 08:49
|- - hd44780   Цитата(jcxz @ Jun 18 2014, 14:49) У гражд...   Jun 18 2014, 11:19
- - glags   Смотрю тут вместо помощи одна критика. То это ни т...   Jun 18 2014, 10:58
|- - Axel   Цитата(glags @ Jun 18 2014, 13:58) ...Луч...   Jun 19 2014, 04:34
|- - jcxz   Цитата(Axel @ Jun 19 2014, 10:34) Теперь ...   Jun 19 2014, 06:14
- - smalcom   ЦитатаИз примеров I2C на сайте ST нашёл только это...   Jun 18 2014, 23:27
|- - glags   Цитата(smalcom @ Jun 19 2014, 02:27) чо-ч...   Jun 19 2014, 07:19
|- - Axel   Цитата(glags @ Jun 19 2014, 10:19) 1) С р...   Jun 19 2014, 08:31
- - x893   Нет такого процессора у ST - STM32F050F4   Jun 19 2014, 08:00
- - hd44780   Та ну, нету.... А в ДШ есть - вложение. А вот зап...   Jun 19 2014, 08:16
|- - adnega   Цитата(hd44780 @ Jun 19 2014, 12:16) А во...   Jun 19 2014, 08:31
- - Golikov A.   а че такое SPL, простите? да я бы проверил все ф...   Jun 19 2014, 09:09
|- - scifi   Цитата(Golikov A. @ Jun 19 2014, 13:09) а...   Jun 19 2014, 09:25
|- - glags   Цитата(Golikov A. @ Jun 19 2014, 12:09) а...   Jun 19 2014, 10:55
- - Golikov A.   не допер дописать STM32 SPL, а по SPL такое выдает...   Jun 19 2014, 09:30
- - Сергей Борщ   Цитата(glags @ Jun 19 2014, 10:19) На 4,5...   Jun 19 2014, 11:34
|- - glags   Цитата(Сергей Борщ @ Jun 19 2014, 14:34) ...   Jun 19 2014, 11:49
|- - Сергей Борщ   Цитата(glags @ Jun 19 2014, 14:49) Вы име...   Jun 19 2014, 13:13
|- - glags   Цитата(Сергей Борщ @ Jun 19 2014, 16:13) ...   Jun 19 2014, 13:38
- - Axel   Так вроде I2C_CR1_SMBHEN (3-й бит в CR1) здесь не ...   Jun 19 2014, 12:20
|- - glags   Цитата(Axel @ Jun 19 2014, 15:20) Так вро...   Jun 19 2014, 12:56
- - Golikov A.   ЦитатаИ не двумя операциями - сбросом и установкой...   Jun 19 2014, 18:16
- - smalcom   >> Но стопор получается после передачи номер...   Jun 19 2014, 19:33
|- - glags   Цитата(smalcom @ Jun 19 2014, 22:33) ...   Jun 19 2014, 19:50
- - smalcom   >> Ниже привожу осцилограмку жёлтый данные, ...   Jun 19 2014, 21:09
|- - glags   Цитата(smalcom @ Jun 20 2014, 00:09) ...   Jun 20 2014, 03:59
- - hd44780   Да. Датчик. Когда его убирали физически, этого нет...   Jun 20 2014, 04:00
- - smalcom   Однако вселенная любит пошутить. У меня сейчас на ...   Jun 21 2014, 08:28
|- - Axel   Цитата(smalcom @ Jun 21 2014, 11:28) Одна...   Jun 21 2014, 08:55
- - smalcom   я её и не обвиняю. действительно, прочитал внимате...   Jun 21 2014, 10:20
|- - Axel   Цитата(smalcom @ Jun 21 2014, 13:20)   Jun 21 2014, 10:37
- - smalcom   По теме с "зажиманием" сигналов. Столкну...   Jun 23 2014, 07:49
- - Golikov A.   ЦитатаИ в чем была причина? Во-первых нам любопытн...   Jun 23 2014, 21:03
- - glags   Привет всем. Ну что господа, родил я код. Привожу...   Jun 24 2014, 14:44


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

 


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


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