реклама на сайте
подробности

 
 
> Проблемы по I2C STM32F103RC
dimon_rub
сообщение Feb 26 2017, 09:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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]-для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - Obam   Хоть и ничего не понял, но вы не поверите: I2C на ...   Mar 1 2017, 09:02
|- - KnightIgor   Цитата(Obam @ Mar 1 2017, 11:02) Хоть и н...   Mar 1 2017, 09:40
|- - Obam   Цитата(KnightIgor @ Mar 1 2017, 13:40) О-...   Mar 1 2017, 09:57
|- - KnightIgor   Цитата(Obam @ Mar 1 2017, 10:57) T.e. для...   Mar 1 2017, 11:37
|- - Obam   Цитата(KnightIgor @ Mar 1 2017, 15:37) Не...   Mar 1 2017, 11:51
|- - 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
|- - scifi   Цитата(Obam @ Mar 1 2017, 14:51) А на 66 ...   Mar 1 2017, 14:59
|- - Obam   Цитата(scifi @ Mar 1 2017, 18:59) Мне дов...   Mar 1 2017, 19:43
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th August 2025 - 15:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016