|
Проблемы по I2C STM32F103RC |
|
|
|
Feb 26 2017, 09:42
|
Участник

Группа: Участник
Сообщений: 40
Регистрация: 10-09-16
Пользователь №: 93 282

|
Здравствуйте. Прошу помощи, бьюсь уже 3 день немого понять где проблема. Опрашиваю память M24C16 по I2C. Нет прерывания ДАЖЕ по старту. Код инициализации: CODE I2C_InitTypeDef I2C_InitStructure; NVIC_InitTypeDef NVIC_InitStruct;
I2C_DeInit(I2C2); I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //I2C_DutyCycle_16_9; I2C_InitStructure.I2C_OwnAddress1 = 0x04; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */
I2C_ITConfig(I2C2, I2C_IT_EVT, ENABLE); I2C_ITConfig(I2C2, I2C_IT_ERR, ENABLE);
I2C_Init(I2C2, &I2C_InitStructure); I2C_Cmd(I2C2, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = I2C2_EV_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); NVIC_EnableIRQ(I2C2_EV_IRQn); NVIC_SetPriority(I2C2_EV_IRQn, 0); //
NVIC_InitStruct.NVIC_IRQChannel = I2C2_ER_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); NVIC_EnableIRQ(I2C2_ER_IRQn); NVIC_SetPriority(I2C2_ER_IRQn, 1); //
Обработчик: CODE volatile uint16_t sr1 = I2C2->SR1; volatile uint16_t sr2 = I2C2->SR2; if (!(sr2 & I2C_SR2_MSL)) return;
if( sr1 & I2C_SR1_SB) //принят ответ ACK, отправка адресса { i2c_state = I2C_SEND_ADR_DEV; I2C2->DR = (uint16_t) i2c_buffer.device_adr; }
if(sr1 & I2C_SR1_TXE) //принят ответ ACK, данных и стоп { switch (i2c_state) { case I2C_SEND_ADR_DEV: i2c_state = I2C_SEND_ADR_MEM; I2C2->DR = (uint16_t) i2c_buffer.start_adr; break; case I2C_SEND_ADR_MEM:
if( i2c_buffer.pos_head < i2c_buffer.pos_tail && i2c_buffer.pos_head < i2c_buffer.len) { i2c_state = I2C_SEND_DATA; I2C1->DR = i2c_buffer.buffer[i2c_buffer.pos_head]; i2c_buffer.pos_head++; } else { i2c_buffer.pos_tail = 0; i2c_buffer.pos_head = 0; i2c_state = I2C_EMPTY; I2C1->CR1 |= I2C_CR1_STOP; //если закончилась то стоп } break; case I2C_SEND_DATA: i2c_state = I2C_SEND_ADR_MEM; I2C2->DR = (uint16_t) i2c_buffer.start_adr; i2c_buffer.start_adr++; break; default: break; } } if( sr1 & I2C_SR1_RXNE ) //прерывание по чтению { switch (i2c_state) { case I2C_SEND_ADR_DEV: i2c_state = I2C_SEND_ADR_MEM; I2C2->DR = (uint16_t) i2c_buffer.start_adr; break; case I2C_SEND_ADR_MEM: i2c_state = I2C_SEND_ADR_DEV2; I2C2->DR = (uint16_t) i2c_buffer.device_adr; break; case I2C_SEND_ADR_DEV2: if(i2c_buffer.pos_tail < i2c_buffer.len) { i2c_state = I2C_RECEIVE_DATA; i2c_buffer.buffer[i2c_buffer.pos_tail] = I2C2->DR; i2c_buffer.pos_tail++; } else { i2c_state = I2C_EMPTY; I2C1->CR1 |= I2C_CR1_STOP; //если закончилась то стоп } break; case I2C_RECEIVE_DATA: if(i2c_buffer.pos_tail < i2c_buffer.len) { i2c_state = I2C_RECEIVE_DATA; i2c_buffer.buffer[i2c_buffer.pos_tail] = I2C2->DR; i2c_buffer.pos_tail++; } else { i2c_state = I2C_EMPTY; I2C1->CR1 |= I2C_CR1_STOP; //если закончилась то стоп } break; default: break; } }
ПОМОГИТЕ!!!!!!!!
Сообщение отредактировал IgorKossak - Feb 28 2017, 10:41
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!
|
|
|
|
|
 |
Ответов
|
Mar 1 2017, 09:40
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Obam @ Mar 1 2017, 11:02)  Хоть и ничего не понял, но вы не поверите: I2C на частотах меньших предельной хуже работать не станет (; О-о, я бы не зарекался, когда дело касается I2C на F1xx... Я из своего опыта об этом писал уже. Кстати, как сейчас заметил, писал в аналогичной теме нынешнего ТС. Уважаемый dimon_rub, почему Вы не продолжили в Вашей же более ранней теме?
|
|
|
|
|
Mar 1 2017, 09:57
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(KnightIgor @ Mar 1 2017, 13:40)  О-о, я бы не зарекался, когда дело касается I2C на F1xx... Я из своего опыта об этом писал уже. Кстати, как сейчас заметил, писал в аналогичной теме нынешнего ТС. Уважаемый dimon_rub, почему Вы не продолжили в Вашей же более ранней теме? T.e. для F103 существует фиксированная частота SCL и при том близкая к предельной (да, рассматриваем стандартную 400 кГц)?
--------------------
Пролетарий умственного труда.
|
|
|
|
Сообщений в этой теме
dimon_rub Проблемы по I2C STM32F103RC Feb 26 2017, 09:42 KnightIgor Цитата(dimon_rub @ Feb 26 2017, 11:42) Зд... Feb 26 2017, 12:56 dimon_rub Цитата(KnightIgor @ Feb 26 2017, 12:56) 1... Feb 26 2017, 14:51 dimon_rub Цитата(KnightIgor @ Feb 26 2017, 12:56) 1... Feb 26 2017, 21:10 Aleksandr Baranov А выводы где-то сконфигурированы? Feb 27 2017, 00:48 jorikdima подтяжки линий к 1 на плате есть? Feb 27 2017, 05:39 dimon_rub Да есть решили с помощью осцелографа и такой то ма... Feb 28 2017, 21:37     KnightIgor Цитата(Obam @ Mar 1 2017, 12:51) А на 66 ... Mar 1 2017, 13:39      Obam Цитата(KnightIgor @ Mar 1 2017, 17:39) - ... Mar 1 2017, 14:10       Сергей Борщ QUOTE (Obam @ Mar 1 2017, 16:10) Но разве... Mar 1 2017, 14:36 Obam Всё, "надо брать!", в смысле, додела... Mar 1 2017, 14:43 dimon_rub Извиняюсь. Долго не был в сети. На скрине показано... Mar 4 2017, 08:45 Obam Вот так бы изначально и писали, что штатно подтвер... Mar 4 2017, 09:33 dimon_rub Цитата(Obam @ Mar 4 2017, 09:33) Вот так ... Mar 4 2017, 09:48  MoskWin32 Цитата(dimon_rub @ Mar 4 2017, 12:48) и с... Mar 4 2017, 11:20   dimon_rub Цитата(MoskWin32 @ Mar 4 2017, 11:20) так... Mar 4 2017, 12:18 dimon_rub SCL появилось (БЫЛО ВКЛЮЧЕНО ТАКТИРОВАНИЕ USART3).... Mar 4 2017, 13:53 dimon_rub Ну вроде все работает. Выкладываю код может кому п... Mar 4 2017, 15:46 Obam Цитата(dimon_rub @ Mar 4 2017, 19:46) Ост... Mar 4 2017, 18:41 KnightIgor Цитата(dimon_rub @ Mar 4 2017, 16:46) Ост... Mar 4 2017, 18:42 dimon_rub ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ. В ближайщее время... Mar 4 2017, 22:16
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|