Перейти к содержанию
    

Привет всем.

 

Пытаемся завести на данном проце термодатчик 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:

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Примеры из библиотеки работают?

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

 

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

 

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

 

RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN; сделано. Просто упустили кидая кусок кода на форум :)

Это одиночное изделие и посему этот проц (так как уже куплен) вполне подходит. От него кроме SPI для дисплея (кстати работает), внутреннего календаря и I2C для датчика температуры больше ничего не надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам уже писали, запустите тупо пример от stm и посмотрите работает или нет, без своих добавок. У меня опыт был, что из за работающего таймера (pwm) и правда i2c не работал, нужно было коротко отключить pwm, включить i2c enable, и всё заработало. такие траблы. :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Там есть файл mems_eval_i2c.c - драйвер под какой-то MEMS на I2C.

 

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

 

Сегодня проверим :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

Изменено пользователем Alien85

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Разные люди писали :)

Да и отладка ... Закончим отлаживать - подчистим :)

 

И ещё: учитесь пользоваться DMA.

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

Тут дай Бог, чтобы оно вообще заработало ....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разные люди писали :)

:krapula:

 

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

Тут дай Бог, чтобы оно вообще заработало ....

Упс... С dma ошибся, имел в виду прерывания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разные люди писали :)

Неужто для поднятия одного I2C нужно несколько человек???

Или это из истории:

-За день I2C запустишь?

-Да, ноу проблем.

-А за два?

-Один не справлюсь - помощник нужен...

:beer:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрю тут вместо помощи одна критика. То это ни так, то сё. Лучше бы помогли ценным советом чем базар разводить. Такое впечатление что тут не помагают, а просто набирают количество сообщений.

До прерываний тут ещё далеко, зашевелился бы хотябы сам интерфейс. После команды I2C_SendData ( I2C1, LM75_TEMP_Reg ); должно на ногах хоть что-то зашевелиться, а там глухо одни еденицы. По сему подозрение на неправильный конфиг I2C.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У граждан ДНР ещё хватает времени заниматься I2C?

 

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

> Примеры из библиотеки работают?

post-28718-1403134004_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...