Перейти к содержанию
    

Проблемы по I2C STM32F103RC

Мне доводилось разгонять до 1 МГц :smile3009:

Мои искренние поздравления (:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

post-93282-1488616749_thumb.jpg

 

По поводу частоты, здесь мне нужна однозначно 100КГц так как одно из устройств скофигурировано на нее. Так что 400 да же пробовать не хочется.

Попробую поллинг и отпишусь. Может у кого есть рабочий кусок работы с прерываниями. ЗАРАНЕЕ БЛОГОДАРЕН

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так бы изначально и писали, что штатно подтверждены байты 255, а не DR=255+ACK.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так бы изначально и писали, что штатно подтверждены байты 255, а не DR=255+ACK.

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

 

Да. Адресс ведомого по даташиту 0xA0. При чтении соответственно 0xA1. Читаем соответственно 1 байт в памяти. (Это M24C16 память). Очень смущает это 255+ACK. Ведь по идее этого быть не должно. Содержимое наверно таково и есть так как писать еще не пробовал и соответственно чистая память при инициализации может быть такова

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

и соответственно чистая память при инициализации может быть такова

 

так в datasheet же так и сказано:

The device is delivered with all the memory array bits set to 1 (each byte contains FFh)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так в datasheet же так и сказано:

 

Это я увидел.

Пытаюсь поднять на поллинге че то нет падения SCL при старте....

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
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SCL появилось (БЫЛО ВКЛЮЧЕНО ТАКТИРОВАНИЕ USART3). Бьюсь дальше. Пишет вроде красиво, чтение пока хромает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поллинг I2C M24C16.

 

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
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Остался один вопрос. Или я уже не соображаю или ....

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

только 8 бит. Даже при передаче по 10бит не получается как то.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Остался один вопрос. Или я уже не соображаю или ....

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

только 8 бит. Даже при передаче по 10бит не получается как то.

Старшие биты идут в адрес устройства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...