Easyelectronics.ru

Электроника для всех
Текущее время: 21 июл 2018, 05:00

Часовой пояс: 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
Сообщения: 28
Решил поизучать 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
Сообщения: 373
Откуда: Санкт-Петербург
Честно говоря тема мне не знакома вообще, но погуглил и увидел что некоторые начинают так
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
Сообщения: 28
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
Сообщения: 1957
Код:
   // Перевод в мастер режим
   I2C1->SR2 |= I2C_SR2_MSL;

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

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


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

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

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

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


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


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

Зарегистрирован: 24 июл 2016, 00:07
Сообщения: 104
Вообще, 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
Сообщения: 28
SkyFort писал(а):
У меня где-то в первых проектах валяется работа F100 с ds1338 на SPL. Могу завтра покопать если надо. Только предупреждаю - не то что "говнокод", "дерьмокод " полный, я тогда только начинал. Хотя и сейчас мои попытки программировать не блещут изяществом....
Да, выложите код. Может что-то хорошее увижу.


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

Зарегистрирован: 15 окт 2017, 15:22
Сообщения: 28
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
Сообщения: 28
Код:
   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
Сообщения: 104
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 часов


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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