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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблемы по I2C STM32F103RC
dimon_rub
сообщение Feb 26 2017, 09:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 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
KnightIgor
сообщение Feb 26 2017, 12:56
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 610
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(dimon_rub @ Feb 26 2017, 11:42) *
Здравствуйте. Прошу помощи, бьюсь уже 3 день немого понять где проблема. Опрашиваю память M24C16 по I2C. Нет прерывания ДАЖЕ по старту.

1. Не включено тактирование I2C2. Может где в другом месте включается, но между строк я читать не умею. I2C_Init() это не делает, AFAIK.
2. I2C_ITConfig(I2C2, I2C_IT_EVT, ENABLE) надо бы делать после I2C_Init().

Это навскидку.
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Feb 26 2017, 14:51
Сообщение #3


Участник
*

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



Цитата(KnightIgor @ Feb 26 2017, 12:56) *
1. Не включено тактирование I2C2. Может где в другом месте включается, но между строк я читать не умею. I2C_Init() это не делает, AFAIK.
2. I2C_ITConfig(I2C2, I2C_IT_EVT, ENABLE) надо бы делать после I2C_Init().

Это навскидку.


Тактирование есть.
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
А вот за это спасибо. попробую.
Может еще что то.
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Feb 26 2017, 21:10
Сообщение #4


Участник
*

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



Цитата(KnightIgor @ Feb 26 2017, 12:56) *
1. Не включено тактирование I2C2. Может где в другом месте включается, но между строк я читать не умею. I2C_Init() это не делает, AFAIK.
2. I2C_ITConfig(I2C2, I2C_IT_EVT, ENABLE) надо бы делать после I2C_Init().

Это навскидку.


I2C_ITConfig(I2C2, I2C_IT_EVT, ENABLE) надо бы делать после I2C_Init(). НЕПОМОГАЕТ
Go to the top of the page
 
+Quote Post
Aleksandr Barano...
сообщение Feb 27 2017, 00:48
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118



А выводы где-то сконфигурированы?


--------------------
ASB
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Feb 27 2017, 05:39
Сообщение #6


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 140
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



подтяжки линий к 1 на плате есть?
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Feb 28 2017, 21:37
Сообщение #7


Участник
*

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



Да есть решили с помощью осцелографа и такой то матери. ВСЕМ СПАСИБО.
Появилясь другая. Работа осщуствляется с памятью M24C16 в посылках при чтении появляется,
Это видно и на осцелографе и в трасировке. Невного переделал код прерывания.

CODE

void I2C2_EV_IRQHandler(void)
{
volatile uint16_t sr1 = I2C2->SR1;
volatile uint16_t sr2 = I2C2->SR2;
if (!(sr2 & I2C_SR2_MSL)) return;

if( sr1 & I2C_SR1_SB) //принят ответ ACK, отправка адресса
{
if (i2c_state == I2C_SEND_START) i2c_state = I2C_SEND_ADR_DEV;
else i2c_state = I2C_SEND_ADR_DEV2;
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_ADR_MEM; //I2C_SEND_DATA
I2C2->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;
I2C2->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_START_SECOND;
//i2c_state = I2C_SEND_ADR_DEV2;
//I2C2->DR = (uint16_t) i2c_buffer.device_adr;
I2C_GenerateSTART(I2C2, ENABLE);
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;
I2C2->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;
I2C2->CR1 |= I2C_CR1_STOP; //если закончилась то стоп
}
break;
default:
break;
}
}
}



Извиняюсь появляется значение DR=255 + ACK

Есть подозрение что это из-за того что работаем на 100kHz а не на 400. Проверить небыло времени. Кто что думает. Спасибо. Как проверю - отпишусь

Извиняюсь за плохое форматирование текста

Сообщение отредактировал IgorKossak - Mar 3 2017, 19:17
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 1 2017, 09:02
Сообщение #8


Местный
***

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



Хоть и ничего не понял, но вы не поверите: I2C на частотах меньших предельной хуже работать не станет (;

"DR=255 + ACK" - это сколько? 256? в байте?

Сообщение отредактировал Obam - Mar 1 2017, 09:03


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 1 2017, 09:40
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 610
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Obam @ Mar 1 2017, 11:02) *
Хоть и ничего не понял, но вы не поверите: I2C на частотах меньших предельной хуже работать не станет (;

О-о, я бы не зарекался, когда дело касается I2C на F1xx... Я из своего опыта об этом писал уже. Кстати, как сейчас заметил, писал в аналогичной теме нынешнего ТС. Уважаемый dimon_rub, почему Вы не продолжили в Вашей же более ранней теме?
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 1 2017, 09:57
Сообщение #10


Местный
***

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



Цитата(KnightIgor @ Mar 1 2017, 13:40) *
О-о, я бы не зарекался, когда дело касается I2C на F1xx... Я из своего опыта об этом писал уже. Кстати, как сейчас заметил, писал в аналогичной теме нынешнего ТС. Уважаемый dimon_rub, почему Вы не продолжили в Вашей же более ранней теме?

T.e. для F103 существует фиксированная частота SCL и при том близкая к предельной (да, рассматриваем стандартную 400 кГц)?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 1 2017, 11:37
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 610
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Obam @ Mar 1 2017, 10:57) *
T.e. для F103 существует фиксированная частота SCL и при том близкая к предельной (да, рассматриваем стандартную 400 кГц)?

Нет. Дело в другом: при переходе на 100kHz выползают состояния автомата I2C, а именно - комбинации битов флагов, - которые не описаны в документации и не предусмотрены STL, не ручаюсь за Cube. В результате обработчик прерывания, беспроблемно обслуживающий на 400kHz, вдруг затыкается на 100kHz.
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 1 2017, 11:51
Сообщение #12


Местный
***

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



Цитата(KnightIgor @ Mar 1 2017, 15:37) *
Нет. Дело в другом: при переходе на 100kHz выползают состояния автомата I2C, а именно - комбинации битов флагов, - которые не описаны в документации и не предусмотрены STL, не ручаюсь за Cube. В результате обработчик прерывания, беспроблемно обслуживающий на 400kHz, вдруг затыкается на 100kHz.

А на 66 кГц, к примеру?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Mar 1 2017, 13:39
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 610
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Obam @ Mar 1 2017, 12:51) *
А на 66 кГц, к примеру?

- Вы умеете играть на скрипке?
- Не знаю: не пробовал.
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 1 2017, 14:10
Сообщение #14


Местный
***

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



Цитата(KnightIgor @ Mar 1 2017, 17:39) *
- Вы умеете играть на скрипке?
- Не знаю: не пробовал.

Мы поняли друг-друга (:
Но разве I2C_CCR[11..0] (делитель частоты) может влиять на логику I2C-автомата

Сообщение отредактировал Obam - Mar 1 2017, 14:10


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 1 2017, 14:36
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 7 832
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Obam @ Mar 1 2017, 16:10) *
Но разве I2C_CCR[11..0] (делитель частоты) может влиять на логику I2C-автомата
Там, помнится, одним из битов выбирается режим - быстро или медленно. И в зависимости от режима формируются разные временнЫе диаграммы при одних и тех же уставках в регистрах времянок. Т.е. если не работет на 100 кГц, то точно также, только чуть медленнее не будет работать и на 66.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th March 2017 - 22:28
Рейтинг@Mail.ru


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