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

 
 
> Проблемы по 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
 
Start new topic
Ответов
dimon_rub
сообщение Mar 4 2017, 15:46
Сообщение #2


Участник
*

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

Сообщений в этой теме
- 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
|- - 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 Текстовая версия Сейчас: 14th August 2025 - 01:42
Рейтинг@Mail.ru


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