Easyelectronics.ru

Электроника для всех
Текущее время: 24 апр 2018, 15:56

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: stm32f103 + ds3231
СообщениеДобавлено: 05 янв 2018, 17:51 
Только пришел

Зарегистрирован: 15 окт 2017, 15:22
Сообщения: 23
Решил поизучать I2C, и взял модуль DS3231 (http://g04.a.alicdn.com/kf/HTB14tAhKXXX ... Module.jpg)

Вот такой код получился
Код:
#include "stm32f10x.h"

// адрес 0x68 + 0
#define DS3231_ADDRESS      0xD0
#define DS3231_CONTROL_REG  0x0e

#define DS3231_SECONDS      0x00
#define DS3231_MINUTES      0x01
#define DS3231_HOURS        0x02
#define DS3231_DAY          0x03
#define DS3231_DATE         0x04
#define DS3231_MONTH        0x05
#define DS3231_YEAR         0x06

int main (void){
   RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN;
   RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;

   // PB6 SCL pin
   GPIOB->CRL|=GPIO_CRL_CNF6;
   GPIOB->CRL|=GPIO_CRL_MODE6;

   // PB7 SDA pin
   GPIOB->CRL|=GPIO_CRL_CNF7;
   GPIOB->CRL|=GPIO_CRL_MODE7;


   I2C1->CR1 = 0;
   I2C1->CR2 = 0;
   //
   // Установка стандартного режима (снятие бита)
   I2C1->CCR &= ~I2C_CCR_FS;

   // CCR = 40, это кол-во тактов APB1 на полупериод SCL (8МГц/100КГц/2)
   // TRISE = 9, это кол-во тактов APB1, через которое проверяется состояние SCL при переходе в откл. состояние (из 0 в 1),
   //            это время должно быть чуть больше 1 мкс (1мкс/(1/8МГц)+1)
   I2C1->CCR |= 40;
   I2C1->TRISE = 9;

   // Перевод в мастер режим
   I2C1->SR2 |= I2C_SR2_MSL;

   // Указание, что частота 8Mhz (01000)
   I2C1->CR2 |= I2C_CR2_FREQ_3;


   // Включить модуль
   I2C1->CR1 |= I2C_CR1_PE;


   // Работа с модулем
   uint32_t i, n=1000;

    while(1){
      (void) I2C1->SR1;
      (void) I2C1->SR2;

      // формирование сигнала старт
      I2C1->CR1 |= I2C_CR1_START;
      while (!(I2C1->SR1 & I2C_SR1_SB)){   }
      (void) I2C1->SR1;

      // передаем адрес ведомого
      I2C1->DR = DS3231_ADDRESS;
      while (!(I2C1->SR1 & I2C_SR1_ADDR)){  }
      (void) I2C1->SR1;
      (void) I2C1->SR2;

      // передаем адрес
      I2C1->DR = DS3231_SECONDS;
      while (!(I2C1->SR1 & I2C_SR1_BTF)){ }



      // формирование сигнала "Повторный Старт"
      I2C1->CR1 |= I2C_CR1_START;

      // ждем окончания формирования сигнала "Повторный Старт"
      while (!(I2C1->SR1 & I2C_SR1_SB)){   }
      (void) I2C1->SR1;

      // передаем адрес ведомого + чтение
      I2C1->DR = (DS3231_ADDRESS | 1);

      // ожидаем окончания передачи адреса
      while (!(I2C1->SR1 & I2C_SR1_ADDR)){  }
      (void) I2C1->SR1;
      (void) I2C1->SR2;

      // ожидаем окончания приема данных
      while (!(I2C1->SR1 & I2C_SR1_RXNE)){  }

      // cчитываем принятое значение
      uint8_t eeprom_data = I2C1->DR;

      // формирование сигнала "Стоп"
      I2C1->CR1 |= I2C_CR1_STOP;

      // Пауза
      i=0; while(i++<n);
    }

   return 0;
}


Происходит зависание после первого START в цикле
Код:
      while (!(I2C1->SR1 & I2C_SR1_SB)){   }


Поправьте меня, где я что не так понял/написал ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 05 янв 2018, 19:14 
Старожил

Зарегистрирован: 02 ноя 2015, 19:21
Сообщения: 336
Откуда: Санкт-Петербург
Честно говоря тема мне не знакома вообще, но погуглил и увидел что некоторые начинают так
I2C1->CR1 |= I2C_CR1_ACK;
while ((I2C1->SR2 & I2C_SR2_BUSY)==1);
и потом уже старт

viewtopic.php?f=35&t=9663


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 05 янв 2018, 19:35 
Только пришел

Зарегистрирован: 15 окт 2017, 15:22
Сообщения: 23
Atomic-dm писал(а):
Честно говоря тема мне не знакома вообще, но погуглил и увидел что некоторые начинают так
I2C1->CR1 |= I2C_CR1_ACK;
while ((I2C1->SR2 & I2C_SR2_BUSY)==1);
и потом уже старт

viewtopic.php?f=35&t=9663

Не помогло. И кажется проверка не правильная.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 05 янв 2018, 21:37 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1478
Код:
   // Перевод в мастер режим
   I2C1->SR2 |= I2C_SR2_MSL;

- этого делать не надо. Этот бит - только для чтения, в мастер-режим модуль переходит сам, как только вы сформируете старт-бит.

Если у вас виснет на формировании старт-бита, проверьте, что линия у вас подтянута к питанию и никто не мешает, удерживая линию в нуле


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 08 янв 2018, 19:33 
Только пришел

Зарегистрирован: 15 окт 2017, 15:22
Сообщения: 23
BusMaster писал(а):
Код:
   // Перевод в мастер режим
   I2C1->SR2 |= I2C_SR2_MSL;

- этого делать не надо. Этот бит - только для чтения, в мастер-режим модуль переходит сам, как только вы сформируете старт-бит.

Если у вас виснет на формировании старт-бита, проверьте, что линия у вас подтянута к питанию и никто не мешает, удерживая линию в нуле


цешкой померил, на SDA и SCL высокий уровень.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 08 янв 2018, 19:55 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 24 июл 2016, 00:07
Сообщения: 87
Вообще, I2C на F10x у меня вызывает... крайне негативные чувства и рассказать об этом модуле я могу только матом.
На всякий, если будут проблемы - почитайте тут http://www.st.com/content/ccc/resource/ ... 190234.pdf
Особенно страница 26.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 09 янв 2018, 21:54 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 11 апр 2012, 00:50
Сообщения: 160
У меня где-то в первых проектах валяется работа F100 с ds1338 на SPL. Могу завтра покопать если надо. Только предупреждаю - не то что "говнокод", "дерьмокод " полный, я тогда только начинал. Хотя и сейчас мои попытки программировать не блещут изяществом....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 10 янв 2018, 17:28 
Только пришел

Зарегистрирован: 15 окт 2017, 15:22
Сообщения: 23
SkyFort писал(а):
У меня где-то в первых проектах валяется работа F100 с ds1338 на SPL. Могу завтра покопать если надо. Только предупреждаю - не то что "говнокод", "дерьмокод " полный, я тогда только начинал. Хотя и сейчас мои попытки программировать не блещут изяществом....
Да, выложите код. Может что-то хорошее увижу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 10 янв 2018, 17:29 
Только пришел

Зарегистрирован: 15 окт 2017, 15:22
Сообщения: 23
Misaka10032 писал(а):
Вообще, I2C на F10x у меня вызывает... крайне негативные чувства и рассказать об этом модуле я могу только матом.
На всякий, если будут проблемы - почитайте тут http://www.st.com/content/ccc/resource/ ... 190234.pdf
Особенно страница 26.

Да, у меня похоже оно и есть.

Почитал тут: http://forum.easyelectronics.ru/viewtopic.php?f=35&t=23914&start=25 но и это не помогло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 10 янв 2018, 18:53 
Только пришел

Зарегистрирован: 15 окт 2017, 15:22
Сообщения: 23
Код:
   RCC->APB2ENR |= RCC_APB2ENR_IOPBEN ;

   // Включение альтернативных функций
   RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;

   // Включение тактирования I2C1
   RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;


   //
   I2C1->CR1 &= ~I2C_CR1_PE;

   GPIOB->CRL &= ~(GPIO_CRL_CNF6 | GPIO_CRL_CNF7);
   GPIOB->CRL |= GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;

   GPIOB->ODR |= GPIO_ODR_ODR6 | GPIO_ODR_ODR7;
   while(!(GPIOB->IDR &(GPIO_IDR_IDR6 | GPIO_IDR_IDR7)));

   GPIOB->ODR &= ~(GPIO_ODR_ODR7);
   while(GPIOB->IDR & GPIO_IDR_IDR7 );

   GPIOB->ODR &= ~(GPIO_ODR_ODR6);
   while(GPIOB->IDR & GPIO_IDR_IDR6);

   GPIOB->ODR |= GPIO_ODR_ODR6;
   while(!(GPIOB->IDR & GPIO_IDR_IDR6));

   GPIOB->ODR |= GPIO_ODR_ODR7;
   while(!(GPIOB->IDR & GPIO_IDR_IDR7));
   //

   // PB6 SCL pin
   GPIOB->CRL|=GPIO_CRL_CNF6; // alternate function open drain
   GPIOB->CRL|=GPIO_CRL_MODE6; // max speed 50MHz

   // PB7 SDA pin
   GPIOB->CRL|=GPIO_CRL_CNF7; // alternate function open drain
   GPIOB->CRL|=GPIO_CRL_MODE7; // max speed 50MHz



   I2C1->CR1 |= I2C_CR1_SWRST;
   I2C1->CR1 &= ~(I2C_CR1_SWRST);

        .....
        .....


сразу после
Цитата:
I2C1->CR1 &= ~(I2C_CR1_SWRST);
бит I2C_SR2_BUSY переходит в 1


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 10 янв 2018, 19:58 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 11 апр 2012, 00:50
Сообщения: 160
Roman1 писал(а):
Да, выложите код. Может что-то хорошее увижу.

Выкладывать сюда не буду. Слишком коряво, Отправил в личку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm32f103 + ds3231
СообщениеДобавлено: 11 янв 2018, 09:05 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 24 июл 2016, 00:07
Сообщения: 87
Roman1 писал(а):
сразу после
Цитата:
I2C1->CR1 &= ~(I2C_CR1_SWRST);
бит I2C_SR2_BUSY переходит в 1

Глянул у себя код - у меня практически так же, но попробуйте:
1. Тактирование I2C включать не сразу, а после настройки GPIO.
2. Сразу после включения тактирования - сброс(как раз set\reset SWRST);
3. Затем сделать
RCC->APB1RSTR |= RCC_APB1Periph_I2C1;
RCC->APB1RSTR &= ~ RCC_APB1Periph_I2C1;

А затем уже делать инит I2C, как обычно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: kos, Редиска, Sergey_spb


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB