20.11.2016, 16:58
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
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 но прерывания не срабатывают
|
|
|
|
21.11.2016, 13:09
|
|
Прохожий
Регистрация: 11.10.2006
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32F4 discovery не срабатывают прерывания по I2C
|
|
|
|
21.11.2016, 16:28
|
|
Прописка
Регистрация: 03.11.2010
Адрес: грязань
Сообщений: 153
Сказал спасибо: 58
Сказали Спасибо 74 раз(а) в 35 сообщении(ях)
|
Re: STM32F4 discovery не срабатывают прерывания по I2C
Сообщение от Kopranych
|
START зажигается флаг SB
|
Среда разработки? И не работает как: в отладке, или при старте на железе?
|
|
|
|
22.11.2016, 22:23
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM32F4 discovery не срабатывают прерывания по I2C
Среда разработки Keil, и не работает как в отладке так и при старте на железе ничего!
|
|
|
|
22.11.2016, 22:57
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,483
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: STM32F4 discovery не срабатывают прерывания по I2C
А где сам обработчик прерывания то?
|
|
|
|
23.11.2016, 20:44
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
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;
}
} |
|
|
|
|
23.11.2016, 20:45
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM32F4 discovery не срабатывают прерывания по I2C
Просто если прерывания не срабатывают зачем пока браться за обработчик
|
|
|
|
23.11.2016, 23:43
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,483
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: STM32F4 discovery не срабатывают прерывания по I2C
Ну так поставьте брекпоинт на входе в обработчик и запустите работу. По брекпоинту остановится в обработчике. Кстати, у вас там не висит ли в цикле ожидания свободной линии? Стопудово модуль I2C не был сброшен перед его настройкой и у него осталось состояние busy.
И еще один момент. Отладка запускается в RAM? Если да, то переключена ли таблица векторов прерываний в область RAM тоже?
Последний раз редактировалось NewWriter; 24.11.2016 в 09:22.
|
|
|
|
24.11.2016, 22:35
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM32F4 discovery не срабатывают прерывания по I2C
Сообщение от NewWriter
|
Кстати, у вас там не висит ли в цикле ожидания свободной линии? Стопудово модуль I2C не был сброшен перед его настройкой и у него осталось состояние busy.
|
Вы эту функцию имеете в виду I2C_DeInit(I2C1);?
Сообщение от NewWriter
|
И еще один момент. Отладка запускается в RAM? Если да, то переключена ли таблица векторов прерываний в область RAM тоже?
|
Можно подробнее этот момент объяснить я чет совсем не вкурсе, как понять где запускается отладка и как переключить таблицу прерываний?
|
|
|
|
29.11.2016, 20:55
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: STM32F4 discovery не срабатывают прерывания по I2C
Теперь датчик совсем не хочет отвечать код виснет в режиме подтверждения адреса и все тут:
Код:
|
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); |
Хотя я что то кардинальное в коде не менял. Может датчик сдох, потому что не отвечает даже на рабочей версии кода когда все без прерываний работало? Как проверить датчик у меня MPU6050 гироскоп?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:36.
|
|