Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 20.11.2016, 16:58  
Kopranych
Частый гость
 
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
Kopranych на пути к лучшему
По умолчанию STM32F4 discovery не срабатывают прерывания по I2C

Работая по шине i2c в режиме ожидания флагов контроллер получает данные. Решил сделать работу на прерываниях но после генерации условия START прерывания не происходит программа выполняется дальше. Может неправильная инициализация? Подскажите кто знает.
Код:
Нажмите, чтобы открыть спойлер
Код:
void I2C_init(void)
{
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//тактируем пины для i2c
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);//тактируем сам i2c
   //--------------------------------------------
   GPIO_InitTypeDef busi2c;//создаем структуры 
   I2C_InitTypeDef i2c;//для инициализации
   //------------------------------------
   i2c.I2C_ClockSpeed = 100000;//100kHz
   i2c.I2C_Mode = I2C_Mode_I2C;
  i2c.I2C_DutyCycle = I2C_DutyCycle_2;
  i2c.I2C_OwnAddress1 = OWNADRESS;
  i2c.I2C_Ack = I2C_Ack_Enable;
  i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_Init(I2C1, &i2c);
   //---------------------------------------
   busi2c.GPIO_Pin = BUS_SCL|BUS_SDA;
   busi2c.GPIO_Mode = GPIO_Mode_AF;
   busi2c.GPIO_Speed = GPIO_Speed_2MHz;
   busi2c.GPIO_OType = GPIO_OType_OD;
   busi2c.GPIO_PuPd = GPIO_PuPd_UP;
   GPIO_Init(GPIOB, &busi2c);
   //---------------------------------------------
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);//включаем альтернативные 
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);//функции ножек
   //----------------------------------------------
   I2C_Cmd(I2C1, ENABLE);//включаем модуль i2c
   
}

void init_IT_i2c(void)
{

   NVIC_InitTypeDef IT_i2c;
   
   IT_i2c.NVIC_IRQChannel = I2C1_EV_IRQn;//прерывания по событию
   IT_i2c.NVIC_IRQChannelPreemptionPriority = 0;//приоритет прерывания чем ниже значение тем выше приоритет
   IT_i2c.NVIC_IRQChannelSubPriority = 0;//Sub приоритет прерывания чем ниже значение тем выше приоритет
   IT_i2c.NVIC_IRQChannelCmd = ENABLE;//включение параметра канала прерывания
   NVIC_Init(&IT_i2c);//инициализируем прерывание

   IT_i2c.NVIC_IRQChannel = I2C1_ER_IRQn;//прерывания по ошибке
   IT_i2c.NVIC_IRQChannelPreemptionPriority = 0;//приоритет прерывания чем ниже значение тем выше приоритет
   IT_i2c.NVIC_IRQChannelSubPriority = 0;//Sub приоритет прерывания чем ниже значение тем выше приоритет
   IT_i2c.NVIC_IRQChannelCmd = ENABLE;//включение параметра канала прерывания
   NVIC_Init(&IT_i2c);

   
   I2C_ITConfig(I2C1, I2C_IT_EVT, ENABLE);//включили прерывания по событию
   I2C_ITConfig(I2C1, I2C_IT_ERR, ENABLE);//включили прерывания по ошибке

}

void I2C_start_IT(void)
{
   // ждем освобождения шины
  while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
   I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);//включаем прерывания для буфера приема и передачи
   I2C_GenerateSTART(I2C1, ENABLE);//генерируем старт
}

После генерации START зажигается флаг SB но прерывания не срабатывают
Реклама:
Kopranych вне форума  
Непрочитано 21.11.2016, 13:09  
vasyl_gry
Прохожий
 
Регистрация: 11.10.2006
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
vasyl_gry на пути к лучшему
По умолчанию Re: STM32F4 discovery не срабатывают прерывания по I2C

См. https://github.com/MaJerle/stm32f429
vasyl_gry вне форума  
Непрочитано 21.11.2016, 16:28  
R360
Прописка
 
Регистрация: 03.11.2010
Адрес: грязань
Сообщений: 153
Сказал спасибо: 58
Сказали Спасибо 74 раз(а) в 35 сообщении(ях)
R360 на пути к лучшему
По умолчанию Re: STM32F4 discovery не срабатывают прерывания по I2C

Сообщение от Kopranych Посмотреть сообщение
START зажигается флаг SB
Среда разработки? И не работает как: в отладке, или при старте на железе?
R360 вне форума  
Непрочитано 22.11.2016, 22:23  
Kopranych
Частый гость
 
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
Kopranych на пути к лучшему
По умолчанию Re: STM32F4 discovery не срабатывают прерывания по I2C

Среда разработки Keil, и не работает как в отладке так и при старте на железе ничего!
Kopranych вне форума  
Непрочитано 22.11.2016, 22:57  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,490
Сказал спасибо: 401
Сказали Спасибо 2,216 раз(а) в 1,314 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: STM32F4 discovery не срабатывают прерывания по I2C

А где сам обработчик прерывания то?
NewWriter вне форума  
Непрочитано 23.11.2016, 20:44  
Kopranych
Частый гость
 
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
Kopranych на пути к лучшему
По умолчанию Re: STM32F4 discovery не срабатывают прерывания по I2C

Обработчик я еще ладом не делал есть только вот такое
Нажмите, чтобы открыть спойлер
Код:
void I2C1_EV_IRQHandler(void)
{
    switch(I2C_GetLastEvent(I2C1))
    {
    case I2C_EVENT_MASTER_MODE_SELECT:
				I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);//включаем прерывания для буффера приема и передачи
				i2c_send_adress(MPU_6050_ADDRESS_W, I2C_Direction_Transmitter);//отправляем адрес модуля на запись			
        break;
    case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED:
				I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);//включаем прерывания для буффера приема и передачи
        I2C_tranciv_byte(TEMP_OUT_H);//отправляем адрес регистра откуда будем читать данные
        break;
    case I2C_EVENT_MASTER_BYTE_TRANSMITTING:
  //     I2C_start();
        break;
  }

 }
Kopranych вне форума  
Непрочитано 23.11.2016, 20:45  
Kopranych
Частый гость
 
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
Kopranych на пути к лучшему
По умолчанию Re: STM32F4 discovery не срабатывают прерывания по I2C

Просто если прерывания не срабатывают зачем пока браться за обработчик
Kopranych вне форума  
Непрочитано 23.11.2016, 23:43  
NewWriter
Почётный гражданин KAZUS.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,490
Сказал спасибо: 401
Сказали Спасибо 2,216 раз(а) в 1,314 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: STM32F4 discovery не срабатывают прерывания по I2C

Ну так поставьте брекпоинт на входе в обработчик и запустите работу. По брекпоинту остановится в обработчике. Кстати, у вас там не висит ли в цикле ожидания свободной линии? Стопудово модуль I2C не был сброшен перед его настройкой и у него осталось состояние busy.

И еще один момент. Отладка запускается в RAM? Если да, то переключена ли таблица векторов прерываний в область RAM тоже?

Последний раз редактировалось NewWriter; 24.11.2016 в 09:22.
NewWriter вне форума  
Непрочитано 24.11.2016, 22:35  
Kopranych
Частый гость
 
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
Kopranych на пути к лучшему
По умолчанию Re: STM32F4 discovery не срабатывают прерывания по I2C

Сообщение от NewWriter Посмотреть сообщение
Кстати, у вас там не висит ли в цикле ожидания свободной линии? Стопудово модуль I2C не был сброшен перед его настройкой и у него осталось состояние busy.
Вы эту функцию имеете в виду I2C_DeInit(I2C1);?

Сообщение от NewWriter Посмотреть сообщение
И еще один момент. Отладка запускается в RAM? Если да, то переключена ли таблица векторов прерываний в область RAM тоже?
Можно подробнее этот момент объяснить я чет совсем не вкурсе, как понять где запускается отладка и как переключить таблицу прерываний?
Kopranych вне форума  
Непрочитано 29.11.2016, 20:55  
Kopranych
Частый гость
 
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
Kopranych на пути к лучшему
По умолчанию Re: STM32F4 discovery не срабатывают прерывания по I2C

Теперь датчик совсем не хочет отвечать код виснет в режиме подтверждения адреса и все тут:
Код:
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
Хотя я что то кардинальное в коде не менял. Может датчик сдох, потому что не отвечает даже на рабочей версии кода когда все без прерываний работало? Как проверить датчик у меня MPU6050 гироскоп?
Kopranych вне форума  
 

Закладки

Метки
i2c, stm32f4discovery
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SDIO на STM32F4 Discovery TmYAG ARM 4 12.10.2016 11:21
I2C как правильно использовать в stm32f4 bass1981 ARM 65 28.05.2016 22:16
Внешние прерывания Stm32f4 bass1981 ARM 11 28.05.2014 23:12
AT89C5131 прием и передача данных по USB rihkov AVR 14 15.11.2012 08:16
Вход в прерывания для PIC микроконтроллеров dimmich Микроконтроллеры, АЦП, память и т.д 4 06.12.2009 17:17


Часовой пояс GMT +4, время: 06:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot