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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблемы по 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
KnightIgor
сообщение Feb 26 2017, 12:56
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 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


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 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


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 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


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

Группа: Участник
Сообщений: 169
Регистрация: 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 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



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


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 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


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 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


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 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
Obam
сообщение Mar 1 2017, 14:43
Сообщение #16


Знающий
****

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



Всё, "надо брать!", в смысле, доделать лабкит на F103ZE. Заинтригован.


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


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Мне доводилось разгонять до 1 МГц smile3009.gif
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 1 2017, 19:43
Сообщение #18


Знающий
****

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



Цитата(scifi @ Mar 1 2017, 18:59) *
Мне доводилось разгонять до 1 МГц smile3009.gif

Мои искренние поздравления (:
6 постов назад было сообщено, что снижение частоты SCL вызывает проблемы...


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 08:45
Сообщение #19


Участник
*

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



Извиняюсь. Долго не был в сети. На скрине показано что откуда то появляется непонятные 255+ACK при этом если смотреть пошагово то это приходит в I2C2->DR. Не могу понять что это....
Прикрепленное изображение


По поводу частоты, здесь мне нужна однозначно 100КГц так как одно из устройств скофигурировано на нее. Так что 400 да же пробовать не хочется.
Попробую поллинг и отпишусь. Может у кого есть рабочий кусок работы с прерываниями. ЗАРАНЕЕ БЛОГОДАРЕН
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 4 2017, 09:33
Сообщение #20


Знающий
****

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



Вот так бы изначально и писали, что штатно подтверждены байты 255, а не DR=255+ACK.
Далее... по сигналлограмме криминалов не видно, каждый байт подтверждён (аппаратно - O'k): адрес ведомого сооответствует ему? адрес данных в ведомом подтверждён ведомым (вашей 24с16)? И если это чтение (судя по сигналлограмме), так может содержимое таково?


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


Участник
*

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



Цитата(Obam @ Mar 4 2017, 09:33) *
Вот так бы изначально и писали, что штатно подтверждены байты 255, а не DR=255+ACK.
Далее... по сигналлограмме криминалов не видно, каждый байт подтверждён (аппаратно - O'k): адрес ведомого сооответствует ему? адрес данных в ведомом подтверждён ведомым (вашей 24с16)? И если это чтение (судя по сигналлограмме), так может содержимое таково?


Да. Адресс ведомого по даташиту 0xA0. При чтении соответственно 0xA1. Читаем соответственно 1 байт в памяти. (Это M24C16 память). Очень смущает это 255+ACK. Ведь по идее этого быть не должно. Содержимое наверно таково и есть так как писать еще не пробовал и соответственно чистая память при инициализации может быть такова
Go to the top of the page
 
+Quote Post
MoskWin32
сообщение Mar 4 2017, 11:20
Сообщение #22





Группа: Участник
Сообщений: 8
Регистрация: 13-12-12
Пользователь №: 74 834



Цитата(dimon_rub @ Mar 4 2017, 12:48) *
и соответственно чистая память при инициализации может быть такова


так в datasheet же так и сказано:
Цитата
The device is delivered with all the memory array bits set to 1 (each byte contains FFh)
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 12:18
Сообщение #23


Участник
*

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



Цитата(MoskWin32 @ Mar 4 2017, 11:20) *
так в datasheet же так и сказано:


Это я увидел.
Пытаюсь поднять на поллинге че то нет падения SCL при старте....
CODE
void I2C_Initial(void)
{
I2C_InitTypeDef I2C_InitStructure;

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 = 0x01;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */

I2C_Cmd(I2C2, ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
}

void I2C_ByteWrite(u8* pBuffer, u8 WriteAddr)
{
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
WC_EEPROM_WRITE();
/* шлем старт */
I2C_GenerateSTART(I2C2, ENABLE);
/* ждем подтверждение */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS(I2C_ADDRESS_M24C16, I2C_MODE_WRITE), I2C_Direction_Transmitter);
/* ждем подтверждение */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* шлем адрес регистра */
I2C_SendData(I2C2, 0x01);
/* ждем окончания передачи */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* шлем данные */
I2C_SendData(I2C2, *pBuffer);
/* ждем */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* шлем стоп */
I2C_GenerateSTOP(I2C2, ENABLE);
WC_EEPROM_READ();
}

void I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
{
/* ждем пока шина не освободится */
while (I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
/* шлем старт */
I2C_GenerateSTART(I2C2, ENABLE);
//I2C2->CR1 |= CR1_START_Set;
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS(I2C_ADDRESS_M24C16, I2C_MODE_READ), I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* шлем адрес чтения */
I2C_SendData(I2C2, ReadAddr);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

/* шлем старт второй раз */
I2C_GenerateSTART(I2C2, ENABLE);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS(I2C_ADDRESS_M24C16, I2C_MODE_READ), I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* Пока есть что читать */
while (NumByteToRead)
{
if (NumByteToRead == 1)
{
I2C_AcknowledgeConfig(I2C2, DISABLE);
I2C_GenerateSTOP(I2C2, ENABLE);
}
if (I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
*pBuffer = I2C_ReceiveData(I2C2);
pBuffer++;
NumByteToRead--;
}
}
I2C_AcknowledgeConfig(I2C2, ENABLE);
}


Сообщение отредактировал IgorKossak - Mar 4 2017, 17:05
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 13:53
Сообщение #24


Участник
*

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



SCL появилось (БЫЛО ВКЛЮЧЕНО ТАКТИРОВАНИЕ USART3). Бьюсь дальше. Пишет вроде красиво, чтение пока хромает
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 15:46
Сообщение #25


Участник
*

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



Ну вроде все работает. Выкладываю код может кому пригодится.
Поллинг I2C M24C16.

CODE
void I2C_Initial(void)
{
I2C_InitTypeDef I2C_InitStructure;

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 = 0x01;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */
I2C_Cmd(I2C2, ENABLE);

I2C_Init(I2C2, &I2C_InitStructure);
}

void I2C_ByteWrite(u8* pBuffer, u8 WriteAddr)
{
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
WC_EEPROM_WRITE();
/* шлем старт */
I2C_GenerateSTART(I2C2, ENABLE);
/* ждем подтверждение */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS_M24C16, I2C_Direction_Transmitter);
/* ждем подтверждение */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* шлем адрес регистра */
I2C_SendData(I2C2, WriteAddr);
/* ждем окончания передачи */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* шлем данные */
I2C_SendData(I2C2, *pBuffer);
/* ждем */
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
/* шлем стоп */
I2C_GenerateSTOP(I2C2, ENABLE);
WC_EEPROM_READ();
}

void I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
{
/* ждем пока шина не освободится */
while (I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
/* шлем старт */
I2C_GenerateSTART(I2C2, ENABLE);
//I2C2->CR1 |= CR1_START_Set;
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS_M24C16, I2C_Direction_Transmitter);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* шлем адрес чтения */
I2C_SendData(I2C2, ReadAddr);
//I2C2->DR = 0x01;
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

///* Для очистки EV6 запускаем модуль снова */
//I2C_Cmd(I2C2, ENABLE);

/* шлем старт второй раз */
I2C_GenerateSTART(I2C2, ENABLE);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
/* шлем адрес */
I2C_Send7bitAddress(I2C2, I2C_ADDRESS_M24C16, I2C_Direction_Receiver);
while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

while (NumByteToRead)
{
if (NumByteToRead == 1)
{
I2C_AcknowledgeConfig(I2C2, DISABLE);
I2C_GenerateSTOP(I2C2, ENABLE);
}
if (I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
*pBuffer = I2C2->DR;
pBuffer++;
NumByteToRead--;
}
}
I2C_AcknowledgeConfig(I2C2, ENABLE);
}


Остался один вопрос. Или я уже не соображаю или ....
КАК обратится к ячейки памяти если максимальный адрес 0xFFF а у нас соответственно можно в функцию I2C_SendData
только 8 бит. Даже при передаче по 10бит не получается как то.

Сообщение отредактировал IgorKossak - Mar 4 2017, 17:05
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
Obam
сообщение Mar 4 2017, 18:41
Сообщение #26


Знающий
****

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



Цитата(dimon_rub @ Mar 4 2017, 19:46) *
Остался один вопрос. Или я уже не соображаю или ....
КАК обратится к ячейки памяти если максимальный адрес 0xFFF а у нас соответственно можно в функцию I2C_SendData
только 8 бит. Даже при передаче по 10бит не получается как то.

В выходные надо отдыхать... I2C байтовый интерфейс: "all addresses and data words are serially transmitted to and from the EEPROM in 8-bit words."


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


Знающий
****

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



Цитата(dimon_rub @ Mar 4 2017, 16:46) *
Остался один вопрос. Или я уже не соображаю или ....
КАК обратится к ячейки памяти если максимальный адрес 0xFFF а у нас соответственно можно в функцию I2C_SendData
только 8 бит. Даже при передаче по 10бит не получается как то.

Старшие биты идут в адрес устройства.
Go to the top of the page
 
+Quote Post
dimon_rub
сообщение Mar 4 2017, 22:16
Сообщение #28


Участник
*

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



ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ. В ближайщее время сделаю на прерываниях отпишусь
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 12:20
Рейтинг@Mail.ru


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